Visual BasicからAccess95オブジェクトを使う

OLEオートメーションは、Windows上でコンポーネント指向プログラミングあるいは操作環境を実現するキーである。Visual Basic 4.0にはAccess95と同じDAOを使ったデータアクセスの機能があるが、OLEオートメーションを使えば、Access 95固有の機能までもVisual Basicから利用することが可能だ。

酒井 法雄

●データアクセス比較 Access 95 vs Visual Basic 4.0

奇しくも、本誌の発売日と初めての32bit版であるAccess 95の発売日は同じである。Accessといえば、RDBMS(リレーショナルデータベース)アプリケーションを手軽に作ることができるというので、非常に人気の高いソフトウェアである。我が国でも1.1、2.0がすでに発売されているので、今回のAccess 95は3代目である(バージョンはWordに合わせて7.0になっている)。

しかし、我々にはデータアクセス機能を持つVisual Basic 4.0がある。実は、日本語版が発売されなかったVisual Basic 3.0には、Access 1.1と同様のデータベースエンジンJetが搭載されており、DAO(Data Access Object)を使ったデータアクセスプログラムを作ることができた。さらに、Office Developer's Kitで供給されたAccess 2.0 Compatibility Layerを使えば、構文こそVisual Basic 3.0のDAOながらも、Access 2.0形式のデータベースファイルの読み書きが可能であった。

そして、Visual Basic 4.0である。Access 95より数ヶ月早く発売されたVisual Basicには、なんと早くもAccess 95のデータベースファイルの読み書きができるようになっていた。それもそのはず、データアクセスをするDAOは本当のOLEオブジェクト、すなわちOLEサーバーとして存在しており、まったく同じものをOLEオートメーションで利用しているに過ぎないのだ(以前のDAOはDLL呼び出しであった)。つまり、データアクセスの仕組みに関しては、Visual Basic 4.0もAccess 95もまったく同じなのである。もっとも、現実にはAccess 95用のものはバグフィックスや小改良がなされている模様であり、同様の変更はVisual Basic 4.0 Enterprise Editionにもほどこされているようだ。

しかし、Access 95には数々の新しい機能があるという。そして、従来Access Basicと呼ばれていた言語仕様は、VBA(Visual Basic for Applications Edition)なっており、OLEオートメーションを使ってVisual Basicや他のアプリケーションから呼び出すことかができるようになっている。それならば、Access 95固有の機能をVisual Basicから使ってみようではないかというのが、本稿の趣旨である。

もっとも先に述べたように、Access 95とVisual Basic 4.0のデータアクセスの機能は基本的に同じものを使うのだから、まったく同じである。それでは意味がない。実は、レプリケーション機能など、早くからAccess 95のウリを聞いていたので、そのへんの機能を使うことを考えていたのだが、よくよく調べてみるとすでにVisual Basic 4.0にも実現されていた機能であったのだ。Visual Basic 4.0の内容は以前に比較して膨大になっている。私などは時代の要求から、Windows 95ガジェットやリモートOLEオートメーション、RDOなどを中心に触ってきたものだから、古い(と思っていた)DAOにはほとんど手を出していなかったのである。まったく情けない話である。

●Access 95オブジェクトとは

そこで、AccessにありながらVisual Basicにはない部分、すなわちDAOでないがOLEオブジェクトとして提供されているものはないだろうか? 出版社経由で手元に届いたAccessのPreview Programは完全なセットではなかったので、ヘルプの中から探し出すことしかできない。とはいえ、そんなことをやっていてはラチが開かない。

こんなときに意外にも便利なのが、Visual Basicの[ツール][参照設定]ダイアログである。ここには、ライブラリ、すなわちOLEサーバーの一覧が表示される。OLEオートメーションが使えるものがすべて分かるというワケだ。そこから使いたいものを選択すれば、まるでVisual Basicの一部であるかのようにOLEサーバーを使うことができる。

ここでも、この便利な参照設定ダイアログを開いてみた。すると、図のように、「Microsoft Access for Windows 95」というライブラリを発見できた。

参照設定

Visual BasicからAccessオブジェクトを使うために[ツール][参照設定] メニューで指定する。


使うことのできるオブジェクトは分かった。このAccessオブジェクトを使って何ができるかを調べ、プログラムを作り原稿を書かねばならないのだ。

