本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[XL]Access への DDE 通信 (Access 1.1編)

文書番号: 401693

最終更新日: 1998/02/03


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP401693

概要

Microsoft(R) Access(R) Version 1.1 (以下 Access) を DDE 通信のソース
アプリケーションとして利用することにより、Excel 5.0 からデータの取得、
Access の制御を行うことが可能になります。
本文書は、Microsoft(R) Visual Basic(R) Programming System Applications
Edition (以下 VBA) で Access との DDE 通信を行う際に必要となる情報を
まとめたものです。

1. アプリケーション名

Acces を DDE 通信 のソースアプリケーションとして使用するためにはアプリ
ケーション名が必要となります。Access のアプリケーション名は "MSAccess" です。

2. トピック (対象)

Access がサポートするトピックは次の通りです。
  1. System
  2. データベース ファイル名
  3. データベース ファイル名とテーブル名の組み合わせ
  4. データベース ファイル名とクエリー名の組み合わせ
  5. データベース ファイル名と SQL 文の組み合わせ 1
  6. データベース ファイル名と SQL 文の組み合わせ 2

2-1. System

このトピックに接続するには、次のように記述します。
Chan = DDEInitiate("MSAccess","System")
このトピックがサポートするアイテム (項目名) は次の通りです。
  SysItems
  Access の System トピックのアイテムのリストを配列として得ることが
  できます。この時得られる文字列は、"SysItems","Formats","Status", "Topics"
  となります。
  Formats
  Access がクリップボードにコピーできるフォーマットのリストを配列として
  得ることができます。
  Topics
  Access に対して DDE 通信を行う際に、現在接続が可能なトピックのリストを
  配列として得ることができます。
  Status
  現在の Access の状態を配列として得ることができます。"Busy" もしくは
  "Ready" の文字列です。"Busy" の時は DDE 通信を行うことができません。

2-2. データベース ファイル名

Access で開いてるデータベースのファイル名を指定します。
このトピックに接続するには、次のように記述します。
  Chan = DDEInitiate("MSAccess","MINAMI.MDB")
このトピックがサポートするアイテム (項目名) は次の通りです。それぞれの
オブジェクト名のリストを得ることができます。
  TableList
  指定したデータベース内のテーブルのオブジェクト名のリストを配列として
  得ることができます。
  QueryList
  指定したデータベース内のクエリーのオブジェクト名のリストを配列として
  得ることができます。
  FormList
  指定したデータベース内のフォームのオブジェクト名のリストを配列として
  得ることができます。
  ReportList
  指定したデータベース内のレポートのオブジェクト名のリストを配列として
  得ることができます。
  MacroList
  指定したデータベース内のマクロのオブジェクト名のリストを配列として得る
  ことができます。
  Modulelist
  指定したデータベース内のモジュールのオブジェクト名のリストを配列として
  得ることができます。

2-3. データベース ファイル名とテーブル名の組み合わせ

このトピックに接続するには、次のように記述します。
  Chan = DDEInitiate("MSAccess","MINAMI.MDB;Table 銀行")
このトピックがサポートするアイテム (項目名) は次の通りです。
  FieldNames
  指定したテーブルのフィールド名のリストを配列として得ることができます。
  FieldNames;T
  フィールド名の文字列とそのデータ型を 2 次元配列として得ることができま
  す。データ型は以下のような意味の値が返されます。
       0        無効
       1        Yes/No 型
       2        バイト型
       3        整数型
       4        長整数型
       5        通貨型
       6        単精度浮動小数点型
       7        倍精度浮動小数点型
       8        日付/時間型
       9        バイナリのデータ型 (最大 255 バイト)
      10        ANSI の文字列 (最大 255 バイト)
      11        OLE オブジェクト型
      12        メモ型
  All
  フィールド名を含んだ全データを 2 次元配列として得ることができます。
  Data
  フィールド名を含まない全データを 2 次元配列として得ることができます。
  NextRow
  カレント レコードの次のレコードのデータを配列として得ることができま
  す。DDEInitiate で接続した最初の状態で NextRow を実行すると、最初の
  レコードのデータを得ることができます。カレント レコードが最後のレ
  コードの状態で、NextRow を実行するとエラーになります。
  また、NextRow を実行するとカレント レコードが一つ次のレコードに移動します。
  PrevRow
  カレント レコードの前のレコードのデータを配列として得ることができま
  す。DDEInitiate で接続した最初の状態で PrevRow を実行すると最後のレ
  コードのデータを得ることができます。接続直後以外の状態で、なおかつ
  カレント レコードが最初のレコードの状態の時、PrevRow を実行すると
  エラーになります。
  また、PrevRow を実行するとカレント レコードが一つ前のレコードに移動します。
  FirstRow
  最初のレコード データを配列として得ることができます。
  また、FirstRow を実行するとカレント レコードが最初のレコードに移動します。
  LastRow
  最後のレコードデータを配列として得ることができます。
  また、LastRow を実行するとカレント レコードが最後のレコードに移動します。
  FieldCount
  フィールドの数を得ることができます。
  SQLText
  トピックで指定されている SQL 文を得るためのアイテムです。トピックにテー
  ブル名、クエリー名、SQL 文を設定している時、DDERequest メソッドを実行する
  と SQL 文を得ることができます。SQLText アイテムを使用し、DDEPoke メソッド
  を実行するとエラーが発生します。
  SQLText;n
  トピック名で指定されている SQL 文を得るためのアイテムです。トピックに、
  テーブル名、クエリー名、SQL 文を設定している時に指定します。DDERequest
  メソッドを実行すると SQL 文を n バイトごとの文字列型の配列として得るこ
  とができます。SQLText;n アイテムを使用して DDEPoke メソッドを実行する
  ことエラーが発生します。

