Excel VBA質問箱 IV

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

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


3140 / 13644 ツリー ←次へ | 前へ→

【63979】ExcelからAccessを起動する方法 へらぶな 10/1/7(木) 12:22 質問[未読]
【63980】Re:ExcelからAccessを起動する方法 Yuki 10/1/7(木) 13:33 発言[未読]
【63985】Re:ExcelからAccessを起動する方法 へらぶな 10/1/7(木) 17:04 お礼[未読]

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

引用なし
パスワード
   へらぶなと申します。
質問をAccess質問箱よりこちらに移動させていただきました。
よろしくお願いいたします。

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では不適切。


****ここより、YU-TANGさんへの回答

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が発行できないか。。。

よろしくお願いいたします。

【63980】Re:ExcelからAccessを起動する方法
発言  Yuki  - 10/1/7(木) 13:33 -

引用なし
パスワード
   ▼へらぶな さん:
とりあえず試してみて下さい

Sub SetAccMdb()
  Dim strMdb As String
  Dim objMdb As Object
  
  strMdb = "D:\hoge.mdb"  'MDBのフルパス
  Set objMdb = GetObject(strMdb)
  objMdb.Visible = True
  objMdb.DoCmd.OpenForm "開くフォーム名", acNormal
End Sub

【63985】Re:ExcelからAccessを起動する方法
お礼  へらぶな  - 10/1/7(木) 17:04 -

引用なし
パスワード
   ▼Yuki さん:
こんにちは、へらぶなと申します。

早速試させていただきました。
おおおぉ、うまくいきました!ありがとうございます。

ただ、このソースのままだとエラーが発生するので
エラーが出ないように修正したソースを載せますね。

Private Sub AccAppOpen(ByVal strフォーム名 As String)

  Dim strMdb As String
  Dim objMdb As Access.Application
 
  strMdb = "C:\db1.mdb"  'MDBのフルパス
  Set objMdb = GetObject(strMdb)
  
  If Not objMdb.Visible Then
    objMdb.Visible = True
  End If
  
  objMdb.DoCmd.OpenForm strフォーム名, acNormal, , , , acWindowNormal
  objMdb.DoCmd.Maximize
  
  If Not objMdb.UserControl Then
    objMdb.UserControl = True
  End If
  
  Set objMdb = Nothing
  
End Sub

これで「わからないこと b)」は解決です。
「わからないこと a)」も、この方法なら2重起動しないので
問題ありません。

ご協力いただいた方々、本当にありがとうございました。

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