参照設定で指定したオブジェクトについては、オブジェクトブラウザで内容を確認することができる。これは、[表示][オブジェクトブラウザ]メニューあるいは{F2}キーを押して表示することができる。オブジェクトブラウザを見ると、「ライブラリ/プロジェクト一覧」のドロップダウンリストボックスから「Access - Microsoft Access for Windows 95」という項目を選ぶ。すると、図のようにAccess95のオブジェクトに含まれるクラス、モジュールの一覧が左側のリストボックスに表示される。ここからクラスを選べば、右側のリストボックスでプロパティやメソッドを知ることができる。ここからさらにプロパティまたはメソッドを選ぶと、下にプロトタイプが表示されるというワケだ。

オブジェクトブラウザ

{F2}キーを押してオブジェクトブラウザを見ると、Access95のオブジェクトの内容を知ることができる。詳しくは、Access95のヘルプで'Applicationオブジェクト'で検索する。


しかし、オブジェクトブラウザでできるのはここまでである。名前などからオブジェクトの概要は見当がつくものの、その内容を直接知ることはできない。<ヘルプ>ボタンを押してもオブジェクトブラウザのヘルプが出るだけである。そこで、ここからはAccess 95のヘルプを参照することにしよう。

● Access95のオブジェクト

Access 95を起動しヘルプを探すと、「Application」または「Access」という項目が見つかるここにすべては書いてあるハズだ。

OLEオートメーションを使ったことがあれば、この手のアプリケーションやオブジェクトは階層構造を持っていることはご存じだろう。そして、このオブジェクトの階層構造には、オブジェクトの配列とも言えるコレクションも含まれてるのがふつうだ。むしろ、単なるオブジェクトの方が少ないくらいである。AcccessのApplicationオブジェクトの階層構造は、図のようになっている。ここからも分かるように、このオブジェクトは比較的カンタンな構造である。つまり、アプリケーション自体の下にはコレクションとしてFormやレポートがある以外には、ScreenとDoCmdという二つのオブジェクトしかない。このうち、役に立ちそうなのはApplicationオブジェクトそのもののと、DoCmdオブジェクトだろう。

Access95のオブジェクト

Access95のオブジェクト階層構造


次に、Access 95のApplication、Screen、DoCmdオブジェクトのプロパティ、メソッド、イベントの一覧を示す。詳しい内容については、Access 95のオンラインヘルプを参照していただきたい。

これらのプロパティやメソッドなどをざっと眺めていくと、使えそうなApplicationとDoCmdオブジェクトの使い道が見えてくる。

Applicationオブジェクトは、アプリケーション自体の外観な機能などに関するオブジェクトである。通常、OLEオブジェクトは非表示であるが、Accessの持つ強力なデータベーステーブルのデザインや編集機能をVisual Basicから使いたいといったときには、VisibleプロパティをTrueにすればよさそうだ。

Applicationオブジェクト

プロパティ

  • MenuBar
  • ShortcutMenuBar
  • Visible
  • Application
  • CodeContextObject
  • CurrentObjectType
  • CurrentObjectName
  • DBEngine
  • hWndAccessApp
  • Parent
  • UserControl

メソッド

  • BuildCriteria
  • CloseCurrentDatabase
  • DefaultWorkspaceClone
  • Echo
  • GetOption
  • SetOption
  • NewCurrentDatabaseee
  • OpenCurrentDatabasee
  • Quit
  • RefreshTitleBar
  • Run

イベント

フォーカス

Screenオブジェクト

プロパティ

DoCmdオブジェクト

メソッド

DoCmdオブジェクトにあるのは、Access 95の持ついわゆるアクションの機能である。テーブル、フォーム、レポートのオープンやデザイン、さらには異なるデータ形式ファイルとのやり取りなどの機能がある。これらのオブジェクトが使えれば、Visual BasicにもついてくるDAOを越えた機能が実現できるハズだ。

ただし、Access 95のアクションの中には、DoCmdオブジェクトではサポートされていない機能もある。しかし、ものによっては他の解決法も示されている。一覧を次に示す。

サポートされないアクション 解決法

"AddMenu/メニューの追加"

"MsgBox/メッセージボックス" MsgBox 関数を使用する。

"RunApp/アプリケーションの実行" Shell 関数を使用して他のアプリケーションを実行する。

"RunCode/プロシージャの実行" 関数を Visual Basic で直接実行する。

"SendKeys/キー送信" SendKeys ステートメントを使用する。

"SetValue/値の代入" 値を Visual Basic で直接設定する。

"StopAllMacros/全マクロの中止"

"StopMacro/マクロの中止"

