1.VB2013から Word の起動・終了処理及び文字の書き込み例(09_Xls_13) |
1.VB2013から Word の起動・終了処理及び文字の書き込み例 2.Word の起動及び終了に関する基本設定 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 / Word 2013 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :Microsoft.Office.Interop 参照設定:Microsoft Word 15.0 ObjectLibrary / WaitTime.dll 参照設定方法参照 その他 : : このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.VB2013から Word の起動・終了処理及び文字の書き込み例 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call WordOpen("") '新規ファイルをオープンして、Word を起動 'Call WordOpen(IO.Path.GetFullPath("..\..\..\data\Test.doc")) '既存のファイルをオープンして、Word を起動 '============================================================================= '---------------- ---------------- '文書の書き込み例 wdDoc.Activate() With wdDoc.ActiveWindow.Selection .TypeParagraph() '段落を設定 .TypeText(Text:="VBレスキュー(花ちゃん)") '文書を記入 .TypeParagraph() '段落を設定 .TypeParagraph() '段落を設定 .TypeText(Text:="Visual Basic 2010") '文書を記入 .TypeBackspace() .TypeText(Text:="3") .TypeParagraph() '段落を設定 End With Dim nLen As Integer = 0 Dim wdRange As Word.Range = wdDoc.Range(Start:=15, End:=15) wdRange.Text = "【Range によるテスト書き込み】" MRComObject(wdRange) '----------------------------------------------------------------------------- End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '============================================================================= 'Wordファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call WordClose(IO.Path.GetFullPath(".\Test.docx"), True) 'False の場合保存しないで終了 'WinWord.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
2.Word の起動及び終了に関する基本設定 |
#Region "Word の起動及び終了に関する基本設定" #Region "Private 変数の宣言" Private wdApp As Word.Application Private wdDocs As Word.Documents Private wdDoc As Word.Document Private frgClose As Boolean 'ユーザーが Word を閉じようとしたかのフラグ Private WT As New WaitTime.Class1 #End Region #Region "Word の起動時の処理関係" Private Sub WordOpen(ByVal FilePath As Object) 'Word のオープン処理用プロシージャ frgClose = False '起動中は、ユーザーが Word を閉じれないように wdApp = New Word.Application 'Word の DocumentBeforeClose イベントをイベント ハンドラーに関連付け AddHandler wdApp.DocumentBeforeClose, AddressOf wdApp_DocumentBeforeClose wdDocs = wdApp.Documents If CType(FilePath, String).Length = 0 Then '新規のファイルを開く場合 wdDoc = wdDocs.Add Else '既存のファイルを開く場合 注 引数 FilePath は Object 型になります。 wdDoc = wdDocs.Open(FilePath) End If wdApp.Visible = True 'この Form が Word の裏に隠れるのを防止する場合 Me.TopLevel = True Me.TopMost = True End Sub Private Sub wdApp_DocumentBeforeClose(ByVal Wb As Word.Document, ByRef Cancel As Boolean) 'Word 2013 から Word の DocumentBeforeClose イベントを監視してユーザーが Word を閉じれないようにする '(Word 2013 から Word を操作している途中でユーザーが勝手に Word を閉じるとエラーが発生するので) If frgClose = False Then Cancel = True 'ユーザーが Word を閉じようとしたので、処理をキャンセルする Else Cancel = False 'キャンセルしない(閉じる) End If End Sub #End Region #Region "Word の終了・保存処理関係" Private Sub WordClose(ByVal FilePath As Object, Optional ByVal CancelSave As Boolean = True) 'Wordファイルを上書き保存して終了処理用プロシージャ frgClose = True 'True : 閉じる事ができる(プログラムからの終了なので) wdApp.DisplayAlerts = CType(False, Word.WdAlertLevel) '保存時の問合せのダイアログを非表示に設定 If CancelSave Then Dim kts As String = System.IO.Path.GetExtension(CType(FilePath, String)).ToLower() Dim fm As Object = Nothing Dim ComMode As Object = 0 '拡張子に合せて保存形式を変更 Select Case kts Case ".rtf" 'rtf 形式 fm = Word.WdSaveFormat.wdFormatRTF Case ".txt" 'Txt 形式 fm = Word.WdSaveFormat.wdFormatText Case ".doc" 'Word 97〜2003 形式 fm = Word.WdSaveFormat.wdFormatDocument97 Case ".docx" 'Word 2007〜 形式 fm = Word.WdSaveFormat.wdFormatXMLDocument ComMode = 15 Case ".docm" 'Word 2007〜マクロ有効 形式 fm = Word.WdSaveFormat.wdFormatXMLDocumentMacroEnabled ComMode = 15 Case Else '必要なものは、追加して下さい。 fm = Word.WdSaveFormat.wdFormatDocumentDefault ComMode = 15 MessageBox.Show("ファイルの保存形式を確認して下さい。") End Select Try wdDoc.SaveAs2(FileName:=FilePath, FileFormat:=fm, CompatibilityMode:=ComMode) Catch ex As Exception MessageBox.Show(ex.Message) End Try End If 'DocumentBeforeClose イベントとイベント ハンドラーの関連付けを解除しておく事 RemoveHandler wdApp.DocumentBeforeClose, AddressOf wdApp_DocumentBeforeClose wdDoc.Close() 'xlBook を閉じる MRComObject(wdDoc) 'xlBook の解放 MRComObject(wdDocs) 'xlBooks の解放 wdApp.Quit() 'Wordを閉じる MRComObject(wdApp) 'xlApp を解放 End Sub #End Region #Region "COM オブジェクトの解放(デクリメント処理)処理関係" '今まで使っていた方法では、Option Strict On の時にエラーとなったので、下記の '魔界の仮面弁士さんの投稿を使用させて頂きました。詳しくは、下記を参照してください。 'http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=6370#6374 'VB2005/VB2008/VB2010/VB2013 用 ''' <summary> ''' COMオブジェクトの参照カウントをデクリメントします。 ''' </summary> ''' <typeparam name="T">(省略可能)</typeparam> ''' <param name="objCom"> ''' COM オブジェクト持った変数を指定します。 ''' このメソッドの呼出し後、この引数の内容は Nothing となります。 ''' </param> ''' <param name="force"> ''' すべての参照を強制解放する場合はTrue、現在の参照のみを減ずる場合はFalse。 ''' </param> Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) End If End If Finally objCom = Nothing End Try End Sub #End Region #Region "テスト時の Word のプロセスの終了チェック用(実装時はいらない)" Private Sub ProcessCheck() 'タスクマネージャーに、WinWord.exe が残っていないか確認(テスト環境でのみ使用の事) '以前は、Loop しながら5秒間程繰り返し確認していたのだが、その間に解放される場合が 'ある事が判明したので、下記のように1回きりの確認でもデクリメント処理がきちんと '行われていたら解放される事が解ったので下記のように厳密に判定する事にしました。 If Process.GetProcessesByName("WINWORD").Length = 0 Then '先にフォームを閉じるとエラーが発生するので '必要により表示するようにして下さい。 MessageBox.Show(Me, "WINWORD.EXE は解放されました。") Exit Sub End If If Process.GetProcessesByName("WINWORD").Length >= 1 Then Dim ret As DialogResult ret = MessageBox.Show(Me, "まだ WINWORD.EXE が起動しています。強制終了しますか?", _ "確認", MessageBoxButtons.YesNo) If ret = Windows.Forms.DialogResult.Yes Then Dim localByName As Process() = Process.GetProcessesByName("WINWORD") Dim p As Process '起動中のWordを取得 For Each p In localByName 'Windou の無い(表示していない) Word があれば強制終了させる '画面に表示している Word は、終了させないので必要なら手動で終了して下さい。 If System.String.Compare(p.MainWindowTitle, "", True) = 0 Then 'winWord.EXE のプロセスを削除 p.Kill() End If Next End If End If End Sub #End Region #End Region |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |