未だWIN7にてACCESS2003を使っています。ACCESSファイルAのフォーム上ボタンからACCESSファイルBのフォームを開きたいのです。ネットで調べて”Set acApp = CreateObject("Access.Application")
acApp.OpenCurrentDatabase***等のコードを記述したところ記述直後は動作するのですが、一旦ASSESSを終了して再度動作させてみるとフリーズしてしまうのです。何度同じ事をしても一緒です。意味がわからなくて。SheLLを使うとACCESSファイルBは何度でも開くのですがそこからリンクさせた所定のフォームを開く方法がわかりませんファイルAフォームのIDと関連させたファイルBフォームを開きたいのです。
通報 ...
未だWIN7にてACCESS2003を使っています。ACCESSファイルAのフォーム上ボタンからACCESSファイルBのフォームを開きたいのです。ネットで調べて”Set acApp = CreateObject("Access.Application")
acApp.OpenCurrentDatabase***等のコードを記述したところ記述直後は動作するのですが、一旦ASSESSを終了して再度動作させてみるとフリーズしてしまうのです。何度同じ事をしても一緒です。意味がわからなくて。SheLLを使うとACCESSファイルBは何度でも開くのですがそこからリンクさせた所定のフォームを開く方法がわかりませんファイルAフォームのIDと関連させたファイルBフォームを開きたいのです。
何をしたいのか良く分かってないんですが、
やり取りじゃなくて一方通行でいいのなら
●ファイルB側に以下を作成
標準モジュール
マクロ1
●ファイルA側で以下を実行
`
ファイルAで指定したレコードのIDをファイルBのフォームで拾ってどうのする、という考えで書いてますが、
単純にフォーム開くだけでいいならマクロ1の中身を「フォームを開く」とかにして
ファイルA側のコマンドの「/cmd」以降は不要です。
なお当方2003環境ないので試してないです。
朱色様へ回答ありがとうございました。一方通行でいいのです。下記で記述して記述直後は動作するのですが一旦アプリを終了して再度実行するとフリーズしてしますのです。
Dim acMdb As Object
Set acMdb = GetObject("C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb")
acMdb.Application.Visible = True
acMdb.Application.UserControl = True
acMdb.Application.DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & Me.[部品構成ファイル対象ID]
Set acMdb = Nothing
それで Shell ("msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb") を記述し直ししました。
具体的に標準モジュールには同記述するといいでしょうか? そしてマクロには?
そしてShell "Accsess本体パス\MSACCESS.EXE" "DBファイル.accdb" /x マクロ1 /cmd "ファイルBに渡す内容(IDとか)"には? ちなみにマクロ1の前のXは必要でしょうか?
すみません、知識(勉強不足)で基本が理解できていなくて・・・
その後 ファイルBの方のマクロ(MaOpenFormBという名前にして)をフォーム開くで所定のフォームは開ける様になりました(ファイルAのフォーム上のボタンには『Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x MaOpenFormB", vbNormalFocus
』と記述しました)。あとやりたいことはフォームAに登録している番号(B用の)と合致する条件でファームBを開きたいのです。 "部品ID=" & Me.[部品構成ファイル対象ID] の部分です。これはどこに記述したらいいでしょうか? MaOpenFormBのWHERE条件部でしょうか?そこにはファイルAフォームの事も記述可能なのでしょうか?
度々すみません。
/x は Accsess起動時にこのマクロを実行してね、という意味です。
/cmd は Accsess起動時にコマンド値を持たせてね、という意味です。Commandて打つと渡したコマンド値を教えてくれます。
参照:Microsoft Office 製品のコマンド ライン スイッチ
今回の場合は「 /cmd Me.[部品構成ファイル対象ID]」で値を持っていけると思います。
取り出したい場合はCommandて打てばよいので、前回回答でいうSamoleの中身は
という形になります。
なお /x で指定できるのはマクロだけなので、
マクロ1呼び出し→マクロ1でプロシージャSamole呼び出し→Samoleでフォーム呼び出し
という流れを作っていました。
マクロでもwhere文にcommand使えるならモジュールの作成は不要ですが、
試してないので...
朱色様へ 度々の回答ありがとうございました。ファイルBのプロシージャ実行マクロが動作しないのです。モジュール(Module1)自体は動作するのですが。マクロのプロシージャ名をModule1にしているのですが”名前が見つからない”となります。記述が間違っているのでしょうか?
その後自分の間違いも気づき+ファイルBのマクロをプロシージャの実行でなくマクロの実行で、マクロ自体は動作できました。但しファイルAのボタンコードを 『Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x MaOpenForm /cmd Me.[部品構成ファイル対象ID]", vbNormalFocus』にしたのですが所定のフォームは開きますが合致するレコードに移動せずに先頭レコードで開いてしまいます。フォーム開く条件をどうすれば指定のIDのページに移動出来るでしょうか? 度々申し分けありません。
>> 7
ファイルBのマクロはどう記述したの?ファイルBのプロシージャはどう記述したの?
回答5に対する現状報告があった方が、朱色さんの手間が省けるんじゃない?と思いました。
横入り、ごめんね。
マクロからプロシージャを呼び出す場合、モジュール名ではなく関数名を指定する必要があります。
また、今回のように埋め込みマクロではない場合、標準モジュールである必要があります。
マクロ:プロシージャの実行 のヘルプ
エラーが出る場合、
・標準モジュールではない
・publicではなくprivateを指定している
・functionではなくsubを指定している
・モジュール名と関数名が同じ(モジュール「Module1」に「public function Module1() ...」と書いている)
のいずれかだと思います。
参考:マクロでプロシージャを実行させる方法
ちなみにマクロ内でCommand関数の呼び出しチャレンジしてみたのですが、私にゃムリでした。
マクロからプロシージャを呼び出すしかないですね。
あと自分の書き方が悪くてすみません、一部修正します。
↓
朱色様へ回答ありがとうございました。毎回手間かけて申し分けありません。りんご様もコメントありがとうございました。確かに仰る通りでした。
ファイルAのフォーム上ボタンコードには連絡頂いた『Shell "msaccess ""C:\Users\user\Desktop\ACCESSファイル\製品部品構成.mdb"" /x MaOpenForm /cmd" & Me.[部品構成ファイル対象ID], vbNormalFocus』を記述してファイルBのモジュールには『Public Function MaOpenForm()
DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & cmd』にしてマクロにはアクション:マクロの実行 マクロ名:MaOpenForm として実行しますとファイルBを開くときに”マクロを再帰的に呼び出せるのは最大20回までです・・・”の警告がでてしまいます。再度実行しても同様でした。何が起きているのでしょうか?
マクロMaOpenFormの中身が「マクロMaOpenFormを呼び出す」なのであれば、
マクロMaOpenFormがマクロMaOpenFormを呼び出して、
呼び出されたマクロMaOpenFormがマクロMaOpenFormを...のループになりますね。
マクロMaOpenFormの中身を「プロシージャMaOpenFormを呼び出す」に変えましょう。
また「 DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & cmd」ですが、
「/cmd」で持ってきたコマンド値を取得するには「Command」を記載する必要があります。
Command関数はコマンド値を取得するための関数になりますので、名称の変更は出来ません。
date関数で本日の日付が取得できるような感じです。
朱色様へ回答ありがとうございました。
まずファイルBのマクロを アクション:プロシージャの実行 プロシージャ名:MaOpenForm にして実行すると『指定した式に含まれる名前にはMaOpenFormが見つかりません』となるのです。これは何故でしょうか?(こうなるのでアクションをマクロの実行にしたのですが連絡しました通りのループのエラーがでてしまうのです)
モジュールですが『DoCmd.OpenForm "F部品入力", acNormal, , "部品ID=" & =Command()』になりますでしょうか? コマンドの名称が理解できてなくて。マクロでエラーするので先に進めず結果がわからないのですが。
多分私の記述が間違えていると思うのですが・・・度々申し分けありません。
マクロ名、モジュール名、プロシージャ名を混同されているような感じなので、下記のように区別がつきやすい名前に変更しましょう。
標準モジュール モジュール名 mdlOpenForm (モジュール名は使わないのでなんでもよい)
このモジュール内に下記のようなプロシージャを作成
これでプロシージャ名は prcOpenForm になります。
注:Function プロシージャにしてくたさい。Subプロシージャはマクロからは参照できません。
・マクロは下記のように設定します。
マクロ名 mcrOpenForm
プロシージャの実行
プロシージャ名 prcOpenForm()
注:プロシージャ名の末尾に () が必要。
ファイルAのフォーム上のコマンドボタンのクリック時のコードは、
以上でどうでしょうか。
hatena様
回答ありがとうございました。全てアドバイス通りにしましたら問題なく実行できました。解決しました! 私が記述ルールを理解してなかったのと名前がごっちゃになっていたのですね。色々してたら混乱してしまって・・・本当にありがとうございました。すっきりしました。
朱色様へ
私の説明不足(分かりにくい表現等)の中、何度も回答頂きありがとうございました。大変お手数かけました。大変勉強になりました。本当に感謝です。
ACCESSはなんて便利だろうと思って使っているのですが、奥が深いですね・・・