では、早速Access 95のオブジェクトをVisual Basicから使ってみよう。これには、OLEオートメーションオブジェクトを作成する必要がある。OLEオートメーションをお使いになったことがあればご存じだろうが、これには二つの方法がある。

一つは、レイトバインドと呼ばれる方法である。CreateObjectまたはGetObjectという関数を使って指定したクラスに対応するOLEサーバーを起動するというものだ。クラスに対応するアプリケーションの物理的なファイルは、レジストリデータベースによって管理されている。レジストリデータベースは、Windows NTやWindows 95ではWIN.INIやSYSTEM.INIに代わるものとして知られているが、実はWindows 3.1のときからDDEやOLEに使われていたのである。この方法は、後述するアーリーバインドに比較して動作が遅いという話もあるが、使いたいときにオブジェクトを自由に起動、作成できるメリットがある。もっともスタンダードな使い方である。次に例を示す。

クラス名は「Access.Application」であり、最後の「.7」は明示してバージョン7のオブジェクトであることを指定したいときだけに使われる。通常は、「.7」を省略すれば最新版のオブジェクトが使われることになる。

Dim appAccess As Access.Application

Set appAccess = CreateObject("Access.Application.7")

もう一つの方法が、アーリーバインドと呼ばれる方法で、こちらはあらかじめ参照設定ダイアログで使うことを決めておき、Visual Basicからはまるで最初からあった言語仕様であるかのようにオブジェクトを使うことができるというものだ。次の例でもクラス名が"(ダブルクオーツ)でくくられていないことに注意してほしい。また、前者は宣言とオブジェクトの作成が別々に行われていて自由度が高いが、後者は一行で行っているため、オブジェクト変数の有効範囲に注意する必要がある。

Dim appAccess As Access.Application

Set appAccess = New Access.Application

または

Dim appAccess As New Access.Application

以上、いずれの方法でもオブジェクトを作成することができる。オブジェクトの削除は、オブジェクト変数の寿命がなくなったときか、プログラムの終了したとき、または次のようにキーワードNothingを使って明示することもできる。

Set appAccess = Nothing

オブジェクトの作成、削除ともに気をつけて欲しいのは、ふつうの変数のように単純に代入するのではなくて、Setキーワードを使うということだ。これは、プロパティプロシージャで、Property LetとProperty Setでの違いがあったように、通常の変数はLetキーワードを使って代入する(Letは通常省略される)が、オブジェクトのときにはSetキーワードが必須になるというコトだ。

こうして作成したAccessオブジェクトは、画面には現れない。ただし、Windows 95のタスクバーには表示される。ここで、次の一文を実行すれば、アプリケーションを表示することができる。

appAccess.Visible = True

ここまでくればひと安心だ。Access 95環境を公開されたオブジェクトを使って操作する前準備ができたわけだ。

実際にここからAccess 95を使うためには、データベースのファイルのことを考えなくてはならない。これには二つの方法がある。カンタンに言えば、新しいデータベースファイルを作成するか、既存のデータベースファイルを読み込むかということだ。ここで使うのは、Applicationオブジェクトにある次のメソッドだ。

OpenCurrentDatabase 既存のデータベースファイルを開く

NewCurrentDatabase 新しいデータベースファイルを作成して開く

CloseCurrentDatabase 現在のデータベースファイルを閉じる

これらをはじめとするメソッドを使い、データベースファイル、オプション、アプリケーションについて操作をすることができる。通常、Visual BasicからAccess 95オブジェクトを扱うメリットは、DAO以外のAccess 95の機能を使うことだから、既存のデータベースファイルを開いてメンテナンスができるとか、別のデータベースやファイル形式とのコンバート、あるいはレポートを印刷できるといったことだから、既存のデータベースを開くことになるだろう。

OpenCurrentDatabaseメソッドの使用例を次に示す。ここでは、"TEST.MDB"というファイルを共有モードで開いている。排他モードで開くときには、2番目の引数をTrueにすればよい。

appAccess.OpenCurrentDatabase "TEST.MDB", False

データベースファイルを開くことができたら、ここからがAccess 95オブジェクト操作の本番だ。ここからできることは、DoCmdオブジェクトにあるメソッドを眺めてみれば見当がつく。いろいろと面白いこともできそうだが、時間もページも限られていることでもあるし、ここでは次のような操作をしてみることにしよう。

