Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Excel 2013)
ExcelのVABでAccessのフォーム上のボタンを押す方法
投稿日時: 18/08/25 01:56:00
投稿者: sundayyonday

こんにちは。
ExcelのVBAを使って、アクセスを開き、Accessのフォーム上のボタンを押す方法を探しているのですが、なかなか回答にたどり着けません。
もちろん、ボタンを押す操作ではなく、プロシージャを呼び出して実行する方法でも大丈夫です。
 
現在以下のように書いています。
実際のコードは会社で作っており、下のコードは自宅のノートパソコンで記憶をたどりながら手打ちしています。
多少の打ち間違いがあるかもしれませんが、ご容赦ください。
 
ちなみに、ボタンがあるホームの名称は「Menu」です。
ここに、Start という名称のボタンがあります。
このボタンを押すと、いろいろな作業が始まると言う作りにしてあります。
 
VBAの画面で見ると、標準モジュールではなく、Form_Menu という名称の箇所に以下のコードが書かれています。
 
 
Sub test()
 
dim objACS as object
dim strmdb as string
 
Strmdb= "sample.mdb"
 
set objACS = createoject("Access.application")
objACS.OpenCurrentDatabase Activeworkbook.path & "\" & strmdb
 
' ここまではうまくいきます。Accessが起動してくれます。
’ しかし、下のコードは、「Start_Clickは見つかりません」というエラーメッセージが出てしまいます。
 
objACS.run  ”Start_Click”
 
ObjACS.CloseCurrentDatabase
 
Set ObjAccess =nothing
 
ObjACS .close
 
end sub

回答
投稿日時: 18/08/25 08:38:47
投稿者: WinArrow
投稿者のウェブサイトに移動

>ExcelのVABでAccessのフォーム上のボタンを押す方法
 
は、知りませんが、
 
Accessのフォームを使わずに
Excelのユーザーフォームが使えませんか?
最も、ユーザーフォームのコントロール値を
Accessデータベースから取り込んだり、書き込むコードも必要になりますが・・・

投稿日時: 18/08/25 09:47:51
投稿者: sundayyonday

WinArrowさま、早速のご回答ありがとうございます。
 
Excelのユーザフォーム上にボタンを作り、そのボタンを押すとアクセスのデータを取り込み、いろいろ作業が走ると言うイメージですね。
 
残念ながら、ちょっとそれは今からですとあまりも大変です。
今回のアクセスでは、Menuフォーム上のボタンを押すと、複数のテーブルを読み、抽出やデーターの抜き出しなどを繰り返して、最後にはExcelの表を作り、デスクトップに吐き出すと言う仕組みができあがっています。
この作業を終えるのにも、5分程度時間がかかります。
5万件のデータをあつかっているためです。
 
これをExcelのユーザフォームに持ってくると言う事は、おそらくアクセスで作ったものをExcelで作り直すことになるのではないかと思います。
テーブル処理があまりにも多いため、ちょっとExcelでは厳しい気がしています。
 
 
私が知りたいのは、以下の一行のコードの書き方です。
  objACS.run  ”Start_Click”
 
おそらく書き方が悪いのではないかと思いますが、何が悪いのかがわかりません。
プロシージャーの実行だと上の書き方で良いはずなのですが、フォーム上にプロシージャーがあるとrunではだめなのでしょうか。
 
もしくはクリックボタンを押す動作は、プロシージャーの呼び出しができないのでしょうか?
 
 

回答
投稿日時: 18/08/25 13:58:59
投稿者: WinArrow
投稿者のウェブサイトに移動

質問文でそのままネット検索してみたらいかがでしょうか?
 

投稿日時: 18/08/25 19:05:32
投稿者: sundayyonday

WinArrow様
 
ご回答ありがとうございました。
 
実は、会社でも質問文と同様の内容をかなり探してみたのですが、いくら探しても見つけることができず、昨晩、こちらの掲示板を頼らせていただきました。
本日も再び探してみたのですが、まだ見つけることができません。
残念です。
 
 

回答
投稿日時: 18/08/25 22:25:02
投稿者: WinArrow
投稿者のウェブサイトに移動

>Start_Clickは見つかりません」というエラーメッセージが出てしまいます
 
Excelでもそうですが、他ブックのプロsじゃを呼び出すときには、
RUN myBook.Name & "!START"
のように、"Book1.xlsx!START" という文字列になるようにする必要があります。
Accessの場合、ブック名のところが何になるのか調査してみてください。

投稿日時: 18/08/25 23:06:56
投稿者: sundayyonday

WinArrow様
 
お付き合いいただき、ありがとうございます。
会社のパソコンでは以下の組み合わせをやってみました。
menu はフォームの名称です。
Start_Clickはプロージャ名で、Startはボタン名です。
 
 
objACS.run  ”Start_Click”
objACS.run  ”Start”
objACS.run  ”menu!Start_Click”
objACS.run  ”form!menu!Start_Click”
objACS.run  ”form.menu!Start_Click”
objACS.run  ”form_menu!Start_Click”
 
この他、formをフォーム(カナ)に直してトライしてみました。
しかしどれも動きませんでした。
一応月曜日に会社で再度トライしてみます。
 
