リレーションからMS-Accessのフォームを開く
PC-Mappingと外部アプリケーション間でデータを連携する機能に、Object Linking and Embedding(以降 OLE)やDynamic Data Exchange(以降 DDE)があります。
現在では、DDEに対応したアプリケーションは少なくなり、セキュリティ上の問題も指摘されているためあまり使用されず、OLEが主流となっています。
このような経緯からPC-Mappingは、DDEを非推奨(今後DDEに関連する機能更新は行えません)とさせていただいております。
ここでは、
リレーション 「(7) DDE実行リレーション」 に似た設定・操作で、[属性]-[属性照会]-[ポリゴン属性照会]の【リレーション起動】ボタンからMS-Accessのフォームを開くスクリプトを紹介します。
本スクリプトは、PC-Mapping以外に、「Microsoft Access 2024」または「Microsoft Access for Microsoft 365」をインストールしてください。
- ■ サンプル
サンプル[script55.zip(約87KB)]をダウンロードする
 | Sample.pcm | :サンプルプロジェクト |
| Sample.accdb | :サンプルデータベース |
- ■ 準備
-
- ダウンロードしたファイルには「セキュリティブロック」がかかります。
ダウンロードしたファイルをマウス右クリック、メニューから「プロパティ」をクリック、「全般」パネルの下部に「セキュリティ:」欄が表示されますので、「許可する」チェックボックスをONにし、【OK】ボタンをクリックして閉じます。
- ダウンロードしたファイルを解凍します。
ここでは、「C:\sample\script55」とします。
- PC-Mappingを起動します。
- 「C:\sample\script55\sample.pcm」を開きます。
- Microsoft Access(以降、MS-Accessと記述)を起動します。
- 「C:\sample\script55\sample.accdb」を開きます。
- 「C:\sample\script55\sample.accdb」を開いたとき、以下のような「セキュリティの警告」が表示された場合、【コンテンツの有効化】ボタンをクリックしてください。

- ■ 解説
- PC-Mappingの[プロジェクト]-[プロジェクト設定]-[プロジェクトエキスパート]から「スクリプト」パネルを開きます。
- 要点1
- function OleMaRun(path, procedure, ooaza, koaza, chiban)
本スクリプトは、プロジェクトに埋め込むことで、「OleMaRun」コマンドとして実行できるようにしています。
このコマンドは、「ポリゴン属性照会」ウィンドウにある【リレーション起動】ボタンクリック時、指定したMS-Accessファイルにあるプロシージャ名を実行します。
このコマンドのパラメーター、「path」はMS-Accessファイルパス、「procedure」はMS-Accessモジュールにある実行するプロシージャ名、「ooaza」はポリゴン内部属性「大字」フィールドの値、「koaza」はポリゴン内部属性「小字」フィールドの値、「chiban」はポリゴン内部属性「地番」フィールドの値になります。
- 要点2
- var ma = GetObject(path);
JScript:GetObject()関数を実行し、ファイルパスからCOMオブジェクトを作成しています。
ここでは、MS-Accessオブジェクト「ma」を取得し、指定したMS-Accessファイルパスを開いています。
- 要点3
- var mf = GetMainFrame();
mf.BackgroundWindow();
PC-MappingオートメーションのAppClass:GetMainFrame()メソッドでメインフレームウィンドウのオブジェクトを取得し、PcmAutoMainFrmClass:BackgroundWindow()メソッドでメインフレームウィンドウをMS-Accessウィンドウのよりも下に置きます。
- 要点4
- if(!ma.UserControl){
ma.UserControl = true;
}
MS-Accessアプリケーション:UserControlプロパティがfalseの場合、処理終了後、自動的に閉じてしまうことがあるため、trueに変更しています。
- 要点5
- var temp = ma.Run(procedure, ooaza, koaza, chiban);
MS-Accessアプリケーション:Run()メソッドを実行し、MS-Accessモジュールにあるプロシージャを実行しています。
プロシージャ実行時、パラメーターを渡すこともできます。
ここでは、要点1で取得した「ooaza」「koaza」「chiban」を渡しています。
- PC-Mappingの「画地」レイヤーを前景レイヤーにし、[属性]-[ウィンドウ]-[ポリゴン属性ウィンドウ]から、「画地-ポリゴン」ウィンドウを開きます。
- 要点6
- [データベース]-[設定]-[データベースの定義]から「属性データベース設定(画地-ポリゴン)」ダイアログボックスを開き、「データベースの設定」パネルの「relation」フィールドを選択、【更新】ボタンをクリックします。
「属性フィールドの設定」ダイアログボックスの「リレーション」チェックボックスはON、リレーション起動ができる状態になっています。
- 要点7
- 「属性フィールドの設定」ダイアログボックスの「計算フィールド」チェックボックスはON、「式」欄へリレーション起動時に実行するコマンドとパラメーターを記述しています。
ここでは、
"COMMAND: OleMaRun " & $PrjFolder & "\\sample.accdb " & "pcmOpenForm " & {大字} & " " & {小字} & " " & {地番}
と記述されています。