まずは手始めに、テーブルをオープンしてみよう。Accessでは、テーブルのデザインビュー、データシートビューがある。これらが使えれば、テーブル構造の変更やデータのメンテナンスはAccess 95の持つ高機能な環境をVisual Basicから呼び出すことができるわけだ。

テーブルを開くのは、DoCmdオブジェクトのOpenTableメソッドだ。このメソッドを使えば先に述べた二つのビューの他にプレビューも可能であり、ここからテーブルの内容を印刷をすることもできる。

OpenTableメソッドの概要

Visual Basic "OpenTable/テーブルを開く" アクションを実行する。

構文

DoCmd.OpenTable tablename [, view] [, datamode]

指定項目 内容

tablename カレント データベースのテーブルの有効名を文字列式で指定する。

view 次のいずれかの組み込み定数を指定する。

acNormal acDesign acPreview

datamode 次のいずれかの組み込み定数を指定する。

acAdd acEdit acReadOnly

Addressテーブルをデータシートビューで編集可能モードで開く。

appAccess.DoCmd.OpenTable "Address", acNormal, acEdit

●テーブル一覧の取得

ここで重要なのは、テーブル名の指定である。DoCmdオブジェクトの各メソッドでは、テーブルやレポートの指定をすることができるだけで、実際にデータベースファイルに含まれるテーブルやレポートの一覧を取得することはできない。

そこで思い出すのが、Access 95のオブジェクト構造だ。ここには、フォームやレポートのコレクションがあった。しかし、これらのコレクションは実際にすでに開かれているオブジェクトのみに適用されるものであり、ファイルに含まれているものではないのだ。まして、テーブルについてはここにはコレクションはない。

そこで、思い出してほしいのはDAOである。DAOにはDatabaseオブジェクトの下にTableDefsコレクションがあり、テーブルの一覧を得ることができた。そこで、ここの部分だけはDAOを使うことにしよう。次のような構文で、テーブルの一覧をコンボボックスに表示することが可能だ。

appAccess.OpenCurrentDatabase lblDBName.Caption, False
    Set db = appAccess.DBEngine.Workspaces(0).Databases(0)
    For Each tb In db.TableDefs
        cboTables.AddItem tb.Name
    Next

こうして、Access 95オブジェクトを作成し、テーブルの一覧を得、指定したテーブルを指定したモードで開くことができる。

※一覧の取得例。MSsysXXXというテーブルは内部的に使われているもので、Access 95からは見ることはできないが、素のままのDAOからは知ることができる。このままテーブルを見ることも可能だ。


次に、サンプルのコードおよび実行例を示す。

Option Explicit

Dim appAccess As Access.Application
Dim db As Database

'Chenge Visible
Private Sub chkVisible_Click()
    appAccess.Visible = -chkVisible.Value
End Sub

' Get Tables from DB
Private Sub GetTable()
    Dim tb As TableDef
    
    Screen.MousePointer = vbHourglass
    Me.Enabled = False
    appAccess.OpenCurrentDatabase lblDBName.Caption, False
    Set db = appAccess.DBEngine.Workspaces(0).Databases(0)
    cboTables.Clear
    For Each tb In db.TableDefs
        cboTables.AddItem tb.Name
    Next
    cboTables.ListIndex = 0
    cmdOpenTable.Enabled = True
    chkVisible_Click
    Me.Enabled = True
    Screen.MousePointer = vbDefault
End Sub

' Open Table
Private Sub cmdOpenTable_Click()
    Dim v As Integer
    Dim view As Integer
    Dim datamode As Integer
    Dim i As Integer
    
    ' get specify view value
    For i = 0 To 2
        If optView(i).Value = True Then
            v = i
            Exit For
        End If
    Next i
    Select Case v
    Case 0
        view = acNormal
    Case 1
        view = acDesign
    Case 2
        view = acPreview
    End Select
    If chkRO.Value = 1 Then
        datamode = acReadOnly
    Else
        datamode = acEdit
    End If
    appAccess.DoCmd.OpenTable cboTables.Text, view, datamode
End Sub

' Select MDB File
Private Sub cmdSelect_Click()
    On Error Resume Next
    cmdlg1.ShowOpen
    If Err.Number = 0 Then
        On Error GoTo 0
        lblDBName.Caption = cmdlg1.filename
        GetTable
    End If
End Sub

Private Sub Form_Load()
'    Set appAccess = CreateObject("Access.Application.7")
    Set appAccess = New Access.Application
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    appAccess.CloseCurrentDatabase
    Set db = Nothing
    Set appAccess = Nothing
End Sub

 

