Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


511 / 2272 ツリー ←次へ | 前へ→

【11349】ExcelからAccessを起動する方法 へらぶな 10/1/6(水) 15:14 質問[未読]
【11355】Re:ExcelからAccessを起動する方法 りる 10/1/6(水) 21:21 発言[未読]
【11361】Re:ExcelからAccessを起動する方法 へらぶな 10/1/7(木) 12:10 発言[未読]
【11357】Re:ExcelからAccessを起動する方法 YU-TANG 10/1/7(木) 0:07 回答[未読]
【11362】Re:ExcelからAccessを起動する方法 へらぶな 10/1/7(木) 12:15 質問[未読]
【11363】Re:ExcelからAccessを起動する方法 YU-TANG 10/1/7(木) 21:10 発言[未読]
【11368】Re:ExcelからAccessを起動する方法 へらぶな 10/1/12(火) 13:25 発言[未読]
【11369】Re:ExcelからAccessを起動する方法 へらぶな 10/1/12(火) 14:12 発言[未読]
【11371】Re:ExcelからAccessを起動する方法 YU-TANG 10/1/12(火) 21:05 お礼[未読]

【11349】ExcelからAccessを起動する方法
質問  へらぶな  - 10/1/6(水) 15:14 -

引用なし
パスワード
   皆様はじめまして、へらぶなと申します。
初めての投稿になります。よろしくお願いいたします。

1.やりたいこと
ExcelからAccessを起動したい。
Access起動時には、Excelから渡された引数を元に
Access起動時に起動する初期フォームを切り替えたい。

そのとき、
 a) 目的のAccessが起動していないときは、Shell関数を
   用いて、コマンドライン引数を用いて起動する。
   このコマンドライン引数を元に表示するフォームを切り替える。
 b) 目的のAccessが起動しているときは、
   OLEオートメーションを使用して、
   オブジェクトにセットする。
   この場合、フォームの起動はDoCmdを用いる。

2.わからないこと
 a)目的のAccessが起動しているかを確認する方法。
 b)起動していることが分かったとして、OLEオートメーションの
  オブジェクトにどうやってセットするのか?

3.調べたこと
 a)FindWindow APIを用いれば、ウィンドウ名さえわかれば
  起動しているかどうか判断できる。
 b)Accessの場合、Shell関数を実行した分だけプロセスが
  立ち上がる(2重、3重起動が可能である)
 c)2重起動を防止しつつ、かつ目的のフォームを起動するには、
  OLEオートメーションが最適なのではないか?

4.制限事項
 a)Access側の2重起動はしたくない。
 b)Accessを閉じて開いて、ではなく表示するフォームだけ切り替えたい。
 c)FindWindowでAccessのウィンドウ名を拾うとき、
  開いているフォームによってウィンドウ名が異なる。
  よって、FindWindowでは不適切。

以上になります。
有志の皆様、どうかご協力のほどよろしくお願いいたします。

【11355】Re:ExcelからAccessを起動する方法
発言  りる  - 10/1/6(水) 21:21 -

引用なし
パスワード
   へらぶな さん、こんばんは。

>皆様はじめまして、へらぶなと申します。
>初めての投稿になります。よろしくお願いいたします。
>
>1.やりたいこと
>ExcelからAccessを起動したい。
>Access起動時には、Excelから渡された引数を元に
>Access起動時に起動する初期フォームを切り替えたい。
EXCEL側のマクロになるので、EXCEL VBA質問箱で質問したほうが良いと思います。

【11357】Re:ExcelからAccessを起動する方法
回答  YU-TANG  - 10/1/7(木) 0:07 -

引用なし
パスワード
   こんばんは、YU-TANG です。

>  a)目的のAccessが起動しているかを確認する方法。

OS を Windows XP 以上に限定できるなら、WMI で可能です。
以前実際に作ったのですが、手元に残っていないのですぐには提示できません。
「win32_process CommandLine」あたりのキーワードで検索してください。
Access のプロセスに限定して CommandLine を調べれば、特定の MDB を
開いているかどうか、概ね判別できます。

ただし例外的に、MsAccess.exe を単独で起動し、次に [ファイル]
メニューから MDB を開いたとか、あるいは外部スクリプトから
CreateObject で開かれたというような場合 (要は CommandLine に
情報が乗ってこない場合) は、これでは判別できません。
しかしユーザがダブルクリックで起動したことを当てにできる状況で
あれば、実用的な問題にはならないでしょう (当てにできない場合は
そう書いてください。他の手もあります)。

>  b)起動していることが分かったとして、OLEオートメーションの
>   オブジェクトにどうやってセットするのか?

起動しているのが分かっているのであれば、ふつうに GetObject で
取れませんか?
取れないのであれば、コードを提示してみてください。

それでは。

【11361】Re:ExcelからAccessを起動する方法
発言  へらぶな  - 10/1/7(木) 12:10 -

引用なし
パスワード
   りるさん、はじめまして、へらぶなと申します。

>へらぶな さん、こんばんは。
>EXCEL側のマクロになるので、EXCEL VBA質問箱で質問したほうが良いと思います。

了解いたしました。

【11362】Re:ExcelからAccessを起動する方法
質問  へらぶな  - 10/1/7(木) 12:15 -

引用なし
パスワード
   YU-TANG さんへ
