access vba でWordを起動しWordファイルを読込んだ後で、ファイルを保存する時に読込みファイル名に日付と時刻を自動で 付加する件で、以下の記事を載せましたが、今回はそれのクラス化を行い、どのフォームからも利用できる様にします。
⇒access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
基本的には前回の記事のソースをそのまま持ってきてクラス化していますが、以下の関数を追加しています。
- WordOpen : Word文書オープン処理
- WordDisplay : Word文書表示処理
- WordClose : Word文書クローズ処理
尚、クラス生成時には内部的にWordApplicationオブジェクトを設定しています。
では、以下にそのソース全体を示します。
基本Word処理用クラス:以下のソースをクラスモジュール(clsWord)として宣言
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | 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処理用クラスの使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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用クラスに各種の関数を追加すれば、いろんな用途に使えると思います。 今後は便利な関数をこのクラスに追加する予定です。
これは永続使用なので更新の必要がありませんし、2台のPCまではインストール可能です。マイクロソフトの Excel, Word を使用するならば必要ですね。
関連する記事
⇒access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)⇒access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
⇒access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加)
コメント