三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

QA101025 ExcelからAccessを開き、フォームに値をセットする

ExcelからAccessを開き、フォームに値をセット後、ボタンを押す。
ボタンのモジュールをコールや.RUNすることができなくて、中途半端な処理の解説です。

下記の質問

①エクセルからアクセスを開き表示されるフォーム(アクセス側)のテキストボックスに定型文字を入力、
その後コマンドボタンクリック等のコントロールができるでしょうか?

上記①は、実際にはエクセルで処理したデータを、アクセスで作られた管理システムへ入力しないといけないのですが、
管理システムを開いた際のフォームに、社員番号、パスワードを入力しログインボタン→次のフォームが表れエクセル
でいうオプションボタン(3つほどある)を選択し入力開始というような作業を自動化したいと考えています。

に対して、

三流君VBAExcelからAccessを操作する
http://www.ken3.org/cgi-bin/group/vba_excel_access.asp
↑手前味噌のここから、モジュールをコピーしてテストで使ってみた。
※が、.RUNでプライベートのモジュール フォームのボタンが起動できなかったので、
苦肉の策で、.SetFocusでフォーカスをあててから、SendKeysでリターンキーを送ってみた。。。

Option Explicit

Sub test1025_001()

    Dim objACCESS As Object
    
  'ExcelからAccess起動
    'Accessのアプリケーションオブジェクトを作成する
    Set objACCESS = CreateObject("Access.Application")
    objACCESS.Visible = True     'Accessを表示ONあたりまえか
    objACCESS.UserControl = True 'Excelで操作するんだけど、ユーザーのTrueにしておく
  'AccessのMDBを開く
    'もちろん、次はファイルを開かないとね ファイル名 フルパスを渡す
    objACCESS.OpenCurrentDatabase "D:\vba\QA101025\DB001.mdb"
    'ActiveWorkbook.Path & "\DB001.mdb" とか、相対パスのほうが後々いいかも

  '指定したフォームを開き、ユーザー名とパスワードのセット(Access側)
    ' 指定のフォームを開く、ここでは、MENU_Login で ログインの画面を開く
    objACCESS.DoCmd.OpenForm "MENU_Login", 0 'acNormal=0 フォームの名前を指定して開く
    
    'データをセットする
    objACCESS.Forms("MENU_Login")![F社員番号] = "A001"
    objACCESS.Forms("MENU_Login")![Fパスワード] = "1234"
    DoEvents
    
    '↓デバック用で少し待つ(※これは通常いらないです)
    Application.Wait Time:=Now + TimeValue("00:00:03")  '画面遷移がはやいので3秒間止める
    
    'プライベートのログインボタンの関数 が コールできなかったので、
    objACCESS.Forms("MENU_Login")![btnログイン].SetFocus 'フォーカス セット後
    DoEvents
    SendKeys "{ENTER}"    '苦肉の策でリターンキーを送る
    
    '↑でフォームが表示されるまでを待ちたかったので、3秒待ってみました。
    Application.Wait Time:=Now + TimeValue("00:00:03")  '画面遷移がはやいので3秒間止める
    
    'データをセットする
    objACCESS.Forms("明細テスト")![op1] = 1  'オプションボタン(グループに値をセット)
    objACCESS.Forms("明細テスト")![op2] = 2
    objACCESS.Forms("明細テスト")![op3] = 3
    '備考
     objACCESS.Forms("明細テスト")![備考] = "zzzzzz" & vbCrLf & "xxxxxxx" 'vbCrLfで改行
    '数量
     objACCESS.Forms("明細テスト")![数量] = 999

    DoEvents
    
    'B登録
    'プライベートのログインボタンの関数 が コールできなかったので、
    objACCESS.Forms("明細テスト")![B登録].SetFocus 'フォーカス セット後
    DoEvents
    SendKeys "{ENTER}"    '苦肉の策でリターンキーを送る
    
    Set objACCESS = Nothing  ' オブジェクト開放、もう私Excelから使用しないから

End Sub

処理の解説

CreateObject("Access.Application")
で、Accessのアプリを作って、
.OpenCurrentDatabase "フルパス\ファイル名.mdb"
で、MDBを開き、

頭に、参照用の objACCESS と 変数を付けて( Set objACCESS = CreateObject("Access.Application") )
DoCmd.OpenForm "フォーム名"
objACCESS.DoCmd.OpenForm "MENU_Login", 0 'acNormal=0 フォームの名前を指定して開く
で、開いてみた。

あとは、データのセットで、これも、頭に objACCESSと付けただけで、
objACCESS.Forms("MENU_Login")![F社員番号] = "A001"
objACCESS.Forms("MENU_Login")![Fパスワード] = "1234"
こんな感じで、
objACCESS.Forms("フォーム名")![コントロール名] = 値
で、セット。

.Run できなくてハマる

次は、ログインボタンを押した処理なんですが、
普通に関数実行のメソッド .RUNで
objACCESS.Run "btnログイン_Click" と クリックのモジュールを呼び出そうとするが、
イベントプロシージャはプライベートの関数(Private Sub btnログイン_Click())なので、
.RUNで呼ぶことができなかった...

フォーカスを当てて、リターンキーを送ってみたけど

あまり、好ましくないけど、
フォーカスを当てて、リターンキーを送って
ボタンを押したように 動作させてみた。

   'プライベートのログインボタンの関数 が コールできなかったので、
    objACCESS.Forms("MENU_Login")![btnログイン].SetFocus 'フォーカス セット後
    DoEvents
    SendKeys "{ENTER}"    '苦肉の策でリターンキーを送る

試行錯誤の動画

いつものように、軽く処理しようと動画を撮りながら解説していたら、
ハマった、そんな動画は下記を見てください。

http://www.youtube.com/watch?v=b_9K4vMJ3pY
www.youtube.com

終わりのあいさつ

フォームのモジュールを直接呼べなかったのが、再調査の必要がありそうです。
なんか、しっくりこないけど、こんな方法もあるってことで...

何かの参考となれば幸いです。。。。 三流プログラマー Ken3

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)