データシートビューでの実行画面


プレビューでの実行画面


Visual Basicを使っていてAccess をうらやましく思うことは少ないのだが、先ほどのデータのメンテナンス機能やレポート機能はVisual Basicにはない優れた機能だ。Visual BasicにもCrystal Reportsがバンドルされており、Accessよりずっと高度なことができるのだが、いかんせん操作が面倒だ。その点、Accessは操作性もVisual Basicのデザイン環境に似て使いやすい。

そこで、OpenReportメソッドを使ってVisual BasicからAccess 95のレポート機能を呼び出してみよう。OpenReportメソッドの概要を次に示す。

OpenReportメソッドの概要

Visual Basic "OpenReport/レポートを開く" アクションを実行する。

構文

DoCmd.OpenReport reportname [, view] [, filtername] [, wherecondition]

指定項目 内容

reportname カレント データベースのレポートの有効名を文字列式で指定する。

view 次のいずれかの組み込み定数を指定する。

acNormal acDesign acPreview

filtername カレント データベースのクエリーの有効名を文字列式で指定する。

wherecondition 有効な SQL WHERE 句を文字列式で指定する。

気をつけてほしいのは、引数viewの内容である。acNormalではいきなりレポートが印刷されてしまうということだ。テストしているうちに気づいたら数メートル離れたプリンタから大量のレポートが印刷されていてあせってしまった。

レポート一覧の取得

ここで問題になるのが、先ほどと同様にレポート一覧の取得である。これもApplicationオブジェクトでは取得できない。先に述べたとおり、Reportsコレクションは開いているレポートのコレクションであり、ファイルに格納されているものではないからだ。

そこで、またまたDAOの出番である。ここでは、Databaseオブジェクトの下にあるContainersコレクション、さらにその下にあるDocumentsコレクションを参照する。このDocumentsコレクションの一つ一つが、フォームやレポートのオブジェクトである。したがって、次のようなコードでドキュメントの一覧を取得することができる。

Dim ct As Container
    Dim doc As Document
    
appAccess.OpenCurrentDatabase lblDBName.Caption, False
    Set db = appAccess.DBEngine.Workspaces(0).Databases(0)
    For Each ct In db.Containers
        For Each doc In ct.Documents
            cboReports.AddItem doc.Name
        Next
    Next


もっとも、この例では厳密にレポートだけを得ているわけではない。テーブルやクエリー、フォームまでも得てしまう。もっと厳密にレポートだけを得るためには、各Documentオブジェクトのプロパティなどを調べる必要があるだろう。

次に、レポートのサンプルコードを実行例を示す。

Option Explicit

Dim appAccess As Access.Application
Dim db As Database

'Chenge Visible
Private Sub chkVisible_Click()
    appAccess.Visible = -chkVisible.Value
End Sub

' Get Report from DB
Private Sub GetTable()
    Dim ct As Container
    Dim doc As Document
    
    Screen.MousePointer = vbHourglass
    Me.Enabled = False
    appAccess.OpenCurrentDatabase lblDBName.Caption, False
    Set db = appAccess.DBEngine.Workspaces(0).Databases(0)
    cboReports.Clear
    For Each ct In db.Containers
        For Each doc In ct.Documents
            cboReports.AddItem doc.Name
        Next
    Next
    cboReports.ListIndex = 0
    cmdOpenReport.Enabled = True
    chkVisible_Click
    Me.Enabled = True
    Screen.MousePointer = vbDefault
End Sub

' Open Report
Private Sub cmdOpenReport_Click()
    Dim v As Integer
    Dim view As Integer
    Dim datamode As Integer
    Dim i As Integer
    
    ' get specify view value
    For i = 0 To 2
        If optView(i).Value = True Then
            v = i
            Exit For
        End If
    Next i
    Select Case v
    Case 0
        view = acNormal
    Case 1
        view = acDesign
    Case 2
        view = acPreview
    End Select
    appAccess.DoCmd.OpenReport cboReports.Text, view, , txtWhere.Text
End Sub


' Select MDB File
Private Sub cmdSelect_Click()
    On Error Resume Next
    cmdlg1.ShowOpen
    If Err.Number = 0 Then
        On Error GoTo 0
        lblDBName.Caption = cmdlg1.filename
        GetTable
    End If
End Sub

Private Sub Form_Load()
'    Set appAccess = CreateObject("Access.Application.7")
    Set appAccess = New Access.Application
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    appAccess.CloseCurrentDatabase
    Set db = Nothing
    Set appAccess = Nothing
