忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)

access vba でWordを起動しWordファイルを読込んだ後で、ファイルを保存する時に読込みファイル名に日付と時刻を自動で 付加する件で、以下の記事を載せましたが、今回はそれのクラス化を行い、どのフォームからも利用できる様にします。

access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)

基本的には前回の記事のソースをそのまま持ってきてクラス化していますが、以下の関数を追加しています。

  • WordOpen : Word文書オープン処理
  • WordDisplay : Word文書表示処理
  • WordClose : Word文書クローズ処理

尚、クラス生成時には内部的にWordApplicationオブジェクトを設定しています。
では、以下にそのソース全体を示します。

基本Word処理用クラス:以下のソースをクラスモジュール(clsWord)として宣言

Option Compare Database
Option Explicit

' Wordオブジェクト
Private WithEvents WordApp As Word.Application

' Word.Documentオブジェクト
Private WordDoc As Word.Document


'------------------------------------------------------------------------------
' クラス初期化時処理
'------------------------------------------------------------------------------
Private Sub Class_Initialize()
    'word起動
    Set WordApp = CreateObject("Word.application")
End Sub

'------------------------------------------------------------------------------
' Word・保存前イベント処理
'------------------------------------------------------------------------------
Private Sub WordApp_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean)
    Dim strPath As String

    '日付・時刻を[yyyymmdd-hhnnss-]形式でファイル名の先頭に付加
    strPath = Doc.path & "\" & format$(Now, "yyyymmdd-hhnnss-") & Doc.name

    '自分で新しいファイル名でDialogを呼出す
    With WordApp.Dialogs(wdDialogFileSaveAs)
        .name = strPath
        .Show
    End With

    '通常のDialogの非表示
    Cancel = True
End Sub

'------------------------------------------------------------------------------
' Word・終了イベント処理
'------------------------------------------------------------------------------
Private Sub WordApp_Quit()
    'Wordオブジェクト解放
    Set WordDoc = Nothing
    Set WordApp = Nothing
End Sub

'******************************************************************************
' Word文書オープン処理
'******************************************************************************
' 関数名 : WordOpen()
' 引数   : P_strFileName          'Word文書ファイル名
'       : P_blnVisible           '初期表示フラグ
'******************************************************************************
Public Sub WordOpen(ByVal P_strFileName As String, ByVal P_blnVisible As Boolean)
    On Error GoTo Err_WordOpen
    
    'word起動
    If WordApp Is Nothing Then
        Call Class_Initialize
    End If
    
    'ワードファイルを読み込み、文章を編集する状態にする
    Set WordDoc = WordApp.Documents.Open(P_strFileName) '編集モードで開く
    
    If P_blnVisible = True Then
        'Word文書表示処理
        Call WordDisplay
    End If

Exit_WordOpen:
    Exit Sub

Err_WordOpen:
    MsgBox Err.Description
    Resume Exit_WordOpen
End Sub

'******************************************************************************
' Word文書表示処理
'******************************************************************************
' 関数名 : WordDisplay()
'******************************************************************************
Public Sub WordDisplay()
    On Error GoTo Err_WordDisplay
    
    WordApp.Visible = True
    WordApp.Activate

Exit_WordDisplay:
    Exit Sub

Err_WordDisplay:
    MsgBox Err.Description
    Resume Exit_WordDisplay
End Sub

'******************************************************************************
' Word文書クローズ処理
'******************************************************************************
' 関数名 : WordClose()
'******************************************************************************
Public Sub WordClose()
    On Error GoTo Err_WordClose
    
    'word閉じる
    If Not WordDoc Is Nothing Then
        'ドキュメントをSAVE無しで閉じる
        WordDoc.Close False
        Set WordDoc = Nothing
        
        'Wordを閉じる
        WordApp.Quit
        Set WordApp = Nothing
    End If
    
Exit_WordClose:
    Exit Sub

Err_WordClose:
    MsgBox Err.Description
    Resume Exit_WordClose
End Sub

このクラスを使用する例として、access フォームに1個のボタンのみを設置し、そのクリックイベントでワード文書を開く様にしてみます。

基本Word処理用クラスの使用例

Option Compare Database

' クラスWordオブジェクト
Private mclsWord As clsWord

'------------------------------------------------------------------------------
' フォームロード時イベント
'------------------------------------------------------------------------------
Private Sub Form_Load()
    Set mclsWord = New clsWord
End Sub

'------------------------------------------------------------------------------
' フォームクローズイベント
'------------------------------------------------------------------------------
Private Sub Form_Close()
    'ワードクローズ
    mclsWord.WordClose
    'Wordオブジェクト解放
    Set mclsWord = Nothing
End Sub

'------------------------------------------------------------------------------
' コマンド1開始
'------------------------------------------------------------------------------
Private Sub コマンド1_Click()
    Dim strPath As String
    'ワードファイルを読み込み、文章を編集する状態にする
    strPath = Application.CurrentProject.path & "\" & "sample.docx"
    'ワードファイルを読込み編集状態で表示する
    mclsWord.WordOpen strPath, True
End Sub

上記のソースでの注意点は、クラスWordオブジェクトの変数をフォームの静的変数として宣言しているところです。
なぜならば、コマンドボタンでワードを起動した後で、本クラス内での保存前イベント処理(DocumentBeforeSave)が起こらなくなるからです。 後は、フォームのクローズ時には後片付けも必要になります。

このWord用クラスに各種の関数を追加すれば、いろんな用途に使えると思います。 今後は便利な関数をこのクラスに追加する予定です。

関連する記事

access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)

おすすめ本

PR

コメント

コメントを書く