プログラムの概要
マイクロソフト社の提唱する処の『オートメーション』と は、或る Office アプリケーションから他の Office アプリ ケーションのオブジェクトを、VB や VBA を使用して操作 する事、即ち、Office アプリケーションをプログラム的に 統合する事を意味する。Office アプリケーションは其の何 れもが単体でも優れたアプリケーションで有るが、個々の Office アプリケーションが持つ様々な機能を 1 個のカスタ ムソリューションに統合する事で、其の優れた性能と機能 とを更に高める事が出来る。 Office アプリケーションで公開されて居るオブジェクト群 は、部品の集合体と仕て扱う事が出来る為、自作のソリュ ーションに組み込む事が可能で有る。然うする事で、Office ソフトウェアの設計、開発、試験に懸けられた労力を有効 利用出来る丈でなく、開発期間の短縮も図る事が出来る。其処で、今回は、事務処理に於いて、業界標準(De Facto Standard)で有る Microsoft Office のオブ ジェクトをVB から操作する方法を重点的に学ぶ。此処では、Access オブジェクトを用いて、XLS 形 式、RTF 形式、HTML 形式と相互変換する方法を説明する。
オフィスオートメーションⅠ
□ 参照設定(Microsoft Access、Excel、DAO x.x Object Library)
□ Access オブジェクト(Application オブジェクト、DoCmd オブジェクト)
□ Application オブジェクト(Quit、OpenCurrentDatabase、CloseCurrentDatabase メソッド) □ DoCmd オブジェクト(TransferText、TransferSpreadsheet、OutputTo メソッド)
□ Excel オブジェクト(Application オブジェクト、Workbook オブジェクト)
□ Application オブジェクト(Workbooks コレクション、Add メソッド、Close メソッド) □ Workbook オブジェクト(SaveAs メソッド)
□ DAO オブジェクト(Database、DBEngine、Workspace、TableDef オブジェクト) 今回の課題項目
□ 参照設定(Microsoft Access、Excel、DAO x.x Object Library)
□ Access オブジェクト(Application オブジェクト、DoCmd オブジェクト)
□ Application オブジェクト(Quit、OpenCurrentDatabase、CloseCurrentDatabase メソッド) □ DoCmd オブジェクト(TransferText、TransferSpreadsheet、OutputTo メソッド)
□ Excel オブジェクト(Application オブジェクト、Workbook オブジェクト)
□ Application オブジェクト(Workbooks コレクション、Add メソッド、Close メソッド) 今回の重点項目
■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム オブジェクト名 frmMain BorderStyle 1 - 固定(実線) Caption Office オートメーション StartUpPosition 2 - 画面の中央 フレーム1 オブジェクト名 fraCSV Caption CSV 変換 フレーム2 オブジェクト名 fraExcel Caption EXCEL 変換 フレーム3 オブジェクト名 fraRTF Caption RTF 変換 フレーム4 オブジェクト名 fraHTML Caption HTML 変換 コマンドボタン1 オブジェクト名 cmdCSVtoACCESS Caption CSV → ACCESS コマンドボタン2 オブジェクト名 cmdACCESStoCSV Caption ACCESS → CSV コマンドボタン3 オブジェクト名 cmdEXCELtoACCESS
Caption EXCEL → ACCESS フレーム1 コマンドボタン5 フレーム3 フレーム2 チェックボックス2 コモンダイアログ コマンドボタン1 コマンドボタン2 コマンドボタン3 コマンドボタン4 チェックボックス1 コマンドボタン6 コマンドボタン7
コントロールの種類 プロパティ プロパティの設定値 コマンドボタン4 オブジェクト名 cmdACCESStoEXCEL
Caption ACCESS → EXCEL コマンドボタン5 オブジェクト名 cmdACCESStoRTF Caption ACCESS → TRF コマンドボタン6 オブジェクト名 cmdACCESStoHTML Caption ACCESS → HTML コマンドボタン7 オブジェクト名 cmdFinish Caption 終 了 チェックボックス1 オブジェクト名 chkOpenRTF Caption 作成後、ファイルを開く。 チェックボックス2 オブジェクト名 chkOpenHTML Caption 作成後、ファイルを開く。 コモンダイアログ オブジェクト名 cdlFile CancelError True ※ Font プロパティ等に付いては、各自の好みで適宜設定する。 ※ コモンダイアログは、メニューバーの『プロジェクト』→『コンポーネント』で追加する。 フォームモジュールの追加 下図の様に、メニューバーの『プロジェクト』をクリックして表示されるドロップダウンメニュ ーより『フォームモジュールの追加』をクリックすると、プロジェクトに新しいフォームが追加 される。 ※ 複数のフォームを使用する場合は、夫々れにオブジェクト名を付ける事が望ましい(勿論 Form1、Form2 でも構わないが、用途を表す名前を付けた方が紛らわしくなくて良い)。
コントロールの種類 プロパティ プロパティの設定値 フォーム オブジェクト名 frmTableInp Caption Office オートメーション StartUpPosition 2 - 画面の中央 フレーム オブジェクト名 fraTable Caption テーブル名入力 テキストボックス オブジェクト名 txtTable Text 空白 コマンドボタン1 オブジェクト名 cmdFixed Caption 決定 コマンドボタン2 オブジェクト名 cmdCancel Caption キャンセル コントロールの種類 プロパティ プロパティの設定値 フォーム オブジェクト名 frmTableSel Caption テーブル指定 StartUpPosition 2 - 画面の中央 フレーム オブジェクト名 fraTable Caption テーブル指定 コンボボックス オブジェクト名 cboTable Text 空白 コマンドボタン1 オブジェクト名 cmdFixed Caption 決定 コマンドボタン2 オブジェクト名 cmdCancel Caption キャンセル フレーム テキストボックス コマンドボタン1 コマンドボタン2 フレーム コマンドボタン1 コンボボックス コマンドボタン2
■ プログラムリスト(frmMain) ■ Option Explicit
' Microsoft Access x.x Object Library の参照設定を行う。 ' Microsoft Excel x.x Object Library の参照設定を行う。 ' Microsoft DAO x.x Object Library の参照設定を行う。 Private Ac As Access.Application
Private Sd As String
' フォームが読み込まれた時の処理 Private Sub Form_Load( ) ' 起動パスの設定
Sd = App.Path: If Not Right$( Sd, 1 ) = "¥" Then Sd = Sd & "¥"
' Access オブジェクトのインスタンス生成 Set Ac = New Access.Application ' ダイアログボックスの設定 cdlFile.InitDir = Sd cdlFile.CancelError = True End Sub ' フォームが閉じられ様と仕た時の処理
Private Sub Form_QueryUnload( Cancel As Integer, UnloadMode As Integer ) ' Access の終了 Ac.Quit ' Access の解放 Set Ac = Nothing End Sub ' コマンドボタン(終了)がクリックされた時の処理 Private Sub cmdFinish_Click( )
Unload Me End End Sub '====================== ' CSV⇔アクセス変換 '====================== ' コマンドボタン(CSV→ACCESS)がクリックされた時の処理 Private Sub cmdCSVtoACCESS_Click( )
Dim Src As String Dim Dest As String Dim Tname As String
' CSV ファイル名の設定
Src = SetFileName( ".csv", "CSV ファイル(*.csv)|*.csv|総てのファイル(*.*)|*.*", "SRC" ) If Src = "CANCEL" Or Src = "NOEXIST" Then Exit Sub
' ACCESS ファイル名の設定
Dest = SetFileName( ".mdb", "ACCESS ファイル(*.mdb)|*.mdb|総てのファイル(*.*)|*.*", "DEST" ) If Dest = "CANCEL" Or Dest = "EXIST" Then Exit Sub
If Dir( Dest ) = "" Then Call CreateAccessFile( Dest ) 此処で宣言した変数の有効期間は 宣言された時点から、プログラム の終了迄で有る。 App.Path でプログラムを起動し たパスを取得し、末尾に¥が付い て居ない場合は、¥を付ける。 此処で宣言した変数の有効期間は 宣言された時点から、プロシージ ャの終了迄で有る。 オブジェクト変数にオブジェクト への参照を代入する時にはSet ス テートメントを使用する。 Call ステートメントは、ジェネラ ルプロシージャ(サブルーチン) を呼び出す(制御を移す)。 CancelError プロパティを設定し て、キャンセルが選択された何う か判定出来る様にする。 Quit メソッドで Access を終了し てから、Access のインスタンスを メモリから開放する。 Unload ステートメントは、オブ ジェクトをメモリから消去するス テートメントで有る。 End ステートメントは、プログラ ムを強制的に終了するステートメ ントで有る。
' テーブル名の設定 Load frmTableInp
frmTableInp.Show vbModal Tname = lblTableName.Caption If Tname = "" Then Exit Sub
' Access ファイルのオープン Ac.OpenCurrentDatabase ( Dest ) ' CSV ファイルのインポート On Error Resume Next
Ac.DoCmd.TransferText acImportDelim, , Tname, Src, True If Not Err.Number = 0 Then
MsgBox CStr( Err.Number ) & ":" & Err.Description & vbCrLf & _ "見出し行が不適切な場合に此のエラーが発生します。", vbCritical, "エラー" Else MsgBox "CSV ファイルのインポートが完了しました。", vbOKOnly, "通知" End If On Error Goto 0 ' Access ファイルのクローズ Ac.CloseCurrentDatabase End Sub ' コマンドボタン(ACCESS→CSV)がクリックされた時の処理 Private Sub cmdACCESStoCSV_Click( )
Dim Src As String Dim Dest As String Dim Tname As String Dim Ret As Integer
' ACCESS ファイル名の設定
Src = SetFileName( ".mdb", "ACCESS ファイル(*.mdb)|*.mdb|総てのファイル(*.*)|*.*", "SRC" ) If Src = "CANCEL" Or Src = "NOEXIST" Then Exit Sub
' テーブル名の設定
Tname = SetTableName( Src ) If Tname = "" Then Exit Sub
' CSV ファイル名の設定
Dest = SetFileName( ".csv", "CSV ファイル(*.csv)|*.csv|総てのファイル(*.*)|*.*", "DEST" ) If Dest = "CANCEL" Or Dest = "EXIST" Then Exit Sub
' Access ファイルのオープン Ac.OpenCurrentDatabase ( Src ) ' CSV ファイルのエクスポート
Ac.DoCmd.TransferText acExportDelim, , Tname, Dest, False
MsgBox "CSV ファイルへエクスポートが完了しました。", vbOKOnly, "通知" ' Access ファイルのクローズ Ac.CloseCurrentDatabase End Sub '======================== ' エクセル⇔アクセス変換 '======================== 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 Load ステートメントは、オブジェ クトをメモリに読み込むステート メントで有る。 モーダルでフォームを表示すると 其のフォームを閉じる迄、他のフ ォームを操作する事は出来ない。
On Error Goto 0 は、On Error… で設定したエラートラップを解除 する構文で有る。 同じ様な処理を行う時は、ジェネ ラルプロシージャに纏めて置いた 方が、保守性も良く成る。 同じ様な処理を行う時は、ジェネ ラルプロシージャに纏めて置いた 方が、保守性も良く成る。 処理が終了すれば、メッセージボ ックスを表示して、2度実行等を 防ぐ様に考慮する。 キャンセルされた時は CANCEL フ ァ イ ル が 既 に 存 在 す る 時 は EXIST が戻り値と成る。
' コマンドボタン(EXCEL→ACCESS)がクリックされた時の処理 Private Sub cmdEXCELtoACCESS_Click( )
Dim Src As String Dim Dest As String Dim Tname As String
' EXCEL ファイル名の設定
Src = SetFileName( ".xls", "EXCEL ファイル(*.xls)|*.xls|総てのファイル(*.*)|*.*", "SRC" ) If Src = "CANCEL" Or Src = "NOEXIST" Then Exit Sub
' ACCESS ファイル名の設定
Dest = SetFileName( ".mdb", "ACCESS ファイル(*.mdb)|*.mdb|総てのファイル(*.*)|*.*", "DEST" ) If Dest = "CANCEL" Or Dest = "EXIST" Then Exit Sub
If Dir( Dest ) = "" Then Call CreateAccessFile( Dest )
' テーブル名の設定 Load frmTableInp
frmTableInp.Show vbModal Tname = lblTableName.Caption If Tname = "" Then Exit Sub
' Access ファイルのオープン Ac.OpenCurrentDatabase ( Dest )
' EXCEL ファイルのインポート(Sheet1 がインポートされる)
Ac.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, Tname, Src, True MsgBox "EXCEL ファイルのインポートが完了しました。", vbOKOnly, "通知"
' Access ファイルのクローズ Ac.CloseCurrentDatabase End Sub
' コマンドボタン(ACCESS→EXCEL)がクリックされた時の処理 Private Sub cmdACCESStoEXCEL_Click( )
Dim Src As String Dim Dest As String Dim Tname As String Dim Ret As Integer
' ACCESS ファイル名の設定
Src = SetFileName( ".mdb", "ACCESS ファイル(*.mdb)|*.mdb|総てのファイル(*.*)|*.*", "SRC" ) If Src = "CANCEL" Or Src = "NOEXIST" Then Exit Sub
' テーブル名の設定
Tname = SetTableName( Src ) If Tname = "" Then Exit Sub
' EXCEL ファイル名の設定
Dest = SetFileName( ".xls", "EXCEL ファイル(*.xls)|*.xls|総てのファイル(*.*)|*.*", "DEST" ) If Dest = "CANCEL" Or Dest = "EXIST" Then Exit Sub
If Dir( Dest ) = "" Then Call CreateExcelFile( Dest )
' Access ファイルのオープン Ac.OpenCurrentDatabase ( Src ) ' EXCEL ファイルのエクスポート
Ac.DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, Tname, Dest, False MsgBox "EXCEL ファイルへエクスポートが完了しました。", vbOKOnly, "通知"
此処では、空の ACCESS ファイ ルを生成するジェネラルプロシー ジャを呼び出して居る。 プロシージャ間で共有しない変数 は、仮令同じ名前、データ型でも グローバルにする可きでは無い。 フォーム間の値の遣り取りに、グ ローバル変数ではなく、コントロ ールを使用する方法も有る。 メッセージボックスを表示しない と、ユーザーは、作業が完了した か何うか解らない。 変数名には、解り易く、且つ、簡 潔な名前を付ける事が望ましい。 Exit Sub ステートメントは、サブ プロシージャを強制的に脱出する ステートメントで有る。 此処では、空のEXCEL ファイル を生成するジェネラルプロシージ ャを呼び出して居る。
' Access ファイルのクローズ Ac.CloseCurrentDatabase End Sub '============================== ' リッチテキスト⇔アクセス変換 '============================== ' コマンドボタン(ACCESS→RTF)がクリックされた時の処理 Private Sub cmdACCESStoRTF_Click( )
Dim Src As String Dim Dest As String Dim Tname As String Dim Ret As Integer
' ACCESS ファイル名の設定
Src = SetFileName( ".mdb", "ACCESS ファイル(*.mdb)|*.mdb|総てのファイル(*.*)|*.*", "SRC" ) If Src = "CANCEL" Or Src = "NOEXIST" Then Exit Sub
' テーブル名の設定
Tname = SetTableName( Src ) If Tname = "" Then Exit Sub
' RTF ファイル名の設定
Dest = SetFileName( ".rtf", "RTF ファイル(*.rtf)|*.rtf|総てのファイル(*.*)|*.*", "DEST" ) If Dest = "CANCEL" Or Dest = "EXIST" Then Exit Sub
' Access ファイルのオープン Ac.OpenCurrentDatabase ( Src ) ' RTF ファイルのエクスポート If chkOpenRTF.Value = 1 Then
Ac.DoCmd.OutputTo acOutputTable, Tname, acFormatRTF, Dest, True Else
Ac.DoCmd.OutputTo acOutputTable, Tname, acFormatRTF, Dest, False MsgBox "RTF ファイルへエクスポートが完了しました。", vbOKOnly, "通知" End If ' Access ファイルのクローズ Ac.CloseCurrentDatabase End Sub '================================ ' ハイパーテキスト⇔アクセス変換 '================================ ' コマンドボタン(ACCESS→HTML)がクリックされた時の処理 Private Sub cmdACCESStoHTML_Click( )
Dim Src As String Dim Dest As String Dim Tname As String Dim Ret As Integer
' ACCESS ファイル名の設定
Src = SetFileName( ".mdb", "ACCESS ファイル(*.mdb)|*.mdb|総てのファイル(*.*)|*.*", "SRC" ) If Src = "CANCEL" Or Src = "NOEXIST" Then Exit Sub
CloseCurrentDatabase メ ソ ッ ド は、カレントデータベースを閉じ るメソッドで有る。 此処で宣言した変数の有効期間は 宣言された時点から、プロシージ ャの終了迄で有る。 Or 演算子は、論理和を取る演算子 で、孰れかの条件が True に成れ ば良い場合に使用する。 OpenCurrentDatabase メ ソ ッ ド は、カレントデータベースを開く メソッドで有る。 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。
' テーブル名の設定
Tname = SetTableName( Src ) If Tname = "" Then Exit Sub
' HTML ファイル名の設定 Dest = SetFileName( ".html", _
"HTML ファイル(*.html)|*.html|HTM ファイル(*.htm)|*.htm|総てのファイル(*.*)|*.*", "DEST" ) If Dest = "CANCEL" Or Dest = "EXIST" Then Exit Sub
' Access ファイルのオープン Ac.OpenCurrentDatabase ( Src ) ' HTML ファイルのエクスポート If chkOpenHTML.Value = 1 Then
Ac.DoCmd.OutputTo acOutputTable, Tname, acFormatHTML, Dest, True Else
Ac.DoCmd.OutputTo acOutputTable, Tname, acFormatHTML, Dest, False MsgBox "HTML ファイルへエクスポートが完了しました。", vbOKOnly, "通知" End If ' Access ファイルのクローズ Ac.CloseCurrentDatabase End Sub '======================== ' ジェネラルプロシージャ '======================== ' ファイル名を設定するジェネラルプロシージャ
Private Function SetFileName(Extention As String, Filter As String, Mode As String) As String Dim S As String
On Error Resume Next cdlFile.DefaultExt = Extention cdlFile.Filter = Filter cdlFile.FileName = "" If Mode = "SRC" Then cdlFile.ShowOpen Else cdlFile.ShowSave End If
If Not Err.Number = 0 Then SetFileName = "CANCEL" Exit Function End If On Error GoTo 0 S = cdlFile.FileName If Mode = "SRC" Then If Dir( S ) = "" Then MsgBox "存在するファイルを指定して下さい!", vbExclamation, "警告" SetFileName = "NOEXIST" Exit Function End If Else
If Not Dir( S ) = "" Then
If MsgBox( "ファイルが既に存在します。" & vbCrLf & "上書きしますか?", vbYesNo, "確認" ) = vbNo Then SetFileName = "EXIST" Exit Function Filter プロパティを設定して、関 係の無いファイルが表示されるの を制限するする。 DefaultExt プロパティを設定し て、拡張子を省略した場合に、付 加する拡張子を設定する。 キャンセル釦がクリックされた時 に処理を継続しない様に、エラー トラップを設定して置く。 Dir 関数は、ファイルやディレク トリが存在するか何うかを調べる 為に使用する事が出来る。 処理結果を呼出元に返し度い場合 は、戻り値を設定する事の出来る ファンクションプロシージャを使 用する。 1行に1文を記述するのが原則で 有るが、長く成る場合は、空白と アンダースコアの組合せで複数行 に分ける事も出来る。 ファンクションプロシージャ(関 数)のデータ型は、戻り値のデー タ型を示す。 ファンクションプロシージャ名に 値を代入する事で、戻り値を設定 する。
End If End If End If SetFileName = S End Function ' テーブル名を設定するジェネラルプロシージャ
Private Function SetTableName( Target As String ) As String Dim Ws As DAO.Workspace
Dim Db As DAO.Database Dim Td As DAO.TableDef
Set Ws = DBEngine.Workspaces( 0 ) Set Db = Ws.OpenDatabase( Target ) Load frmTableSel
With frmTableSel
For Each Td In Db.TableDefs
If Not Left$( Td.Name, 4 ) = "MSys" Then .cboTable.AddItem Td.Name End If Next End With Ws.Close Set Td = Nothing Set Db = Nothing Set Ws = Nothing frmTableSel.Show vbModal SetTableName = lblTableName.Caption End Function ' 空の ACCESS ファイルを生成するジェネラルプロシージャ Private Sub CreateAccessFile( Target As String )
Dim Db As DAO.Database
Set Db = DBEngine.Workspaces( 0 ).CreateDatabase( Target, dbLangJapanese ) Db.Close
Set Db = Nothing End Sub
' 空の EXCEL ファイルを生成するジェネラルプロシージャ Private Sub CreateExcelFile( Target As String )
Dim Ex As Excel.Application Dim Wb As Excel.Workbook
Set Ex = New Excel.Application Set Wb = Ex.Workbooks.Add Wb.SaveAs Target Ex.Workbooks.Close Set Wb = Nothing Set Ex = Nothing End Sub 此等は、孰れもDAO のオブジェ クトで有る。 頭にMsys が付くテーブルは、シ ステム(MS Access)が使用して 居るテーブルなので、除外する。 DAO で指定のデータベースを開 く時の定型で有る。 問題が無い場合は、戻り値に、指 定したファイル名(フルパス)を 設定する。
For Each … Next は、コレクシ ョンから要素を1個宛取り出す構 文で有る。 使用後のオブジェクト変数は、必 ずNothing を設定して、メモリか ら開放する必要が有る。 CreateDatabase メソッドは、新 たにデータベースを作成するメソ ッドで有る。 此等は、孰れもEXCEL のオブジ ェクトで有る。 オブジェクト変数に値を代入する 時はSet ステートメントを使用す る必要が有る。 此処では必要な部分(例えば CSV→ACCESS)丈を利用し易い様にプロシージャを分けて居るが 上記のコードでは、各プロシージャに同じ様な記述が多い為、コマンドボタンをコントロール配列 に仕て、同じプロシージャ内に複数の処理を記述する事に依り、コードを簡素化する事が出来るの で、挑戦して観て欲しい。
■ プログラムリスト(frmTableInp) ■ Option Explicit
' コマンドボタン(決定)がクリックされた時の処理 Private Sub cmdFixed_Click( )
If txtTable.Text = "" Then Exit Sub frmMain.lblTableName.Caption = txtTable.Text Unload Me
End Sub
' コマンドボタン(キャンセル)がクリックされた時の処理 Private Sub cmdCancel_Click( )
frmMain.lblTableName.Caption = "" Unload Me End Sub ■ プログラムリスト(frmTableSel) ■ Option Explicit ' コンボボックスがクリックされた時の処理 Private Sub cboTable_Click( )
frmMain.lblTableName.Caption = cboTable.List( cboTable.ListIndex ) End Sub
' コマンドボタン(決定)がクリックされた時の処理 Private Sub cmdFixed_Click( )
If cboTable.ListIndex < 0 Then Exit Sub Unload Me
End Sub
' コマンドボタン(キャンセル)がクリックされた時の処理 Private Sub cmdCancel_Click( )
frmMain.lblTableName.Caption = "" Unload Me End Sub 他のフォームのオブジェクトにア クセスする場合は、フォーム名で 修飾して使用する。 呼出元のフォームでは、ラベルに 文字列が設定されて居ない事に依 り、キャンセルされた事が解る。 リストボックスの一覧から選択す る場合は、ListIndex が示す List の値を取得する。 リストボックスの一覧から選択さ れて居ない時は、フォームを閉じ ない様に仕て居る。 フォーム間で値の遣り取りを行う場合、標準モジュールに Public な変数を宣言する方法(此の方 法の場合は、総てのフォームモジュールから其の変数を使用する事が出来る)、フォームモジュー ルにPublic な変数を宣言する方法(此の方法の場合は、他のフォームから此の変数を使用する時 は、変数名をフォーム名で修飾する必要が有る)が一般的で有るが、変数を使用しないで、フォー ムに配置されたオブジェクト(コントロール)を介する方法も有る。此の用途でオブジェクトを使 用する場合、オブジェクト名をフォーム名で修飾する必要が有る。 frmMain.lblTableName 上記の場合、frmMain と謂う名前のフォームに配置された lblTableName と謂う名前のオブジェ クトと謂う事に成る。 亦、此の用途でオブジェクトを使用する場合、値を格納するプロパティには、一般的に Tag プロ パティを使用する事が多いが、画面への表示も行う場合は、Caption プロパティや Text プロパテ ィを用いる。併し、データ型が同じで有れば、何のプロパティを使用しなければ成らないと謂う様 な規制は無い。例えば、Long 型の値を受け渡す場合、BackColor プロパティを使用すると謂う極 端な事も可能で有る。
■ MS Access オブジェクトの利用 ■
■ Access のオブジェクト
Access オブジェクトは、Visual Basic の参照設定ダイアログから Microsoft Access x.x Object Library をチェックすれば使用可能と成る(但し、x.x の部分は、インストールされて居る Access のバージョン に依り異なる)。猶、Access のデータベースエンジンは、Visual Basic にも付属して居る DAO のエン ジンで有るが、Access を参照設定しても、自動的に DAO も参照設定される訳では無い。
下記に、Access の Application オブジェクトの一覧を示す。此の中に、DoCmd と謂うオブジェクトが 有るが、此れが、Access の様々な機能を Visual Basic から呼び出す為のコマンドオブジェクトで、此 のメソッドを使用してAccess アクションを実行する。
DoCmd オブジェクトのメンバ(メソッド、プロパティ、イベント等)は、Visual Basic のオブジェク トブラウザで、Access ライブラリの DoCmd を参照すると、確認する事が出来る。
DoCmd オブジェクトには、下記の様なメソッドが有る。大抵の Access の操作は、此等のメソッドに依 り、実現する事が出来る。
ApplyFilter GoToPage OutputTo SelectObject
Beep GoToRecord PrintOut SendObject
CancelEvent HourGlass Quit SetMenuItem
Close Maximize Rename SetWarnings
CopyObject Minimize RepaintObject ShowAllRecords DeleteObject MoveSize Requery ShowToolbar DoMenuItem OpenForm Restore TransferDatabase Echo OpenModule RunCommand TransferSpreadsheet FindNext OpenQuery RunMacro TransferText
FindRecord OpenReport RunSQL GoToControl OpenTable Save
猶、上記のメソッドに依り解決出来ないAccess の操作は,下記の様に仕て行なう。
関数名 該当する操作 対処
AddMenu メニューの追加 (なし)
MsgBox メッセージボックス MsgBox 関数を使用
RunApp アプリケーションの実行 Shell 関数を使用して他のアプリケーションを実行 RunCode プロシージャの実行 関数をVisual Basic で直接実行
SendKeys キー送信 SendKeys ステートメントを使用 SetValue 値の代入 値をVisual Basic で直接設定 StopAllMacros 全マクロの中止 (なし)
Access オブジェクトの OpenCurrentDatabase メソッド
既存のAccess データベース(mdb)をカレントデータベースと仕て開くメソッド
Object.OpenCurrentDatabase dbname[, exclusive ]
此のメソッドを使用すると、オートメーション(旧称 OLE オートメーション)に依り、ア プリケーションからAccess データベースを開く事が出来る。 dbname には、パス名とファイル名の拡張子を含む既存のデータベースファイルの名前を示す文字列式 を指定し、必ず指定する(ネットワークパスを指定する場合は、其のネットワークでサポートされて居 る書式を指定:¥¥Server¥Share¥Folder¥Filename) exclusive には、データベースを排他モードで開くか何うかを指定し、省略可能する事が出来る。 アプリケーションで Access のインスタンスを作成した場合は、新しいデータベースを作成するか、又 は、特定のデータベースを指定して開く必要が有る。此のデータベースは、Access ウィンドウで開かれ る。 Access ウィンドウでデータベースが既に開いて居る状態で、別のデータベースを開く場合は CloseCurrentDatabase メソッドを使用して、開いて居るデータベースを閉じる必要が有る。 猶、排他モードでデータベースを開くには、exclusive 引数に True を設定する。此の引数を省略すると データベースは共有モードで開かれる。
OpenCurrentDatabase メソッドを、ActiveX データオブジェクト(ADO)の Open メソッドや DAO のOpenDatabase メソッドと混同しない様に注意する必要が有る。OpenCurrentDatabase メソッドは、 データベースをAccess ウィンドウで開く。一方、ADO の Open メソッドは、Connection オブジェク ト変数を返し、DAO の OpenDatabase メソッドは、Database オブジェクト変数を返すが、其等は孰 れも特定のデータベースを示す物で、実際には其のデータベースをAccess ウィンドウで開かない。 Access オブジェクトの CloseCurrentDatabase メソッド カレントデータベースを閉じるメソッド Object.CloseCurrentDatabase アプリケーションからカレントデータベース(Access データベース.mdb や Access プロジェ クト.adp)を閉じる事が出来る。 CloseCurrentDatabase メソッドを使用して、Access のカレントインスタンスで開いて居るデータベー スを閉じると、Access のインスタンスを新たに作成しなくても別のデータベースを開く事が出来る。 CloseCurrentDatabase メソッドは、アプリケーションから、オートメーションを介して Access データ ベースを開いて居る場合に便利で有る。 CloseCurrentDatabase メソッドは、CloseCurrentDatabase メソッドと対を為すメソッドで有り、開 いたデータベースは、必ず閉じる様にする必要が有る。 機 能 書 式 解 説 機 能 書 式 解 説
Access オブジェクトの Quit メソッド Access を終了するメソッド
Object.Quit [option]
Access を終了する。引数の指定に依り、終了の前にデータベースオブジェクトを保存する事 も出来る。 option には、Access 終了時に未保存のオブジェクトに対する処理を下記の定数で指定し、省略する事 が出来る。 定数 内容 acSaveYes ダイアログボックスを表示せずに総てのオブジェクトを保存する。 此の値が、既定値で有る。 acPrompt 変更されて居るにも拘らず、保存されて居ない総てのオブジェクトに付いて、保存す るか何うかを確認するダイアログボックスを表示する。 acExit 変更されたオブジェクトは、保存されない。 Quit メソッドの機能は、[ファイル]メニューの[終了]をクリックした場合と同じで有る。 Access.DoCmd オブジェクトの Close メソッド (参考) 閉じるアクションを実行するメソッド
Object. DoCmd.Close [objecttype, objectname], [save]
指定した Access ウィンドウを閉じる。猶、ウィンドウを指定しない場合は、アクティブな ウィンドウが閉じられる。 objecttype には、ウィンドウを閉じるオブジェクトの種類を下記の定数で指定し、省略する事が出来る。 acDataAccessPage データアクセスページを対象とする。 acDefault(既定値) アクティブウィンドウを対象とする。 acDiagram ダイアグラムを対象とする。 acForm フォームを対象とする。 acMacro マクロを対象とする。 acModule モジュールを対象とする。 acQuery クエリを対象とする。 acReport レポートを対象とする。 acServerView サーバービューを対象とする。 acStoredProcedure ストアドプロシージャを対象とする。 acTable テーブルを対象とする。 objectname には、閉じるオブジェクトの名前を文字列式で指定し、省略する事が出来る。 save には、オブジェクトを閉じる時に、オブジェクトに加えた変更を保存するか何うかを下記の定数で 指定し、省略する事が出来る。 acSaveNo 変更を保存せずに閉じる。 acSavePrompt(既定値) 閉じる前に確認を行うダイアログボックスを表示する。 acSaveYes 自動的に変更を保存する。 機 能 書 式 解 説 機 能 書 式 解 説
Access.DoCmd オブジェクトの TransferText メソッド
TransferText(テキスト変換)アクションを実行するメソッド
Object.DoCmd.TransferText [transfertype][, specificationname], tablename, filename [, hasfieldnames][, HTMLtablename][, codepage]
Access のカレントデータベース(mdb)や Access プロジェクト(adp)とテキストファイ ルとの間でテキストをインポート、又は、エクスポートする。 transfertype には、変換の種類を下記の定数で指定し、省略する事が出来る。 定数 意味 acExportDelim 区切記号付きテキストファイルにデータをエクスポート ◎ acExportFixed 固定長テキストファイルにデータをエクスポート◎ acExportHTML HTML ファイルにデータをエクスポート acExportMerge Word の差込文書のデータファイルにデータをエクスポート◎ acImportDelim(既定値) 区切記号付きテキストファイルからデータをインポート ◎ acImportFixed 固定長テキストファイルからデータをインポート ◎ acImportHTML HTML ファイルからデータをインポート acLinkDelim 区切記号付きテキストファイルをカレントデータベースにリンク acLinkFixed 固定長テキストファイルをカレントデータベースにリンク acLinkHTML HTML ファイルをカレントデータベースにリンク ※ Access プロジェクトでは、◎印而巳が使用可能 Word の差し込み文書のデータファイルにデータをエクスポートした後は、Word の差し込み印刷機能 を使用して、定型書簡や宛名ラベル等の差込文書を作成する事が出来る。 specificationname には、テキストファイルをインポート、エクスポート、リンクする時の設定の定義 名を文字列式で指定し、省略する事が出来る。 固定長テキストファイルの場合、此の引数を指定するか、又は、インポート、エクスポート、リンク するテキストファイルと同じフォルダに有るschema.ini ファイルを使う必要が有る。 区切記号付きテキストファイルでは、此の引数に定義名を入力しなくても、インポート、エクスポー ト、リンクが出来る。 Word の差込文書の場合は、予め定義された書式が使われるので、此の引数に定義名を入力する必要 は無い。 HTML ファイルに対しては、インポートやエクスポート定義を使用出来るが、此の定義のデータ型の 書式定義の部分而巳が適用される。 tablename には、テキストデータとのインポート、エクスポート、リンクを行う Access テーブルの名 前、又は、結果をテキストファイルにエクスポートする Access クエリの名前を文字列式で指定し、必 ず指定する。 transfertype に、acImportDelim、acImportFixed、acImportHTML を指定した場合、指定したテー ブルが既に存在する時は、テキストデータは此のテーブルに追加され、存在しない時は、新しいテー ブルが作成され、指定したテキストデータがインポートされる。 Access 2000 では、此のアクションを使用する時には、エクスポートするデータを指定する為に SQL ステートメントを使用する事は出来ない。SQL ステートメントの代わりに、クエリを作成して、其の クエリの名前を此の引数に指定する。 機 能 書 式 解 説
filename には、インポート、エクスポート、リンクを行うテキストファイルの、パスを含めた完全な名 前を文字列式で指定し、省略する事は出来ない。 Access のデータをエクスポートすると、新しいテキストファイルが作成される。同名のテキストファ イルが既に存在する場合は、既存のテキストファイルは削除される(上書きされる)。 hasfieldnames には、テキストファイルの先頭行をフィールド名とするか何うかを指定し、省略する事 が出来る。 インポート、エクスポート、リンク時に、テキストファイルの最初の行をフィールド名と仕て使用す るにはTrue を、通常のデータと仕て扱うには False を指定し、省略した場合は、False と成る。 此の引数は、Word の差込データファイルに対しては、最初の行に常にフィールド名が含まれて居る 為、無視される。 此の引数にTrue を指定して、Access のテーブルや選択クエリのデータを区切記号付きテキストファ イルや固定長テキストファイルにエクスポートすると、テーブルや選択クエリのフィールド名がテキ ストファイルの先頭行に挿入される。 固定長テキストファイルをインポートやリンクする場合で、此の引数に True を指定した場合は、フ ィールド名を含む先頭行では、定義されて居る区切記号を使う必要が有る。亦、固定長テキストファ イルをエクスポートする場合で、此の引数に True を指定した場合は、定義されて居る区切記号がフ ィールド名を含む先頭行に挿入される。 HTMLtablename には、インポートやリンクする HTML ファイル内のテーブルやリストの名前を文字 列式で指定し、省略する事が出来る。
此の引数は、引数transfertype に acImportHTML か acLinkHTML が設定されて居る場合は無視さ れる。省略した場合は、HTML ファイル内の最初のテーブルかリストがインポートやリンクされる。 HTML ファイル内のテーブルの名前やリストの名前は、<CAPTION> タグが有る場合は、其のタグ で指定されたテキストに依り決まる。<CAPTION> タグが無い場合は、<TITLE> タグで指定された テキストに成る。複数のテーブルやリストが同じ名前の場合、各ファイル名や各リスト名の後ろに番 号を付けて区別される。 codepage には、コードページで使われる文字セット示す長整数型の値を指定し、省略する事が出来る。 構文の途中に有る引数を省略する場合、引数のカンマは省略出来ない。亦、後に続く引数を指定しない 場合は、最後に指定した引数の後ろにはカンマは付けない。 ActiveX データオブジェクト(ADO)を使用してリンクを作成するには、Recordset オブジェクトに ActiveConnection プロパティを使用する。 Access の選択クエリのデータをテキストファイルにエクスポートする事が出来、亦、クエリの結果セッ トもテーブルと同じ様にエクスポートされる。 テキストデータを既存の Access のテーブルに追加する場合は、テキストデータとテーブルは同じ構造 で有る必要が有る。即ち、対応するテキストとテーブルの各フィールドのデータ型は同じでなければ成 らず、亦、フィールドの順番も同じでなければ成らない。猶、引数hasfieldnames に True を指定した 場合は、テキストのフィールド名とテーブルのフィールド名が同じで有る必要が有る。 リンクしたテキストファイルに対してクエリを実行するか、又は、フィルタを懸ける場合は、大文字と 小文字は区別される。
Access.DoCmd オブジェクトの TransferSpreadsheet メソッド
TransferSpeadsheet(ワークシート変換)アクションを実行するメソッド
Object.DoCmd.TransferSpreadsheet [transfertype][, spreadsheettype], tablename, filename[, hasfieldnames][, range]
Access のカレントデータベース(mdb)や Access プロジェクト(adp)とワークシートフ ァイルとの間でデータをインポート、又は、エクスポートする。 transfertype には、変換の種類を下記の定数で指定し、省略する事が出来る。 定数 意味 acImport(既定値) インポートする。 acExport エクスポートする。 acLink リンクする。 ※ リンクは、Access プロジェクトでは、サポートされない。 spreadsheettype には、ワークシートの種類を下記の定数か値で指定し、省略する事が出来る。 値 定数 意味 0 acSpreadsheetTypeExcel3(既定値) MS Excel 6 acSpreadsheetTypeExcel4 MS Excel 5 acSpreadsheetTypeExcel5 MS Excel 5 acSpreadsheetTypeExcel7 MS Excel 8 acSpreadsheetTypeExcel8 MS Excel 8 acSpreadsheetTypeExcel9 MS Excel 2 acSpreadsheetTypeLotusWK1 Lotua 1-2-3 3 acSpreadsheetTypeLotusWK3 Lotua 1-2-3 7 acSpreadsheetTypeLotusWK4 Lotua 1-2-3 4 acSpreadsheetTypeLotusWJ2 Lotua 1-2-3(日本語バージョン而巳) Lotus 1-2-3 のワークシートファイルのデータにリンクする事が出来るが、此のデータは、Access 内 では、参照而巳が可能で有る。亦、Lotus .WK4 ファイルとのインポートやリンクは、参照而巳が可 能だが、Access のデータを此のワークシート形式にエクスポートする事は出来ない。更に Lotus .WKS とExcel Version 2.0 のワークシートとのデータのインポート、エクスポート、リンクは、此のメソ ッドではサポートされない。 tablename には、ワークシートのデータとのインポート、エクスポート、リンクを行う Access テーブ ルの名前、又は、結果をワークシートにエクスポートする Access 選択クエリの名前を文字列式で指定 し、必ず指定する 引数transfertype で acImport を指定した場合、指定したテーブルが既に存在する時は、ワークシー トのデータは、其のテーブルに追加され、亦、存在しない時は、新しいテーブルが作成されて、指定 したワークシートのデータがインポートされる。 Access 2000 では、此のアクションを使用する時に、SQL ステートメントを使用してエクスポートす るデータを指定する事は出来ない。SQL ステートメントを使用する代わりに、クエリを作成してから 其のクエリの名前を此の引数に指定する必要が有る。 機 能 書 式 解 説
filename には、インポート、エクスポート、リンクを行うワークシートファイルの、パスを含めた完全 な名前を文字列式で指定し、省略する事は出来ない。 Access のデータをエクスポートすると、新しいワークシートが作成される。同名のワークシートが既 に存在する場合は、既存のテキストファイルは削除される(上書きされる)。但し、Excel 5.0、7.0、 8.0、Excel 2000 形式のワークシートにエクスポートする場合は、エクスポートするデータが既存の ワークシートに追加される。
Excel 5.0、7.0、8.0、Excel 2000 形式のワークシートのデータをインポートやリンクする場合は、range 引数を使用して特定のワークシートを指定する事が出来る。
hasfieldnames には、ワークシートの先頭行をフィールド名とするか何うかを指定し、省略する事が出 来る。
インポート、エクスポート、リンク時に、ワークシートの最初の行をフィールド名と仕て使用するに はTrue を、通常のデータと仕て扱うには False を指定し、省略した場合は、False と成る。
此の引数は、Word の差込データファイルに対しては、最初の行に常にフィールド名が含まれて居る 為、無視される。 Access テーブルや選択クエリのデータをワークシートにエクスポートする場合は、此の引数に何を指 定も、フィールド名がワークシートの最初の行に挿入される。 range には、ワークシートの有効なセルの範囲や範囲の名前を文字列式で指定し、省略する事が出来る。 此の引数は、インポート而巳に適用され、ワークシート全体をインポートする場合は、此の引数を指 定する必要は無い。セル範囲を指定する場合は、ワークシートの範囲名を入力するか、『A1 : E25』 等のセル範囲を指定する。
但し、Access 97 と Access 2000 では、『A1..E25』の構文は、使用する事は出来ない。亦、Excel 5.0、 7.0、8.0、Excel 2000 形式のワークシートからインポートやリンクする場合は、セル範囲の前にワー クシート名と感嘆符を付けてワークシートを指定する事も出来る(ワークシート名!A1 : C7 等)。 猶、ワークシートにエクスポートする場合は、此の引数を指定しない。範囲を入力すると、エクスポ ートは失敗する。 構文の途中に有る引数を省略する場合、引数のカンマは省略出来ない。亦、後に続く引数を指定しない 場合は、最後に指定した引数の後ろにはカンマは付けない。 ActiveX データオブジェクト(ADO)を使用してリンクを作成するには、Recordset オブジェクトに ActiveConnection プロパティを使用する。 Access の選択クエリのデータをワークシートにエクスポートする事が出来、亦、クエリの結果セットも テーブルと同じ様にエクスポートされる。 ワークシートのデータを既存の Access のテーブルに追加する場合は、ワークシートのデータとテーブ ルは同じ構造で有る必要が有る。即ち、対応するワークシートとテーブルの各フィールドのデータ型は 同じでなければ成らず、亦、フィールドの順番も同じでなければ成らない。猶、引数hasfieldnames に True を指定した場合は、ワークシートのフィールド名とテーブルのフィールド名が同じで有る必要が 有る。 リンクしたワークシートに対してクエリを実行するか、又は、フィルタを懸ける場合は、大文字と小文 字は区別される。
編集モードで開いたExcel のワークシートにリンクする場合は、Access は、其の Excel のワークシート が編集モードで無く成る迄、待ってから、リンクを行う。此の場合、タイムアウトが発生して処理が中 断される事は無い。
Access.DoCmd オブジェクトの OutputTo メソッド
OutputTo(出力)アクションを実行するメソッド
Object.DoCmd.OutputTo objecttype[, objectname][, outputformat][, outputfile] [, autostart][, templatefile]
Access のデータベースオブジェクト(データシート、フォーム、レポート、モジュール、デ ータアクセスページ)のデータを、様々な形式で出力する。
OutputTo メソッドは、指定した Access のデータベースオブジェクトのデータを、Excel(xls)、MS-DOS のテキスト形式(txt)、リッチテキスト形式(rtf)、HTML 形式(html)、IDC/HTX 形式、ASP 形式 で出力する。 objecttype には、出力するデータを含むオブジェクトの種類を下記の定数で指定し、必ず指定する。 定数 意味 acOutputDataAccessPage データアクセスページを出力 acOutputForm フォーム(フォームかフォームのデータシートの場合)を出力 acOutputModule モジュールを出力 acOutputQuery クエリ(クエリのデータシートの場合)を出力 acOutputReport レポートを出力 acOutputServerView サーバービューを出力 acOutputStoredProcedure ストアドプロシージャを出力 acOutputTable(既定値) テーブル(テーブルのデータシートの場合)を出力 マクロは出力出来ない。アクティブオブジェクトを出力する場合は、此の引数で、オブジェクトの種 類を指定し、引数objectname は指定しない。 objectname には、出力するデータを含むオブジェクトの名前を文字列式で指定し、省略する事が出来 る。
OutputTo メソッドを含む Visual Basic のコードをライブラリ データベースで実行する場合は、こ の名前のオブジェクトが、最初にライブラリ データベースで、次にカレント データベースで探索さ れます。 ライブラリ データベースで OutputTo メソッドを実行すると、此処で指定した名前のオブジェクト が、先ずライブラリデータベースで検索され、次にカレントデータベースで検索される。 outputformat には、データの出力形式を下記に定数で指定し、省略する事が出来る。 定数 意味
acFormatASP Microsoft Active Server Pages 形式(asp)で出力 acFormatDAP Microsoft データアクセスページ形式(html)で出力 acFormatHTML HTML 形式(html)で出力
acFormatIIS Microsoft Internet Information Server 形式(iis)で出力 acFormatRTF リッチテキスト形式(rtf)で出力
acFormatSNP
acFormatTXT MS-DOS テキスト形式(txt)で出力 acFormatXLS Microsoft Excel 形式(xls)で出力 機 能
書 式
モジュールは、MS-DOS のテキスト形式で、亦、データアクセスページは、HTML 形式でしか出力 する事は出来ない。
Microsoft Internet Information Server 形式と Microsoft Active Server Pages 形式は、テーブル、ク エリ、フォームでしか使用する事は出来ない。
此の引数を指定しない場合は、出力形式を確認するダイアログボックスが表示される。
outputfile には、データの出力先ファイル名を、パスを含めた完全な名前を文字列式で指定し、省略す る事が出来る。
通常、拡張子には、引数outputformat に指定した出力形式に対応した標準のファイル名拡張子を付 ける。Microsoft Internet Information Server や Microsoft Active Server Pages のファイルに出力す る場合は、標準のhtx、idc、asp と謂うファイル名拡張子の付いたファイルが作成される。データア クセスページを出力する場合は、html と謂うファイル名拡張子の付いたファイルが作成される。 此の引数を指定しないと、出力ファイル名を確認するダイアログボックスが表示される。 autostart には、実行後、引数 outputfile で指定したファイルに対応するソフトウェアを起動して、其 のファイルを開くか何うかを指定し、省略する事が出来る。 適切な Windows ベースのアプリケーションを直ちに起動する場合は True を、起動しない場合は False を指定する。此の引数に True を指定した時、xls ファイルの場合は Excel、txt ファイルの場 合はWindows メモ帳、rtf ファイルの場合は Word、html ファイルの場合は、既定のインターネッ トブラウザが起動する。猶、此の引数は、Microsoft Internet Information Server のファイル(htx、 idc)と Active Server Pages のファイル(asp)に対しては無視される。
templatefile には、HTML ファイル、HTX ファイル、ASP ファイルのテンプレートと仕て使用するフ ァイル名を、パスを含めた完全な名前を文字列式で指定し、省略する事が出来る。 テンプレートファイルとは、HTML タグを含むファイルで有る。 構文の途中に有る引数を省略する場合、引数のカンマは省略出来ない。亦、後に続く引数を指定しない 場合は、最後に指定した引数の後ろにはカンマは付けない。 モジュールは、MS-DOS のテキスト形式でしか出力する事が出来ないので、引数 objecttype に acOutputModule を指定すると、引数 outputformat には acFormatTXT を指定する必要が有る。
亦、Microsoft Internet Information Server 形式と Active Server Pages 形式は、テーブル、クエリ、 フォームに対してしか使う事が出来ないので、引数outputformat に acFormatIIS か acFormatASP を 指定する場合は、引数objecttype に acOutputTable、acOutputQuery、acOutputForm を指定する必 要が有る。