VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 関係のメニュー
1.VB2013 から Excel 2013 を操作する為の基本的な操作方法
2.Excel 操作ワンポイントテクニック集その1
3.Excel 操作ワンポイントテクニック集その2
4.VB2013から Excel にデータを送りグラフを表示する
5.Excel のグラフをクリップボード経由で PictureBox に貼付
6.Excel 2013 の WEB クエリを VB2013 から操作する
7.
8.
9.
10.
11.VB2013から Word の起動・終了処理及び文字の書き込み例
12.Wordの差し込み印刷機能を使って宛て名ラベルを印刷
13.
20.その他、当サイト内に掲載のExcel・Word・VBAに関するサンプル


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.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)





このページのトップへ移動します。