ExcelからAccessを開き、フォームに値をセット後、ボタンを押す。
ボタンのモジュールをコールや.RUNすることができなくて、中途半端な処理の解説です。
下記の質問
①エクセルからアクセスを開き表示されるフォーム(アクセス側)のテキストボックスに定型文字を入力、
その後コマンドボタンクリック等のコントロールができるでしょうか?上記①は、実際にはエクセルで処理したデータを、アクセスで作られた管理システムへ入力しないといけないのですが、
管理システムを開いた際のフォームに、社員番号、パスワードを入力しログインボタン→次のフォームが表れエクセル
でいうオプションボタン(3つほどある)を選択し入力開始というような作業を自動化したいと考えています。
に対して、
三流君VBAでExcelから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