2-4. データベース ファイル名とクエリー名の組み合わせ

このトピックに接続するには、次のように記述します。
  Chan = DDEInitiate("MSAccess","MINAMI.MDB;Query Q_価格表")
アイテムについては「 3. データベース ファイル名とテーブル名を指定する方法」
のトピックと同じです。

2-5-1. データベースファイル名と SQL 文の組み合わせ 1

トピックに SQL 文を含めない方法です。
このトピックに接続するには次のように記述します。
  Chan = DDEInitiate("MSAccess","MINAMI.MDB;SQL")
SQL 文を SQLText アイテムで指定した DDEPoke メソッドで送信し、All、Data
等のアイテムで DDERequest メソッドを実行すると SQL 文の結果を得ることが
できます。
アイテムについては、SQLText 以外「 3. データベース ファイル名とテーブル名を
指定する方法」のトピックと同じです。

2-5-2. データベースファイル名と SQL 文の組み合わせ 2

トピックに SQL 文を含める方法です。
このトピックに接続するには次のように記述します。
  Chan = DDEInitiate("MSAccess","MINAMI.MDB;SQL Select * From 銀行;")
SQL 文には、最後に ; (セミコロン) をつけた 255 バイトまでの文字列を指定します。 アイテムについては「 3. データベースファイル名とテーブル名を指定する方法」の トピックと同じです。

3. DDEExecute

DDEExecute を使用することにより DDE 対応アプリケーションに対しコマンドを送信 することが可能です。Access では DDEExecute で以下のようなことを行えます。
  1. Access のマクロを実行する
  2. Access のマクロのアクションを実行する
  3. データベース ファイルを開く
  4. データベース ファイルを閉じる

3-1. Access のマクロを実行する方法

データベースのマクロ名を指定し、実行することができます。マクログループ内の
マクロを実行することもできます。

3-2. Access のマクロのアクションを実行する方法

Access マクロのアクションを指定し、実行することができます。送信するアクショ
ンの文字列全体を [ ] で囲んで送信します。なお、次のアクションは送信すること
ができません。
  メニューの追加 (AddMenu)
  メッセージ ボックス (MsgBox)
  アプリケーションの実行 (RunApp)
  プロシージャの実行 (RunCode)
  キー送信 (SendKeys)
  値の代入 (SetValue)
  全マクロの中止 (StopAllMacro)
  マクロの中止 (StopMacro)

3-3. データベース ファイルを開く方法

以下のような文字列を DDEExceute メソッドの引き数に指定することによりデータ
ベースファイルをオープンすることが可能となります。注意点としては DDE 通信
接続時にトピック名 "System" を指定していなければなりません。また、マクロの アクションを実行する場合と同様に文字列全体を [ ] で囲んで送信します。
  OpenDatabase ファイル名,[排他モード],[リード/ライトモード]
  ファイル名            データベースファイル名を指定します。パスも含めることが
                        できます。
  排他モード            Boolean 型で True(-1) 共有モードか、False(0) 排他モード
                        を指定します。
  リード/ライトモードBoolean 型で True(-1) リードオンリーモードか、False(0)
                        リード/ライトモードです。

3-4. データベースファイルを閉じる方法