End Sub

 

※ドキュメント一覧の取得とレポートプレビュー



ここまでできれば、もう他のこともそう難しくはないように思えてくる。テキストをCSV形式で保存するなどというのは、Visual Basicでコーディングしても大したものではないのだが、Access 95がやってくれるならわざわざコーディングする必要もないだろう。

これには、TransferTextメソッドを使う。次にこのメソッドの概要を示す。

TransferTextメソッドの概要

Visual Basic "TransferText/テキスト変換" アクションを実行する。

構文

DoCmd.TransferText [transfertype] [, specificationname], tablename, filename [, hasfieldnames]

指定項目 内容

transfertype 次のいずれかの組み込み定数を指定する。

acImportDelim acImportFixed acExportDelim acExportFixed acExportMerge acLinkDelim acLinkFixed

specificationname カレント データベースで作成し保存したインポート定義名またはエクスポート定義名を文字列式で指定する。

tablename テキスト データのインポート先、エクスポート元、またはリンク先の Access テーブルの名前を指定するか、または Access 選択クエリーの結果をテキスト ファイルにエクスポートする場合には選択クエリーの名前を文字列式で指定する。

filename インポート元、エクスポート先、またはリンク先のテキスト ファイル名をフル パスで指定する。

hasfieldnames インポート、エクスポート、またはリンクするときに、テキスト ファイルの 1 行目をフィールド名として使うときは True (-1) を指定し、通常のデータとして扱うときには False (0) を指定する。

ここからも分かるように、CSV形式のファイルはインポート、エクスポートまたはリンク(従来のアタッチに当たる)させることができる。実は、この後に出てくるその他のファイル形式とのやりとりも、たいていはこの3つの形式を選ぶことができる。つまりは、データコンバートは自由自在ということだ。

このあたりの作業は、次の3つのいずれかということになる。

  1. 元テーブルとコンバート先のファイル形式を指定してエクスポートする
  2. コンバート元のファイル形式とファイルを指定してインポートし、適当なテーブルを作らせる。
  3. 外部のファイル形式とファイルを指定し、内部のテーブル名を指定(なければ自動的に作られる)してリンクさせる。

こう考えると、ワークシート形式、RTF形式、他のデータベース形式とも基本線は同じやりかたということになる。そこで、ここでは大枠のプログラムからCSV形式のもののみのコーディング例を示す。

' Load CSV File
Private Sub cmdLoadCSV_Click()
    Dim CSVFile As String
    
    CSVFile = App.Path & "\ACCOLE.CSV"
    appAccess.DoCmd.TransferText acImportDelim, , cboTables.Text, CSVFile, -chkUseField.Value
    MsgBox "Load CSV File Complete!!"
End Sub

' Save CSV
Private Sub cmdSaveCSV_Click()
    Dim CSVFile As String
    
    CSVFile = App.Path & "\ACCOLE.CSV"
    appAccess.DoCmd.TransferText acExportDelim, , cboTables.Text, CSVFile, -chkUseField.Value
    MsgBox "Save CSV File Complete!!"
End Sub

ワークシート変換は、ExcelやLotus 1-2-3形式のファイルと変換するものだ。例によって、インポート、エクスポート、リンクのいずれもが可能である。ただし、実際にはアプリケーションのバージョンによってサポートが違うので気をつけなくてはならない。

次に、ワークシート変換をするTransferSpreadsheetメソッドの概要を示す。

TransferSpreadsheetメソッドの概要

Visual Basic "TransferSpreadsheet/ワークシート変換" アクションを実行する。

構文

DoCmd.TransferSpreadsheet [transfertype] [, spreadsheettype], tablename, filename [, hasfieldnames] [, range]

指定項目 内容

transfertype 次のいずれかの組み込み定数を指定する。

acImport acExport acLink

spreadsheettype 次のいずれかの数値を指定する。

0 Excel 3.0

2 Lotus (WK1)

3 Lotus (WK3)

4 Lotus (WJ2) -- 日本語版のみ

5 Excel 5.0 と Excel 7.0

6 Excel 4.0

7 Lotus (WK4)

Excel および Lotus のワークシートのデータをインポート、エクスポート、およびリンクすることができる。ただし、Lotus ワークシートは読み取り専用。

tablename ワークシート データのインポート先、エクスポート元、またはリンク先の Access テーブルの名前を指定する。あるいは、Access 選択クエリーの結果をワークシートにエクスポートするときには選択クエリーの名前を文字列式で指定する。