お返事ありがとうございます、へらぶなと申します。

a)(要は CommandLine に情報が乗ってこない場合) は、これでは判別できません。に関して

すいません、説明が一部誤っておりました。
実際には、shell関数を用いた起動時にも、コマンドライン引数を
省略して起動することもあります。
引数を指定せずに起動した場合、メインメニューのみが立ち上がり、
引数を指定して実行するときには、メインメニュー
+引数に応じたサブ画面という構成で起動するようになっています。

このため、コマンドライン引数から情報を得ても、
必ずしもそのmdbを特定できるとは限らないのです。
すいません。


b)GetObjectですと以下のようになりますでしょうか?

  Set objAcc = GetObject(, "Access.Application")
  If (Not objAcc Is Nothing) Then
    objAcc.doCmd・・・
  End If

  ↑この方法ですと、2つ以上のmdbが開いているときに、
   どのmdbにdoCmdが発行されるかわかりません。


ここまでの疑問点。
1.「この名前のMDBが既に立ち上がっているよ!」
   のような、簡易な方法は無い物か。。。

2.b)で、複数のMDBが既に起動している場合でも、
  特定のMDBに対してDoCmdが発行できないか。。。

TO 有志の皆様
このレスより下は、Excel質問箱に移動させていただきます。
よろしくお願いいたします。

【11363】Re:ExcelからAccessを起動する方法
発言  YU-TANG  - 10/1/7(木) 21:10 -

引用なし
パスワード
   こんばんは、YU-TANG です。

本スレは Excel 板の方で解決済みですので、本来ならレスする意味は
ありませんが、このまま放置すると過去ログ等で読む方に無用の誤解を
与える危険性があるため、あえてレスを付けておきます。

> このため、コマンドライン引数から情報を得ても、
> 必ずしもそのmdbを特定できるとは限らないのです。

「コマンドライン引数から情報を得」るわけではありません。
「Access のプロセス」の「CommandLine を調べ」ると書きましたよ。
なので、起動時に開いた MDB のフルパスが入ってきます。

一度でも実際に試して CommandLine プロパティの値を覗くか、
せめて前回のレスで提示したキーワードで検索すればすぐに
分かることなので、よもや検索すらせずに思い込みでレスされる
とは予想もしていませんでした。止むを得ずフォローしておきます。

これが分かると、ユーザー環境によって配置が変わっている可能性が
あるため、フルパスを特定できない MDB (=GetObject でインスタンスを
取得できない) でも、もし起動していればファイル名で検索して
フルパスを引っ張ってこれる (=GetObject でインスタンスを取得
できるようになる) という利点があります。

> b)GetObjectですと以下のようになりますでしょうか?
>
>   Set objAcc = GetObject(, "Access.Application")

MDB のパスが分かっているのであれば、MDB のパスで取得すればよいです。

Set objAcc = GetObject("MDB のパス")

過去ログ向けのレスは以上です。

【11368】Re:ExcelからAccessを起動する方法
発言  へらぶな  - 10/1/12(火) 13:25 -

引用なし
パスワード
   ▼YU-TANG さん:

へらぶなです。こんにちは。

>「コマンドライン引数から情報を得」るわけではありません。
>「Access のプロセス」の「CommandLine を調べ」ると書きましたよ。
>なので、起動時に開いた MDB のフルパスが入ってきます。
>
>一度でも実際に試して CommandLine プロパティの値を覗くか、
>せめて前回のレスで提示したキーワードで検索すればすぐに
>分かることなので、よもや検索すらせずに思い込みでレスされる
>とは予想もしていませんでした。止むを得ずフォローしておきます。

コマンドラインの引数の話だと思い込んでしまったため、
検索も同様の思い込みで行い、引数だけではだめだと思い、
テストもしませんでした。

本当に情けなく、YU-TANGさんには大変失礼なことをしてしまいました。
申し訳ありませんでした。深くお詫びいたします。

【11369】Re:ExcelからAccessを起動する方法
発言  へらぶな  - 10/1/12(火) 14:12 -

引用なし
パスワード
   へらぶなです。こんにちは。

>「コマンドライン引数から情報を得」るわけではありません。
>「Access のプロセス」の「CommandLine を調べ」ると書きましたよ。
>なので、起動時に開いた MDB のフルパスが入ってきます。

これは、下記のように取得できることがわかりました。

Private Sub GetCommandLine()

  Dim Proc As Object
  
  'コマンドラインよりmdb起動  
  Call Shell("MSAccess.exe C:\db1.mdb /cmd 受注")
  
  For Each Proc In GetObject("winmgmts:").InstancesOf("Win32_Process")
    If Proc.Name = "MSACCESS.EXE" Then

      'MSAccess.exe C:\db1.mdb /cmd 受注 と表示される。
      MsgBox Proc.CommandLine

    End If
  Next
End Sub

これで、Accessのプロセスから、コマンドラインを元に、
目的のMDBが既に開いているかわかります。

大変失礼致しました。少しでも皆様のお役に立てば幸いです。

【11371】Re:ExcelからAccessを起動する方法
お礼  YU-TANG  - 10/1/12(火) 21:05 -

引用なし
パスワード
   へらぶなさん、こんばんは。

丁寧なフォローありがとうございます。
誤解が解けて安心しました。

それでは。

511 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078195
(SS)C-BOARD v3.8 is Free