CloseDatabase という文字列を DDEExecute メソッドの引き数に使用することに
よりデータベースファイルのクローズを行うことが可能となります。注意点として
は DDE 通信接続時にトピック名 "System" を指定していなければなりません。ま た、マクロのアクションを実行する場合と同様に文字列全体を [ ] で囲んで送信
します。

4. Excel 5.0 VBA サンプル

以上の各機能を実際に使用したサンプル プログラムを次に示します。
Access は Excel 5.0 にデータを転送する際にいかなる形式のデータでも配列
として受け渡しを行いますので、データを受け取る変数は Variant 型を使用
することをお勧めいたします。

ご注意

サンプルプログラムを動作させるためには Access が起動されている状態で
サンプル データベース MINAMI.MDB がオープンされている必要があります。
また、すべてのモジュールシートには以下の宣言を宣言セクションに記述
してください。
  Option Base 1

4-1. System トピックのアイテムの取得を行うサンプル

次の例では得られたアイテムの一覧を MsgBox 関数を使用して表示しています。
  Sub DDEGetSysItems()
      Dim Items
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "System")
      Items = Application.DDERequest(chan, "SysItems")
      For i = 1 To UBound(Items)
          MsgBox Items(i)
      Next i
      Application.DDETerminate chan
  End Sub

4-2.Access がクリップボードにコピーできるフォーマットのリストを取得するサンプル

次の例では得られたクリップボード フォーマット名を MsgBox 関数を使用して表示し ています。
  Sub DDEGetFormats()
      Dim Formats
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "System")
      Formats = Application.DDERequest(chan, "Formats")
      For i = 1 To UBound(Formats)
          MsgBox Formats(i)
      Next i
      Application.DDETerminate chan
  End Sub

4-3. 現在の Access で使用可能なトピックのリストを取得するサンプル

次の例では得られたトピック名を MsgBox 関数を使用して表示しています。
  Sub DDEGetTopics()
      Dim Topics
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "System")
      Topics = Application.DDERequest(chan, "Topics")
      For i = 1 To UBound(Topics)
          MsgBox Topics(i)
      Next i
      Application.DDETerminate chan
  End Sub

4-4. 現在の Access の状態を取得するサンプル

次の例では得られたクリップボード フォーマット名を MsgBox 関数を使用して表示
しています。
  Sub DDEGetStatus()
      Dim Status
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "System")
      Status = Application.DDERequest(chan, "Status")
      For i = 1 To UBound(Status)
          MsgBox Status(i)
      Next i
      Application.DDETerminate chan
  End Sub

4-5. 指定したデータベースのテーブルのリストを取得するサンプル

次の例では得られたテーブル名を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBTableNames()
      Dim Tables
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "MINAMI.MDB")
      Tables = Application.DDERequest(chan, "TableList")
      For i = 1 To UBound(Tables)
          MsgBox Tables(i)
      Next i
      Application.DDETerminate chan
  End Sub

6. 指定したデータベースのクエリーのリストを取得するサンプル

次の例では得られたクエリー名を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBQueryNames()
      Dim Querys
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "MINAMI.MDB")
      Querys = Application.DDERequest(chan, "QueryList")
      For i = 1 To UBound(Querys)
          MsgBox Querys(i)
      Next i
      Application.DDETerminate chan
  End Sub

7. 指定したデータベースのフォームのリストを取得するサンプル

次の例では得られたフォーム名を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBFormNames()
      Dim Forms
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "MINAMI.MDB")
      Forms = Application.DDERequest(chan, "FormList")
      For i = 1 To UBound(Forms)
          MsgBox Forms(i)
      Next i
      Application.DDETerminate chan
  End Sub

8. 指定したデータベースのリポートのリストを取得するサンプル

次の例では得られたリポート名を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBReportNames()
      Dim Reports
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "MINAMI.MDB")
      Reports = Application.DDERequest(chan, "ReportList")
      For i = 1 To UBound(Reports)
          MsgBox Reports(i)
      Next i
      Application.DDETerminate chan
  End Sub

9. 指定したデータベースのマクロのリストを取得するサンプル

次の例では得られたマクロオブジェクト名を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBMacroNames()
      Dim Macros
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "MINAMI.MDB")
      Macros = Application.DDERequest(chan, "MacroList")
      For i = 1 To UBound(Macros)
          MsgBox Macros(i)
      Next i
      Application.DDETerminate chan
  End Sub

10. 指定したデータベースのモジュールのリストを取得するサンプル