filename インポート元、エクスポート先、またはリンク先のワークシートのファイル名をフル パスで指定する。

hasfieldnames インポート、エクスポート、またはリンクするときに、ワークシートの 1 行目をフィールド名として使うときは True (-1) を指定し、通常のデータとして扱うときには False (0) を指定する。

range セルの有効範囲またはワークシートの範囲名を文字列式で指定する。この引数はインポートする場合にだけ指定する。

ここでは、Excelとの変換をするコーディング例を示す。

' Export to Excel File
Private Sub cmdExpExcel_Click()
    Dim EXCELFile As String
    
    EXCELFile = App.Path & "\Book1.Xls"
    appAccess.DoCmd.TransferSpreadsheet acExport, 5, cboTables.Text, EXCELFile, -chkUseField.Value
    MsgBox "Export Excel File Complete!!"
End Sub

' Import from Excel File
Private Sub cmdImpExcel_Click()
    Dim EXCELFile As String
    
    EXCELFile = App.Path & "\Book1.Xls"
    appAccess.DoCmd.TransferSpreadsheet acImport, 5, "IMPORT_EXCEL", EXCELFile, -chkUseField.Value
    MsgBox "Import Excel File Complete!!"
End Sub

' Link Excel File
Private Sub cmdLinkExcel_Click()
    Dim EXCELFile As String
    
    EXCELFile = App.Path & "\Book1.Xls"
    appAccess.DoCmd.TransferSpreadsheet acLink, 5, "LINK_EXCEL", EXCELFile, -chkUseField.Value
    MsgBox "Link Excel File Complete!!"
End Sub

OutputToメソッドでは、RTF形式、Excel形式あるいはテキスト形式でのファイル作成ができる。インポートはできないので注意してほしい。

次に、OutputToメソッドの概要を示す。

OutputToメソッドの概要

Visual Basic "OutputTo/出力" アクションを実行する。

構文

DoCmd.OutputTo objecttype [, objectname] [, outputformat] [, outputfile] [, autostart]

指定項目 内容

objecttype 次のいずれかの組み込み定数を指定する。

acTable acQuery acForm acReport acModule

objectname 引数 objecttype で選択した種類のオブジェクトの有効名を文字列式で指定する。

outputformat 次のいずれかの組み込み定数を指定する。

acFormatXLS acFormatRTF acFormatTXT

outputfile オブジェクトの出力先のファイルの名前をフル パスで指定する。この引数を指定しない場合、出力ファイル名を入力するためのプロンプトが表示される。

autostart Windows 対応のアプリケーションを起動して、引数 outputfile で指定したファイルをロードするときに、True (-1) を設定する。

OutputToメソッドで面白いところは、ファイルを保存したあとに、対応するアプリケーションを自動的に実行することができる点だ。次に、サンプルコードと実行例を示す。

' Save to RTF File and Execute Word
Private Sub cmdSaveRTF_Click()
    Dim RTFFile As String
    
    RTFFile = App.Path & "\ACCOLE.RTF"
    appAccess.DoCmd.OutputTo acTable, cboTables.Text, acFormatRTF, RTFFile, -chkExec.Value
    MsgBox "Save RTF File Complete!!"
End Sub


●データベース変換 TransferDatabase

最後に、ここのところ話題の多いクライアント/サーバー型RDBMSにも応用可能なデータベース変換機能だ。Accessでは様々な種類のデータベースファイルとのコンバートが可能であるが、これをすべてVisual Basicからも呼び出して使うことができる。しかも、ODBCを使ってOracleやSQL ServerなどのRDBMSとのインポート、エクスポート、そしてリンクも可能である。こうなってくると、SQL*PlusやISQLなどを使うのが馬鹿馬鹿しくなってくる。

この機能を実現するのが、TransferDatabaseメソッドだ。次に、概要を示す。

TransferDatabaseメソッドの概要

Visual Basic "TransferDatabase/データベース変換" アクションを実行する。

構文

DoCmd.TransferDatabase [transfertype], databasetype, databasename [, objecttype], source, destination [, structureonly] [, saveloginid]

指定項目 内容

transfertype 次のいずれかの組み込み定数を指定する。

acImport acExport acLink

databasetype データのインポート、エクスポート、またはリンクが可能なデータベースの種類の有効名を文字列式で指定する。

databasename データのインポート、エクスポート、またはリンクに使うデータベースの名前をフル パスで指定する。

