WordとVisual Basic
始めに
私は、Microsoft SQL Server 2008 Express をデータベースとして利用し、Wordを利用した自動文書作成、保存、及び、作成された文書のリスト化を得意な分野として、各々のお客様にカスタマイズしたアプリケーションの納入、設定を行っています。
現在、Microsoft Visual Studio Professional 2013 DVDも発表され、利用している方々も多いと思います。
今回、ワードの処置のコードを備忘録として投稿します。
尚、言語は、Microsoft Visual Basic 4 Professionalより、馴染みのあるVisual Basicです。
誤字脱字は、ご了承の程、お願い致します。
また、全ての環境で確認していません。
基本的に、私の備忘録です。
環境として・・・
私見ですが、Microsoft Visual Studioは、基本的に、.NETFrameworkを介して動作していると感じています。
下記に、今回、紹介するコードで、意図したように動作した環境を紹介します。
但し、全ての場合で確認していませんので、ご了承の程、宜しくお願い致します。
本当に、私見が強いですが、.NETFrameworkのバージョンを合わせれば、なんとかなるて思っています。
開発環境
- OS
- Windows XP Professional (32Bits)
- Visual Studio
- Visual Basic 2010 Express
- Office
- Office 2008 SP3
- .NETFramework
- 4
利用者側の環境
- OS (32Bits)
- Windows XP/Vista/7
- Office
- Office 2003/2008 SP3
- .NETFramework
- 4
基本的なフロー
開発者側のOfficeは、2008です。
このワードを利用した自動的に文書の作成、保存させる流れを紹介します。
尚、2003/2008は、意図したように動作しました。
但し、Microsoft Office Professional 2010以降は、まだ、導入していませんので、動作確認は、行っていません。
ワードについて
- ワードの文書を作成し、データの値を張り付けるブックマークを設ける
- 作成したワードの文書を保存させる
- 拡張子は、docxです
Visual Basicについて
- 定数の定義
- 作成されたワード文書を開く
- データベースより、値を確保させる
- ワードのブックマークに、取得された値を張り付ける
- 保存させるファイル形式により、自動作成した文書を保存させる
- 定義させた定数を閉じる
ワードのブックマークに張り付ける順番は、ヘッダー、フッターの部分は、最後の部分で処置させたほうが、意図したように文書が作成されました。
具体的なコード
具体的なコードを紹介します。
これらのコードは、私が作成したアプリケーションで利用し、お客様宅で、現時点で異常なく動作しています。
注意として
当初、各々の値を、ワードのブックマークに張り付けるのだから、張り付ける順番はどうでもいいではないかと思っていました。
しかし、ヘッダー、フッターの部分は、ブックマークに張り付ける最後の部分で処置させたほうが、意図したように動作しました。
注意では、ありませんが、Imports Microsoft.Office.Interop.Word.Applicationをクラス上位に記載する方法もあると思います。
定数の定義をすることで、特に、Imports Microsoft.Office.Interop.Word.Applicationは、記載しないほうが、意図したように動作しました。
尚、Imports Microsoft.Office.Interop.Word.Applicationを記載した場合、Try~End Tryにて、Catch ex As System.Exceptionと記載しないと意図したように動作しませんでした。
つまり、Try~End Try毎に、Catch ex As System.Exceptionと記載することを推奨します。
定数の定義
Dim myTemp As Microsoft.Office.Interop.Word.Application
Dim myApp As Microsoft.Office.Interop.Word.Application = Nothing
決まり文句的に・・・
If TypeName(myApp) <> “Application” Then
myTemp = CType(CreateObject(“Word.Application”), Microsoft.Office.Interop.Word.Application)
myApp = CType(CreateObject(“Word.Application”), Microsoft.Office.Interop.Word.Application)
myTemp.Quit()
myTemp = Nothing
End If
If myApp.Visible = False Then myApp.Visible = True
‘ If myApp.Visible = False Then myApp.Visible = True ‘CreateObject 関数をすぐ使用した後に、Word Objectを表示させる。Word 97にのみあるらしい。
ワードの文書を開く
作成されているワードの拡張子は、docxです。
docでも、同様にファイルを開くことができました。
Me.m_myAppState = “定型用紙を開く際、”
Try
With myApp
.Documents.Open(FileName:=CType(開くワードのファイルの絶対パス名, Object))
.ActiveDocument.Range(Start:=0, End:=0).Select()
.WindowState = Microsoft.Office.Interop.Word.WdWindowState.wdWindowStateMaximize
End With
If myApp.Visible = False Then myApp.Visible = True
Catch ex1 As System.IO.DirectoryNotFoundException
My.Application.Log.WriteException(ex1, TraceEventType.Error, Me.m_myAppState & “DirectoryNotFoundExceptionをキャッチ”)
MessageBox.Show( _
“定型書式が保存されているフォルダが見つかりません。” & ControlChars.NewLine & ControlChars.NewLine & _
“請求書は作成されません。” & ControlChars.NewLine & ControlChars.NewLine & _
“[OK]ボタンをクリックしてください。”, _
“ワード文章を開く”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
myApp = Nothing
this_ErrMessage = “Err”
Exit Sub
Catch ex2 As System.IO.FileNotFoundException
My.Application.Log.WriteException(ex2, TraceEventType.Error, Me.m_myAppState & “FileNotFoundExceptionをキャッチ”)
MessageBox.Show( _
“定型書式が保存されているファイルが見つかりません。” & ControlChars.NewLine & ControlChars.NewLine & _
“請求書は作成されません。” & ControlChars.NewLine & ControlChars.NewLine & _
“[OK]ボタンをクリックしてください。”, _
“ワード文章を開く”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
myApp = Nothing
this_ErrMessage = “Err”
Exit Sub
Catch exSecurity As System.Security.SecurityException
My.Application.Log.WriteException(exSecurity, TraceEventType.Error, Me.m_myAppState & “SecurityExceptionをキャッチ”)
MessageBox.Show( _
“定型書式が保存されているフォルダのアクセス許可が不足しています。” & ControlChars.NewLine & ControlChars.NewLine & _
“請求書は作成されません。” & ControlChars.NewLine & ControlChars.NewLine & _
“[OK]ボタンをクリックしてください。”, _
“ワード文章を開く”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
myApp = Nothing
this_ErrMessage = “Err”
Exit Sub
Catch ex As System.Exception
My.Application.Log.WriteException(ex, TraceEventType.Error, Me.m_myAppState & “予期しない現象が発生”)
MessageBox.Show( _
“定型用紙を開く際、予期しない現象が発生しました。” & ControlChars.NewLine & _
“請求書は作成されません。” & ControlChars.NewLine & ControlChars.NewLine & _
“[OK]ボタンをクリックしてください。” & ControlChars.NewLine & ControlChars.NewLine & _
“推測されるエラーの内容” & ControlChars.NewLine & _
“(1) ワードが起動していて、「” & IBUClassDeference.IBUTempFormat.IBU_請求書の定型用紙 & “」のファイルが、開かれている場合に発生する可能性があります。” & ControlChars.NewLine & _
“(2) 設定されているワードのバージョンが、Word 2007 以外の可能性があります。”, _
“ワード文章を開く”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
myApp = Nothing
this_ErrMessage = “Err”
Exit Sub
End Try
作成されたワードのファイル内のブックマークに各々の値を張り付ける
Me.m_myAppState = “文書の作成の際、”
Try
With myApp
.ActiveDocument.Bookmarks(“ワード内のブックマーク1”).Select() : .Selection.TypeText(Text:=取得された値1)
.ActiveDocument.Bookmarks(“ワード内のブックマーク2”).Select() : .Selection.TypeText(Text:=取得された値2)
.ActiveDocument.Bookmarks(“ワード内のブックマーク3”).Select() : .Selection.TypeText(Text:=取得された値3)
End With
Catch ex As System.Exception
My.Application.Log.WriteException(ex, TraceEventType.Error, Me.m_myAppState & “予期しない現象が発生”)
MessageBox.Show( _
“ワードのブックマークへの貼り付けの際、予期しない現象が発生しました。” & ControlChars.NewLine & _
“請求書は作成されません。” & ControlChars.NewLine & ControlChars.NewLine & _
“[OK]ボタンをクリックしてください。” & ControlChars.NewLine & ControlChars.NewLine & _
“推測されるエラーの内容” & ControlChars.NewLine & _
“(1) 定型用紙の書式が破損した可能性があります。” & ControlChars.NewLine & _
“(2) 設定されているワードのバージョンが、Word 2007 以外の可能性があります。”, _
“ブックマークへの貼り付け”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
myApp = Nothing
this_ErrMessage = “Err”
Exit Sub
End Try
ヘッダー、フッターの部分の記載
Me.m_myAppState = “個別請求書のヘッダの作成の際、”
Try
With myApp
.ActiveDocument.Bookmarks(“発行年月日”).Select() : .Selection.TypeText(Text:=記載させる値)
End With
Catch ex As System.Exception
My.Application.Log.WriteException(ex, TraceEventType.Error, Me.m_myAppState & “予期しない現象が発生”)
MessageBox.Show( _
Me.m_myAppState & “予期しない現象が発生しました。” & ControlChars.NewLine & _
“請求書は作成されません。” & ControlChars.NewLine & ControlChars.NewLine & _
“[OK]ボタンをクリックしてください。” & ControlChars.NewLine & ControlChars.NewLine & _
“推測されるエラーの内容” & ControlChars.NewLine & _
“(1) 定型用紙の書式が破損した可能性があります。” & ControlChars.NewLine & _
“(2) 設定されているワードのバージョンが、Word 2007 以外の可能性があります。”, _
“ヘッダの処置”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
myApp = Nothing
this_ErrMessage = “Err”
Exit Sub
End Try
作成後の文書の保存
IBUClass.IBUProperty.IBUWordFileTypeに格納される値は、作成された文書を保存させるワードの拡張子です。
一方、this_SubFolderの値は、保存させる文書の保存先のフォルダ名です。
紹介するコードにて、LibreOffice Writerにも、保存できます。
LibreOffice Writerに保存させる場合、一回、docxで保存させ、名前を付けて保存の機能を利用して、odt形式に保存可能でした。
しかし、レイアウトなど配置がみだれました。
この点は、今後の私なりの課題です。
Me.m_myAppState = “文書の保存の際、”
Try
Select Case IBUClass.IBUProperty.IBUWordFileType
Case “doc”
‘ Word 11 >> FileFormat:= wdFormatDocument
With myApp
.ChangeFileOpenDirectory(this_SubFolder)
.ActiveDocument.SaveAs(FileName:=CType(myFileName, Object), FileFormat:=CType(Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument, Object))
End With
Case “docx”
‘ Word 12 >> FileFormat:=wdFormatXMLDocument
With myApp
.ChangeFileOpenDirectory(this_SubFolder)
.ActiveDocument.SaveAs(FileName:=CType(myFileName, Object), FileFormat:=CType(Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatXMLDocument, Object))
End With
Case “odt”
‘ OpenDocument >> FileFormat:= wdFormatOpenDocumentText
‘ LibreOffice の場合、「名前を付けての保存」で、素直に保存、表示できた。
myFileName = “個別の請求書.odt”
With myApp
.ChangeFileOpenDirectory(this_SubFolder)
.ActiveDocument.SaveAs(FileName:=CType(myFileName, Object), FileFormat:=CType(Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatOpenDocumentText, Object))
End With
Case Else
‘ 強引にWord 12 形式で保存させる。
With myApp
.ChangeFileOpenDirectory(this_SubFolder)
.ActiveDocument.SaveAs(FileName:=CType(myFileName, Object), FileFormat:=CType(Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatXMLDocument, Object))
End With
End Select
Catch ex As System.Exception
My.Application.Log.WriteException(ex, TraceEventType.Error, Me.m_myAppState & “予期しない現象が発生”)
MessageBox.Show( _
Me.m_myAppState & “予期しない現象が発生しました。” & ControlChars.NewLine & _
“文書は作成されません。” & ControlChars.NewLine & ControlChars.NewLine & _
“[OK]ボタンをクリックしてください。” & ControlChars.NewLine & ControlChars.NewLine & _
“推測されるエラーの内容” & ControlChars.NewLine & _
“(1) 定型用紙の書式が破損した可能性があります。” & ControlChars.NewLine & _
“(2) 設定されているワードのバージョンが、Word 2007 以外の可能性があります。”, _
“文書の保存”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
myApp = Nothing
this_ErrMessage = “Err”
Exit Sub
End Try
閉じる
If TypeName(myApp) <> “Application” Then
myApp.Quit(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges)
myApp = Nothing
End If
ヘッダーの部分は、請求年月日を記載させています。
一方、ページ/ページ総数の部分は、ワードのフィールドで、page/NumPagesとして利用しています。
[…] 前回は、ワードの自動文書作成、保存などの処理を行うVisual Basicを言語としたコードを紹介しました。 ワードで作成した文書の余分なページの削除のコードを備忘録として投稿します […]