次の例では得られたモジュール名を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBModuleNames()
      Dim Modules
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", "MINAMI.MDB")
      Modules = Application.DDERequest(chan, "ModuleList")
      For i = 1 To UBound(Modules)
          MsgBox Modules(i)
      Next i
      Application.DDETerminate chan
  End Sub

11. 指定したテーブルの内のフィールドのリストを取得するサンプル

次の例では得られたフィールド名を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBTableFields()
      Dim FieldNames
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", _
          "MINAMI.MDB;Table 銀行")
      FieldNames = Application.DDERequest(chan, "FieldNames")
      For i = 1 To UBound(FieldNames)
          MsgBox FieldNames(i)
      Next i
      Application.DDETerminate chan
  End Sub

12. 指定したテーブルのフィールド及びデータ型のリストを取得するサンプル

次の例では得られたフィールド名及びそのデータ型を MsgBox 関数を使用して
表示しています。
  Sub DDEGetDBTableFieldNamesAndType()
      Dim FieldNamesType
      Dim chan
      Dim i, a As Integer
      chan = Application.DDEInitiate("MSAccess", _
          "MINAMI.MDB;Table 銀行")
      FieldNamesType = Application.DDERequest(chan, _
          "FieldNames;T")
      For i = 1 To UBound(FieldNamesType)
          For a = 1 To UBound(FieldNamesType, 2)
              MsgBox FieldNamesType(i, a)
          Next a
      Next i
      Application.DDETerminate chan
  End Sub

13. 指定したテーブルのフィールド名を含めたすべてのデータを取得するサンプル

以下の例では得られたフィールド名及びすべてのデータを MsgBox 関数を使用し
データの表示をしたのち、ワークシート "Sheet1" の セル $A$1 からデータの転 送を行っています。
  Sub DDEGetDBTableAllData()
      Dim DBData
      Dim chan
      Dim i, a As Integer
      Dim RecordData As String
      Dim wksheet As Worksheet
      chan = Application.DDEInitiate("MSAccess", _
          "MINAMI.MDB;Table 銀行")
      DBData = Application.DDERequest(chan, "All")
      Application.DDETerminate chan
      'メッセージ表示処理
      For i = 1 To UBound(DBData)
          '表示用文字列変数の初期化
          RecordData = ""
          For a = 1 To UBound(DBData, 2)
              '表示用文字列の整形
              RecordData = RecordData & DBData(i, a) & Chr(10)
          Next a
          'レコードの表示
          MsgBox RecordData
      Next i
      'ワークシートへのデータ転送処理
      Set wksheet = ThisWorkbook.Worksheets("Sheet1")
      wksheet.Range(wksheet.Cells(1, 1), _
          wksheet.Cells(UBound(DBData), _
          UBound(DBData, 2))).FormulaArray = DBData
  End Sub

14. 指定したテーブルのフィールドの数を取得するサンプル

次の例では得られたフィールドの数を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBTableFieldCount()
      Dim FieldCount
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", _
          "MINAMI.MDB;Table 銀行")
      FieldCount = Application.DDERequest(chan, "FieldCount")
      For i = 1 To UBound(FieldCount)
          MsgBox FieldCount(i)
      Next i
      Application.DDETerminate chan
  End Sub

15. 指定したテーブルに設定されている SQL 文を取得するサンプル

次の例では得られた SQL 文を MsgBox 関数を使用して表示しています。
  Sub DDEGetDBTableSQLText()
      Dim SQLText
      Dim chan
      Dim i As Integer
      chan = Application.DDEInitiate("MSAccess", _
          "MINAMI.MDB;Table 銀行")
      SQLText = Application.DDERequest(chan, "SQLText")
      For i = 1 To UBound(SQLText)
          MsgBox SQLText(i)
      Next i
      Application.DDETerminate chan
  End Sub

16. 指定したデータベースの任意のマクロを実行するサンプル

次の例では "MINAMI.MDB" の AutoExec マクロオブジェクトの "サンプル" マクロを実行しています。
  Sub DDEExecuteMacro()
      Dim chan
      chan = Application.DDEInitiate("MSAccess", "MINAMI.MDB")
      Application.DDEExecute chan, "AutoExec.サンプル"
      Application.DDETerminate chan
  End Sub

17. 指定したデータベースに SQL 文を設定し得られた情報を取得するサンプル