objecttype 次のいずれかの組み込み定数を指定する。

acTable acQuery acForm acReport acMacro acModule

source インポート、エクスポート、またはリンクするデータのオブジェクト名を文字列式で指定する。

destination データベースのインポート、エクスポート、またはリンクする先のオブジェクト名を文字列式で指定する。

structureonly データベース テーブルの構造だけをインポートまたはエクスポートするときに True (-1) を、テーブルの構造とそのデータをインポートまたはエクスポートするときには False (0) を指定する。

saveloginid ODBC データベースのログオン ID とパスワードをデータベースからリンクされたテーブルの接続文字列に格納するときは、True を指定する。

ここでは、ODBCデータソースに接続してみた。ちなみに、引数databasetypeには、"ODBC"を指定する。このあたり、サンプルプログラムやヘルプには誤った記述がされているので注意してほしい。

エクスポートでは、指定されたテーブルをそのままの名前でODBCデータソース名SQL60のMicrosoft SQL Server 6.0にエクスポートした。

インポートでは、SQL Server上にある"authors"テーブルを、ローカルの"Import_SQL60"テーブルにインポートしている。この順番もPreview Programのヘルプでは誤って記述されていたので注意してほしい。

リンクでも、同様に"authors"テーブルを"Link_SQL60"テーブルにリンクしている。

次に、それぞれのコードおよび実行例を示す。

' Export to ODBC SQL
Private Sub cmdExpDB_Click()
    On Error Resume Next
    appAccess.DoCmd.TransferDatabase acExport, "ODBC", _
        "ODBC;DSN=SQL60;UID=sa;PWD=;LANGUAGE=japanese;DATABASE=pubs", acTable, cboTables.Text, cboTables.Text
    If Err Then
        MsgBox Err.Description, vbCritical, "Error " & CStr(Err.Number)
    Else
        MsgBox "Export ODBC File Complete!!"
    End If
End Sub

' Import from ODBC SQL
Private Sub cmdImpDB_Click()
    On Error Resume Next
    appAccess.DoCmd.TransferDatabase acImport, "ODBC", _
        "ODBC;DSN=SQL60;UID=sa;PWD=;LANGUAGE=japanese;DATABASE=pubs", acTable, "authors", "Import_SQL60", False
    If Err Then
        MsgBox Err.Description, vbCritical, "Error " & CStr(Err.Number)
    Else
        MsgBox "Import ODBC File Complete!!"
    End If
End Sub

' Link ODBC SQL
Private Sub cmdLinkDB_Click()
    On Error Resume Next
    appAccess.DoCmd.TransferDatabase acLink, "ODBC", _
        "ODBC;DSN=SQL60;UID=sa;PWD=;LANGUAGE=japanese;DATABASE=pubs", acTable, "authors", "Link_SQL60", False
    If Err Then
        MsgBox Err.Description, vbCritical, "Error " & CStr(Err.Number)
    Else
        MsgBox "Link ODBC File Complete!!"
    End If
End Sub


このほかにも面白そうなものとしては、SendObjectメソッドを使ったメイルやFAXへの送信機能がある。ここでは残念ながら紹介できないが、サンプルプログラムを参考にして、ぜひご自分で試してみていただきたい。

念のために申し上げておくと、ここで紹介したコードとCD-ROMに収録されているコードは若干の違いがある。CD-ROMに収録されているコードでは、若干のバグやミスがある。また、オブジェクトの作成をCreateObjectで行っており、その直後にDAOを参照するとハングアップすることがあった。これは、VBAまわりのバグである可能性が高いと思われるが、アーリーバインドに書き直すと再現しなくなった。ここにあるコードもそういった迷いが残っているものではある。

ざっと、Access 95オブジェクトの機能を使ってみたが、初心者向けとはいえさすがにRDBMSである。Visual Basicにはないデータ操作やレポート機能を手軽に使えるのはとても嬉しい。これを単体のOLEオートメーションの機能と考えるならば、Access 95のオブジェクトを使ってみたというだけで終わってしまうのだが、近いうちにはこのような便利な機能がOS上にちりばめられており、Visual Basicから自由にOLEオートメーションを通して使うことができる日がくるというはっきりとした実感を感じることができた。そうなったときこそ、OLEオートメーションの本当の威力を発揮するときである。

OLEはWordにExcelを貼り付けることなどではない。このような便利な機能を自由自在に使えることなのだ。そして、その中心となるのはやはりVisual Basicであるわけだ。