忍者ブログ

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

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

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

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処理用クラスに文書の先頭移動関数を追加)

おすすめ本

share











PR

コメント

コメントを書く