わからないところは正しくWinArrowさんのアドバイス通りで、"Book1.xlsx!START" のブック名がアクセスの場合に何になるのかを知りたいです。
このルールが見つけられなくて困っています。

回答
投稿日時: 18/08/26 16:20:44
投稿者: WinArrow
投稿者のウェブサイトに移動

直接、アクセスのフォームのボタンをクリックするなんて、無理でしょう。
  
↓は、Excelの例ですが、自ブック内からでも
ユーザーフォーム内のコマンドボタンをクリックイベントを実行することは、無理です。
↓のような対応が必要です。
 自ブック内の
標準モジュールとユーザーフォームの例です。
  
標準モジュール側
Sub test()
     UserForm1.Show vbModeless
     Call UserForm1.mTEST
     Unload UserForm1
 End Sub
   
ユーザーフォーム側
Private Sub CommandButton1_Click()
     MsgBox "OK"
 End Sub
   
   
 Friend Sub mTEST()
     Call CommandButton1_Click
 End Sub
   
 
しかし、コマンドボタンをクリックすることが目的ではないはずです。
コマンドボタンをクリックしたときに実行したい処理を「本体処理」として、
標準モジュールに「本体処理」を定義します。
コマンドボタンウリックイベントからは「本体処理」を呼び出しだします。
 
そうすれば、標準モジュールの「本体処理」は、他からでも呼びだせます。
 
これは、考え方なので、
実際には、フォームのコントロールを参照している可能性もあるので、
状況によって、「本体処理」の定義方法(コーディング)が変わるかも?
 
 
 

回答
投稿日時: 18/08/27 10:06:09
投稿者: sk

引用:
ExcelのVBAを使って、アクセスを開き、Accessのフォーム上のボタンを
押す方法を探しているのですが、なかなか回答にたどり着けません。
もちろん、ボタンを押す操作ではなく、プロシージャを呼び出して
実行する方法でも大丈夫です。

引用:
ちなみに、ボタンがあるホームの名称は「Menu」です。
ここに、Start という名称のボタンがあります。
このボタンを押すと、いろいろな作業が始まると言う作りにしてあります。

・Access のフォームモジュールに記述されているコードは、
 そのフォームを開かない限り実行されない
 
・そのプロシージャのスコープが Public ではなく
 Private であるならば、他のモジュールから
 そのプロシージャを呼び出すことは出来ない。
 
・したがって、[menu]のフォームモジュールにおいて定義されている
 Start_Click プロシージャのスコープが Private のままである限りは
 実現不可能である
 
・あらかじめ Start_Click のスコープを Public に変更した上、
 OpenForm メソッドによって[menu]が開かれた状態であれば
 Start_Click を呼び出すことも一応可能ではあるが、推奨はしかねる。

回答
投稿日時: 18/08/27 10:47:52
投稿者: Suzu

引用:
VBAの画面で見ると、標準モジュールではなく、Form_Menu という名称の箇所に以下のコードが書かれています。

 
 
Form_Menu という名称の箇所に以下のコード
 
これは、ExcelのVBE画面でなく、AccessのVBE画面ですよね?
という事は、Excelから、Accessのファイルを開き、
  そのAccess ファイルから、更に、sample.mdb を開き、Start_Click を実行したい?
 
Excelから、直接 sample.mdb を開いてはいけないの?
 
 
 
引用:
この作業を終えるのにも、5分程度時間がかかります。
5万件のデータをあつかっているためです。

 
たかだか 5万件 で5分は掛かり過ぎと思いますよ。

回答
投稿日時: 18/09/14 17:53:53
投稿者: 渡辺 ひかる

こんにちは
 
横からすみません
 
いわゆる Accessの 「マクロ」を作って
 
acCmdRunMacro
 
するのではだめですか?
 
ここにもいろいろありますけど
https://www.moug.net/tech/acvba/0090028.html
 
Access.Application を取得しているなら
それほど難しくはないしょう
 
ただ Object 型ではなく きちんとAccessを参照設定したほうが
インテリセンス、オブジェクトブラウザも使えますから 楽ですよ
 
参考まで
ではでは

回答
投稿日時: 18/09/14 20:28:43
投稿者: よろずや

Excel から Accessアプリケーションを呼び出して実行すると、
Excel と Access のメモリ空間の間でデータのコピーが1ステップ毎に行われます。
ステップ実行で F8 キーを押しっぱなしにした状態です。
それを避けるには、Excel から Access のタイマーを蹴飛ばして逃げ帰るという手が使えます。
 

EXCEL側:
Option Explicit
Sub moug01()
Dim obj As Object
    Set obj = CreateObject("Access.Application")
    obj.Visible = True
    obj.UserControl = True
    obj.OpenCurrentDatabase ActiveWorkbook.Path & "\Database1.accdb"
    obj.DoCmd.OpenForm "フォーム1"
    obj.Forms("フォーム1").TimerInterval = 1
End Sub

ACCESS側:
Private Sub Form_Timer()
    Me.TimerInterval = 0
    Call コマンド5_Click
End Sub
Private Sub コマンド5_Click()
    MsgBox Me.フィールド1
End Sub

トピックに返信