[2019/02/25] access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加) (No.80)
[2019/02/22] access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加) (No.79)
[2018/11/22] access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む) (No.70)
[2018/11/22] access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント) (No.69)
[2018/11/21] access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント) (No.68)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
前回はWord文書の中で文字列を検索しその部分を指定された文字列で置き換える処理を作成しましたが、 カーソルの位置が最後の置換処理を行った場所に移動します。
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
これでは文書の途中にカーソルがありますので、文書の先頭が見たい場合には都合が悪いので、カーソルを先頭に移動する関数を作成します。
カーソルの移動には Bookmark オブジェクトを利用します。 このオブジェクトには以下の様に定義済みのものがありますのでこれを利用します。Bookmark 説明 \Sel 現在の選択範囲またはカーソル位置 \PrevSel1 最後に編集を行った範囲 \PrevSel2 2個前に編集を行った範囲 \StartOfSel 現在の選択範囲の開始位置 \EndOfSel 現在の選択範囲の終了位置 \Line 現在の行または現在の選択範囲の最初の行 \Char 現在の文字。範囲が選択されていない場合はカーソルの右側の文字、また範囲が選択されている場合はその範囲の先頭文字を指します \Para カーソルのある段落か、複数の段落を選択すると、選択範囲の最初の段落 \Section 現在のカーソルのあるセクションか、選択範囲に複数のセクションが含まれている場合、最初のセクション \Doc 作業中の文書全体 \Page 現在のページ \StartOfDoc 文書の先頭 \EndOfDoc 文書の末尾 \Cell テーブル内の現在のセル、複数のセルが選択されている場合は先頭のセル \Table 現在のテーブル、複数のテーブルが選択されている場合は先頭テーブル
この Bookmark オブジェクトに \StartOfDoc を指定し、そのオブジェクトを選択することでカーソル移動が行えます。 関数としては以下の通りで、特に難しくはありません。
尚、 Range オブジェクトを使ってもできます。
Word文書カーソル先頭移動関数
'****************************************************************************** ' Word文書・カーソル先頭移動 '****************************************************************************** ' 関数名 : WordMoveToTop() '****************************************************************************** Public Sub WordMoveToTop() On Error GoTo Err_WordMoveToTop 'カーソル先頭移動 WordDoc.Bookmarks("\StartOfDoc").Select '以下の方法でもOK 'WordDoc.Range(0, 0).Select Exit_WordMoveToTop: Exit Sub Err_WordMoveToTop: MsgBox Err.Description Resume Exit_WordMoveToTop End Sub
この関数をWord処理用クラスに追加して、それを使用する例として、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 & "\" & "find-test.docx" 'ワードファイルを読込み編集状態で表示する mclsWord.WordOpen strPath, True ' Dim arrVaKey() As Variant Dim arrVaVal() As Variant arrVaKey = Array("@test1@", _ "@test2@", _ "@test3@", _ "@test4@") arrVaVal = Array("テスト1", _ "テスト2", _ "テスト3", _ "テスト4-1" & vbCrLf & "テスト4-2" & vbCrLf & "テスト4-3") '置換処理(左揃えを行わない) mclsWord.WordReplace arrVaKey, arrVaVal, False arrVaKey = Array("@test5@") arrVaVal = Array("テスト5-1" & vbCrLf & "テスト5-2" & vbCrLf & "テスト5-3") '置換処理(左揃えを行う) mclsWord.WordReplace arrVaKey, arrVaVal, True '先頭へ移動 mclsWord.WordMoveToTop End Sub
「コマンド1開始」を押下することで、ワードが起動し置換処理の結果が表示され、カーソルが先頭に移動していることが分かります。
関連する記事
⇒access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
⇒access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
PR -
access vba でのWord用クラス作成について以下のページで説明しましたが、 今回はWord文書の中で文字列を検索し、その部分を指定された文字列で置き換える処理をクラスに追加してみます。
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
関数を追加する前に今回使用する Find オブジェクトについてみてみます。
以下の例は抜粋なのですが、Word.Documentオブジェクトとして WrdDoc が既に生成されているものとします。
Word.Documentオブジェクトの Content プロパティの Find オブジェクトを利用します。
(この Content プロパティは「文書全体を示す Range オブジェクト」のことで、 Range オブジェクトの中の Find オブジェクトとなります)
Find オブジェクトの以下の各プロパティをそれぞれ指定し Execute メソッドで処理種別を指定し、 置換処理等を行います。この処理種別には多くのものがありますので、それぞれについては正規の説明書を見て下さい。
今回は文字列の置換ですので、Replace を指定しています。 Replace の引数としては置換する文字列の個数 (1つだけ:wdReplaceOne、すべて:wdReplaceAll、または置換しない:wdReplaceNone) を指定します。
この例は、文書全体の「Word」を「ワード」に置き換える処理を行います。Find オブジェクトの実行例
With WrdDoc.Content.Find .Text = "Word" '置換元の文字列 .Replacement.Text = "ワード" '置換後の文字列 .Wrap = wdFindContinue '検索折返し指定 '(文書の途中から検索し、最後に到達した時に先頭から続行) .Execute Replace:=wdReplaceAll End With
基本的にはこの処理を複数の文字列の置換が出来る様に以下の様な関数にしました。
関数の引数としては置換される文字列と、置換文字列を配列で指定します。 尚、vba では配列の場合は Variant 型として宣言します。 置換される文字列配列と、置換文字列配列の個数のチェックは行っていないので、同じにする必要があります。
この関数での注意点は、置換文字列の中に改行を含んでいる場合に、そのまま一括で置換してしまうと 1個目の改行以降が左側に寄ってしまいます。そのため、改行で文字列を分解し、1個ごとに文字列と改行を出力する様にしています。
こうすることで、置換元の位置の左端に合わせた感じで改行後の文字列が揃うはずです。
Word文書文字列置換関数
'****************************************************************************** ' Word文書文字列置換処理 '****************************************************************************** ' 関数名 : WordReplace() ' 引数 : P_vaKey() '差替KEY文字列の配列 ' : P_vaVal() '差替文字列の配列 ' : P_blnCrLfLeftAlign '左揃えフラグ '****************************************************************************** Public Sub WordReplace(P_vaKey() As Variant, P_vaVal() As Variant, P_blnCrLfLeftAlign As Boolean) On Error GoTo Err_WordReplace Dim i As Integer For i = 0 To UBound(P_vaKey) If InStr(P_vaVal(i), vbCrLf) = 0 Or P_blnCrLfLeftAlign = False Then '置換文字列に改行コードが無い場合、または左揃えフラグがOFF '文字を検索、置換する With WordDoc.Content.Find .Text = P_vaKey(i) .Forward = True .Replacement.Text = Replace(CStr(P_vaVal(i)), vbCrLf, vbCr) .Wrap = wdFindContinue .MatchFuzzy = True .Execute Replace:=wdReplaceAll End With Else '置換文字列に改行コードがある場合 '検索文字列の先頭にカーソル移動 With WordApp.Selection.Find .Text = P_vaKey(i) .Execute End With '文字を検索、置換する With WordDoc.Content.Find .Text = P_vaKey(i) .Forward = True .Replacement.Text = "" '取り敢えずクリア .Wrap = wdFindContinue .MatchFuzzy = True .Execute Replace:=wdReplaceAll End With Dim arr() As String arr = Split(P_vaVal(i), vbCrLf) '改行で分解した文字列をカーソル位置から順次出力 Dim ix As Integer For ix = 0 To UBound(arr) If ix > 0 Then '2個目以降は改行出力 WordApp.Selection.TypeText vbCr End If WordApp.Selection.TypeText arr(ix) Next ix End If Next i Exit_WordReplace: Exit Sub Err_WordReplace: MsgBox Err.Description Resume Exit_WordReplace End Sub
この関数をWord処理用クラスに追加して、それを使用する例として、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 & "\" & "find-test.docx" 'ワードファイルを読込み編集状態で表示する mclsWord.WordOpen strPath, True ' Dim arrVaKey() As Variant Dim arrVaVal() As Variant arrVaKey = Array("@test1@", _ "@test2@", _ "@test3@", _ "@test4@") arrVaVal = Array("テスト1", _ "テスト2", _ "テスト3", _ "テスト4-1" & vbCrLf & "テスト4-2" & vbCrLf & "テスト4-3") '置換処理(左揃えを行わない) mclsWord.WordReplace arrVaKey, arrVaVal, False arrVaKey = Array("@test5@") arrVaVal = Array("テスト5-1" & vbCrLf & "テスト5-2" & vbCrLf & "テスト5-3") '置換処理(左揃えを行う) mclsWord.WordReplace arrVaKey, arrVaVal, True End Sub
「コマンド1開始」を押下することで、ワードが起動し置換処理の結果が表示されます。 元のワードの文書と結果の文書は以下の画像の様になります。 左揃え処理を行う個所と、行わない個所の違いが分かると思います。
関連する記事
⇒access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
⇒access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
⇒access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加)
-
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保存前イベント)
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
⇒access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加)
おすすめ本
-
昨日は、access vba でWordを起動しWordファイルを読込んだ後で、ファイルを保存する時に読込みファイル名に日付と時刻を自動で 付加する方法についての記事を載せましたが、 今日は、同様に access vba でExcelを起動しExcelファイルを読込み後、ファイル保存時にファイル名に日付と時刻を自動で付加する 方法を紹介します。
Wordの時と同様に、Excelのメニューから「名前を付けて保存」や「上書き保存」などを選択した時に、 WorkbookBeforeSave のイベントが発生します。
このイベント処理の中で、指定されたファイル名に日付と時刻をファイルの先頭に付加し、 ファイル保存ダイアログをコールします。
尚、今回のイベントを利用するためには、accessの参照設定で「Microsoft Excel Object Library」の指定が必要です。 私の環境では Excel2013 なので「Microsoft Excel 15.0 Object Library」でした。では、以下にそのソース全体を示します。
WorkbookBeforeSave イベントでファイル名を変更し保存する例
Option Compare Database ' Excelオブジェクト Private WithEvents ExcelApp As Excel.Application ' Excel.Workbookオブジェクト Private ExcelBook As Excel.Workbook ' イベント呼び出し中フラグ Private fBeforeSaveCall As Boolean '------------------------------------------------------------------------------ ' Word文書編集開始 '------------------------------------------------------------------------------ Private Sub コマンド1_Click() Dim strPath As String 'Excelオブジェクト生成 Set ExcelApp = CreateObject("Excel.application") 'Excelファイルを読み込み、文章を編集する状態にする strPath = Application.CurrentProject.path & "\" & "sample.xlsx" Set ExcelBook = ExcelApp.Workbooks.Open(strPath) '編集モードで開く ExcelApp.Visible = True fBeforeSaveCall = False End Sub '------------------------------------------------------------------------------ ' Excel・保存前イベント処理 '------------------------------------------------------------------------------ Private Sub ExcelApp_WorkbookBeforeSave(ByVal Wb As Excel.Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim strPath As String '日付・時刻を[yyyymmdd-hhnnss-]形式でファイル名の先頭に付加 strPath = Wb.path & "\" & Format$(Now, "yyyymmdd-hhnnss-") & Wb.Name '既に保存前イベントが呼ばれている If fBeforeSaveCall = True Then Exit Sub End If '保存前イベント呼び出し中フラグON fBeforeSaveCall = True '新しいファイル名でDialogを呼出す ExcelApp.Dialogs(xlDialogSaveWorkbook).Show strPath '保存前イベント呼び出し中フラグOFF fBeforeSaveCall = False '通常のDialogの非表示 Cancel = True End Sub '------------------------------------------------------------------------------ ' Excel・終了イベント処理 '------------------------------------------------------------------------------ Private Sub ExcelApp_Quit() Set ExcelBook = Nothing Set ExcelApp = Nothing End Sub '------------------------------------------------------------------------------ ' フォームを閉じる時のイベント '------------------------------------------------------------------------------ Private Sub Form_Close() If Not ExcelApp Is Nothing Then 'Wordオブジェクト解放 Set ExcelBook = Nothing Set ExcelApp = Nothing End If End Sub
このプログラムの例では、access のフォームに1個のボタンのみを持たせています。 実行すると以下の様な表示になります。
上記のソースは、フォームのvbaの静的変数で、Excelオブジェクトを WithEvents 付きで宣言します。 WithEvents 付きとすることで、vba のコード入力時にイベントの選択が以下の様にできます。
このソースで重要なのは、 WorkbookBeforeSave のイベント処理の中で、自分でファイル名を変更し、 Excelオブジェクトのファイル保存ダイアログを直接コールし、 その後でこのイベントが呼ばれた元のダイアログ処理を Cancel を True にして返すことでキャンセルすることです。
さらに、ダイアログ処理を呼出すと、この WorkbookBeforeSave のイベントが再度発生する為、 自分自身のダイアログ呼び出しでのイベントは処理しない様にします。 そのため、イベント処理中のフラグを宣言し、ダイアログ処理の前後でフラグをON・OFFし、イベントの再入を防いでいます。
Excelオブジェクトの終了イベント(Quit)では念のため、Wordオブジェクト変数をクリアしています。
また、フォームを閉じる時のイベントでもExcelオブジェクト変数がクリアではない場合に、クリアしています。
実際にExcelで保存を選択した場合には、以下の様な表示なります。関連する記事
⇒access vba でWordを起動しファイル保存時のファイル名変更について(DocumentBeforeSave : Word保存前イベント)
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
⇒access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加)
⇒Excel ファイルの操作について(Microsoft.Office.Interop.Excel COM参照)
おすすめ本
-
VB.NET-Tipsではないのですが、この記事から Visual Basic 繋がりで、VBA(Visual Basic for Applications)についても番外的な記事として 載せていこうと思います。
access vba でWordを起動しWordファイルを読込んだ後で、ファイルを保存する時に読込みファイル名に日付と時刻を自動で 付加する必要が在ったので、できるのか調べてみました。
Wordのメニューから「名前を付けて保存」や「上書き保存」などを選択した時に、 DocumentBeforeSave のイベントが発生することは分かったのですが、 これの例としては、以下の様に保存の前の確認を行うものしかありませんでした。
どうすればこのタイミングでファイル名を変更できるのかが知りたいことでしたが、 調べ方が悪いのかネットには例がありませんでした。DocumentBeforeSave を使った簡単な例
Private Sub WordApp_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean) Dim intRet As Integer intRet = MsgBox("ドキュメントを保存しますか?", vbYesNo) If intRet = vbNo Then Cancel = True End If End Sub
この例では、Wordでのファイル書き込み時に DocumentBeforeSave のイベントでファイル名を変更してやれば 出来るようなかんじでした。 しかし、ことはそんなに簡単ではなく、 DocumentBeforeSave のイベントの引数内の Doc ですが この中のプロパティで name が在ったのでこれを変更すればと思ったのですが、 これは Readonly のプロパティで変更できない様です。
ならば、 DocumentBeforeSave のイベントの中で、ファイル名を変更後、自分で保存ダイアログを表示すればよいことに気が付きました。
尚、上の簡単な例でも必要なのですが、今回のイベントを利用するためには、accessの参照設定で「Microsoft Word Object Library」の指定が必要です。 私の環境では Word2013 なので「Microsoft Word 15.0 Object Library」でした。では、以下にそのソース全体を示します。
DocumentBeforeSave イベントでファイル名を変更し保存する例
Option Compare Database ' Wordオブジェクト Private WithEvents WordApp As Word.Application ' Word.Documentオブジェクト Private WordDoc As Word.Document '------------------------------------------------------------------------------ ' Word文書編集開始 '------------------------------------------------------------------------------ Private Sub コマンド1_Click() Dim strPath As String 'word起動 'Set WordApp = CreateObject("Word.application") 'BUG-FIX Set WordApp = New Word.Application 'ワードファイルを読み込み、文章を編集する状態にする strPath = Application.CurrentProject.path & "\" & "sample.docx" Set WordDoc = WordApp.Documents.Open(strPath) '編集モードで開く 'Wordを表示 WordApp.Visible = True 'Wordをアクティブ化 WordApp.Activate 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 '------------------------------------------------------------------------------ ' フォームを閉じる時のイベント '------------------------------------------------------------------------------ Private Sub Form_Close() If Not WordApp Is Nothing Then 'Wordオブジェクト解放 Set WordDoc = Nothing Set WordApp = Nothing End If End Sub
このプログラムの例では、access のフォームに1個のボタンのみを持たせています。 実行すると以下の様な表示になります。
上記のソースは、フォームのvbaの静的変数で、Wordオブジェクトを WithEvents 付きで宣言します。 WithEvents 付きとすることで、vba のコード入力時にイベントの選択が以下の様にできます。
このソースで肝なのは、 DocumentBeforeSave のイベント処理の中で、自分でファイル名を変更し、 Wordオブジェクトのファイル保存ダイアログを直接コールし、 その後でこのイベントが呼ばれた元のダイアログ処理を Cancel を True にして返すことでキャンセルすることです。
尚、Wordオブジェクトの終了イベント(Quit)では念のため、Wordオブジェクト変数をクリアしています。
また、フォームを閉じる時のイベントでもWordオブジェクト変数がクリアではない場合に、クリアしています。
実際にWordで保存を選択した場合には、以下の様な表示になります。関連する記事
⇒access vba でExcelを起動しファイル保存でのファイル名変更について(WorkbookBeforeSave : Excel保存前イベント)
⇒access vba でのWord処理用クラスの作成(ファイル保存時イベント[DocumentBeforeSave]でのファイル名変更処理を含む)
⇒access vba でのWord文書の文字列検索と置換について(Word処理用クラスに文字列置換関数を追加)
⇒access vba Bookmarkオブジェクトで文書の先頭にカーソルを移動する(Word処理用クラスに文書の先頭移動関数を追加)
おすすめ本