「COMMAND:」については、
リレーション 「(8) コマンド実行リレーション」 をご覧ください。
「OleMaRun」コマンドを実行しています。
要点1の解説とおり、コマンドパラメーターに、「sample.pcmと同一フォルダーにあるsample.accdbのパス」、「プロシージャ名「pcmOpenForm」」、「「大字」フィールドの値」、「「小字」フィールドの値」、「「地番」フィールドの値」を指定しています。
- MS-Accessの[作成]-[マクロとコード]-[Visual Basic]から、「Microsoft Visual Basic for Applications」ウィンドウを開きます。

「Microsoft Visual Basic for Applications」ウィンドウの左側にある「プロジェクト - Database」ウィンドウ内の[標準モジュール]-[Module1]をクリック、右側ウィンドウにプログラムソースを表示します。

- 要点8
- Public Function pcmOpenForm(ooaza As String, koaza As String, chiban As String) As Boolean
PC-Mappingの[属性]-[照会]-[ポリゴン属性照会]からポリゴンをクリック、【リレーション起動】ボタンをクリックすると、要点5の解説とおり、MS-Accessモジュール「pcmOpenForm()」プロシージャを実行し、パラメーターに「ooaza」「koaza」「chiban」を渡しています。
- 要点9
- DoCmd.OpenForm "F_画地"
Forms!F_画地.Filter = "[T_画地].[大字] = '" & ooaza & "' AND [T_画地].[小字] = '" & koaza & "' AND [T_画地].[地番] = '" & chiban & "'"
Forms!F_画地.FilterOn = True
「F_画地」フォームを開きます。「F_画地」フォームには「T_画地」テーブルの値を表示しています。
次に、「F_画地」フォームのフィルターへ、要点8で取得した、「ooaza」と一致する「T_画地」テーブル「大字」、かつ「koaza」と一致する「T_画地」テーブル「小字」、かつ「chiban」と一致する「T_画地」テーブル「地番」を設定しています。
最後に、「F_画地」フォームのフィルターをONにし、該当するレコードのみ表示しています。
- ■ 実行
- MS-Accessを起動している場合、MS-Accessを終了してください。
- PC-Mappingの[属性]-[照会]-[ポリゴン属性照会]を実行すると、「属性照会」ウィンドウが表示されます。
- 「画地」レイヤーのポリゴンをクリックすると、クリックしたポリゴンの内部属性情報が表示されます。
ここでは、大字「牧野」、小字「1丁目」、地番「8-1」をクリックしました。
- 「属性照会」ウィンドウから【リレーション起動】ボタンをクリックします。
- すると、MS-Accessを起動、「C:\sample\script55\sample.accdb」ファイルを読み込み、「F_画地」フォームを開き、該当するレコードのみ表示します。
ここでは、大字「牧野」、小字「1丁目」、地番「8-1」のレコードが表示されました。
- 引き続き、PC-Mappingをアクティブにし、他のポリゴンをクリック、同様の操作を行うと、MS-Accessの「F_画地」フォームに該当するレコードが表示されることをご確認ください。
- ■ 補足
-
ここでは、[属性]-[属性照会]-[ポリゴン属性照会]の【リレーション起動】ボタンからMS-Accessのフォームを開くスクリプトを紹介しましたが、同様にPC-Mappingオートメーションを使用すれば、他の操作でMS-Accessのフォームを開くことができます。
例えば、
- (A)選択した複数ポリゴンからMS-Accessのフォームを開く
- 選択ポリゴンの「大字」「小字」「地番」を、実行するプロシージャのパラメーターに渡すのではなく、実行するプロシージャ内にPC-Mappingオートメーションを使用して、選択ポリゴンの「大字」「小字」「地番」を取得するプログラムを記述します。
- (B)指定した領域に含まれる複数ポリゴンからMS-Accessのフォームを開く
- PC-Mappingオートメーションを使用して、PcmAutoPcmDocClass:DoTrack()メソッドを使用して領域指定し、その領域内に含まれるポリゴンをPcmAutoPcmLayerClass:FindByArea()メソッドで検索、該当ポリゴンをPcmAutoPcmLayerClass:MarkItemArray()メソッドで選択状態にすれば、以降は(A)と同じです。
- (C)MS-Accessのフォームで指定したレコードからポリゴンを選択状態にする
- MS-Accessのフォームにボタンを配置、ボタンクリック時にプロシージャを実行するようにし、そのプロシージャ内にPC-Mappingオートメーションを使用して、PcmAutoPcmDbClass:SearchRecByStrEx3()メソッドで該当するポリゴンを検索、PcmAutoPcmLayerClass:MarkItem()メソッドで選択状態にし、PcmAutoPcmViewClass:DispSelectedLayer()メソッド等で選択ポリゴンを画面に表示するプログラムを記述します。
これらの詳しい操作につきましては、 [PC-Mapping集中スキルアップ講座]-[オートメーション講座-V] にて受講することができますので、興味がございましたらご検討ください。
|