次の例では "MINAMI.MDB" に SQL 文 "Select * from 銀行;" を設定し、得られ た情報を任意のセルに転送しています。
  Sub DDEExecuteSQL()
      Dim chan
      Dim SQL As String
      Dim AllData
      Dim wksheet As Worksheet
      SQL = "Select * from 銀行;"
      chan = Application.DDEInitiate("MSAccess", _
          "MiNAMI.MDB;SQL")
      ThisWorkbook.Worksheets("Sheet1").Range("$D$1") _
      .Value = SQL
      'DDEPoke の第三引数には Range オブジェクトを指定しなければ
       'なりません。
      Application.DDEPoke chan, "SQLText", _
          ThisWorkbook.Worksheets("Sheet1").Range("$D$1")
      AllData = Application.DDERequest(chan, "All")
      'ワークシートへのデータ転送処理
      Set wksheet = ThisWorkbook.Worksheets("Sheet1")
      wksheet.Range(wksheet.Cells(1, 1), _
          wksheet.Cells(UBound(AllData), _
          UBound(AllData, 2))).FormulaArray = AllData
      Application.DDETerminate chan
  End Sub
18. ダイアログ ボックスを使用し、DDE 通信を行いながらリアルタイムにレコードの表示を行うサンプル ================================================================================ 次の図のようにダイアログ ボックスの作成及びマクロの登録を行うと、リアル
タイムにデータを参照することが可能になります。
[GRAPHIC: ]
以下の例ではダイアログ ボックスがオープンされる時に DDE 通信の開始を行い、
ダイアログボックスが閉じられる時 (<終了> ボタンが押された時) に DDE 通信を 終了しています。また、それぞれのボタンが選択された時にそれぞれの動作に適した データを取得しエディット ボックスに値を転送しています。

モジュールレベル変数の定義

  Dim chan

ダイアログボックスのフォームに登録するコード

  Sub DDESampleForm_Load()
      Dim datas
      chan = DDEInitiate("MSAccess", "MINAMI.MDB;Table 銀行")
      datas = DDERequest(chan, "FirstRow")
      ActiveDialog.EditBoxes("銀行名").Text = datas(1)
      ActiveDialog.EditBoxes("口座種別").Text = datas(2)
      ActiveDialog.EditBoxes("口座番号").Text = datas(3)
  End Sub

<終了> ボタンに登録するコード

  Sub EndButton_Click()
      Application.DDETerminate chan
      ActiveDialog.Hide
  End Sub

<最初のレコード> ボタンに登録するコード

  Sub FirstButton_Click()
      Dim datas
      datas = Application.DDERequest(chan, "FirstRow")
      If StrComp(TypeName(datas), "Error") = 0 Then
          Exit Sub
      End If
      ActiveDialog.EditBoxes("銀行名").Text = datas(1)
      ActiveDialog.EditBoxes("口座種別").Text = datas(2)
      ActiveDialog.EditBoxes("口座番号").Text = datas(3)
  End Sub

<次のレコード> ボタンに登録するコード

  Sub NextButton_Click()
      Dim datas
      datas = Application.DDERequest(chan, "NextRow")
      If StrComp(TypeName(datas), "Error") = 0 Then
          Exit Sub
      End If
      ActiveDialog.EditBoxes("銀行名").Text = datas(1)
      ActiveDialog.EditBoxes("口座種別").Text = datas(2)
      ActiveDialog.EditBoxes("口座番号").Text = datas(3)
  End Sub

<前のレコード> ボタンに登録するコード

  Sub PrevButton_Click()
      Dim datas
      datas = Application.DDERequest(chan, "PrevRow")
      If StrComp(TypeName(datas), "Error") = 0 Then
          Exit Sub
      End If
      ActiveDialog.EditBoxes("銀行名").Text = datas(1)
      ActiveDialog.EditBoxes("口座種別").Text = datas(2)
      ActiveDialog.EditBoxes("口座番号").Text = datas(3)
  End Sub

<最後のレコード> ボタンに登録するコード

  Sub LastButton_Click()
      Dim datas
      datas = Application.DDERequest(chan, "LastRow")
      If StrComp(TypeName(datas), "Error") = 0 Then
          Exit Sub
      End If
      ActiveDialog.EditBoxes("銀行名").Text = datas(1)
      ActiveDialog.EditBoxes("口座種別").Text = datas(2)
      ActiveDialog.EditBoxes("口座番号").Text = datas(3)
  End Sub

Keywords: KBHOWTO KB401693
Technology: kbExcel500 kbExcelSearch kbExcelWinSearch

inserted by FC2 system