Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No19195.呼び出し元フォームのモジュールを実行したい

タイトル呼び出し元フォームのモジュールを実行したい
記事No: 19195
投稿日: 2005/03/31(Thu) 19:05
投稿者: OgO
初めまして、皆様、お知恵をおかし頂けたら有難いです

フォームAからフォームBを開いて、フォームB側でフォームAのイベントを実行したいと思っています

--------------------以下 例--------------------

'呼び出し元フォームのロジックパターンA

Private Sub Button1_Click()

DoCmd.OpenForm "AAA", acNormal, , , acFormPropertySettings, acWindowNormal, _
Me.Name & ":" & Screen.ActiveControl.ControlName

Text1.SetFocus

Exit Sub

After_Logic:
Text1.Text = gCode

End Sub

Public Function Button1_AfterLogic()

Text1.Text = gCode

End Function

'呼び出し元フォームのロジックパターンB

Private Sub Button1_Click()

DoCmd.OpenForm "AAA", acNormal, , , acFormPropertySettings, acWindowNormal, _
Me.Name & ":" & Screen.ActiveControl.ControlName

Text1.SetFocus

Exit Sub

After_Logic:

Text1.Text = gCode - 50

If Text1.Value = 1 Then
Text2.Name = "xxx"
End If

End Sub

Public Function Button1_AfterLogic()

Text1.Text = gCode - 50

If Text1.Value = 1 Then
Text2.Name = "xxx"
End If

End Function

'呼び出し先フォームのセットロジック

Public Sub SetValue()

mForm.Tag = gconTrue

gCode = [画面のコード]

On Error Resume Next

'mFormは呼出元フォームをAccess.Form変数に入れてます
'mButtonは呼出元フォームのコマンドボタンをAccess.CommandButton変数に入れてます

Application.Run mForm.Name, "mButton_AfterLogic"

DoCmd.OpenModule mForm.Name, "mButton_AfterLogic"

DoCmd.Close acForm, Me.Name

End Sub

-----------------------------------------------

フォームBはあちこちで使われる共通フォームです
gCodeに値をセットしてそれを元フォームで取得して処理を実行します
処理:After_Logicの部分はまちまちです

元々はフォームBをダイアログで開いて
フォームAに戻ってきたときにAfter_Logicの処理をしていたのですが
フォームBでボタンが効かなかったりするのでやめようとしています

しかし今のところはダメです

Application.Run なり DoCmd.OpenModule が機能してくれません(構文エラー)
Button1_Click で GoSub After_Logic が実行できれば最高なんですが(^o^)

なにかいい方法があればよろしくお願いします

------------------- エラー --------------------

Application.Run のエラー

(2517)'Form1' プロシージャを見つけることができません。
Visual Basic コードで Run メソッドを使おうとしましたが、プロシージャ名の指定が不正です。
または、データベースを開かずに Run メソッドを使おうとしました。
"OpenModule/モジュールを開く" アクションまたは OpenModule メソッドを使おうとしましたが、
有効なプロシージャ名が指定されていません。

DoCmd.OpenModule のエラー

(2516)'Form1' モジュールを見つけることができません。
@"OpenModule/モジュールを開く" アクションまたは OpenModule メソッドを使おうとしましたが、
[Module Name/モジュール名] 引数で指定したモジュールを見つけることができません。
@カレント データベースの有効なモジュール名を指定してください。

タイトルRe: 呼び出し元フォームのモジュールを実行したい
記事No: 19198
投稿日: 2005/03/31(Thu) 22:28
投稿者: TWEST
なんだかよく分かりませんが、ヘルプで
Public キーワード
Call ステートメント
について調べてみれば良いのではないかと思います。

タイトル補足です
記事No: 19200
投稿日: 2005/04/01(Fri) 09:36
投稿者: OgO
長々と書いておりますが
Call や Application.Run 等を使って、
Formのクラスモジュールを文字列で指定して実行したいという事です

タイトルRe: 補足です
記事No: 19209
投稿日: 2005/04/01(Fri) 16:29
投稿者: ひろし
良く分からないけど、
呼び出し元のフォーム名をForm1とし、
実行したいイベントプロしジャーをButton1_Clickとした場合、
Form1の
Private Sub Button1_Click() を
Public Sub Button1_Click() に変更し、

Form1のButton1_Clickを呼び出したいフォームで
Private Sub Button2_Click()
Dim frmForm1 As Form

DoCmd.OpenForm "Form1", , , , , acHidden 'Form1が開かれている上体ではこの行は不要
Set frmForm1 = Forms("Form1")

Call frmForm1.Button1_Click
Set frmForm1 = Nothing

DoCmd.Close acForm, "Form1" 'Form1が開かれている上体ではこの行は不要
End Sub
とかじゃダメですか。
上記では"Form1"と定数で指定しましたが、Public変数などにすれば可変になると思います。

タイトルRe^2: 補足です
記事No: 19211
投稿日: 2005/04/01(Fri) 18:21
投稿者: OgO
レスありがとうございます

なかなか伝えきれず申し訳ありません

Call Form変数.Button1_Click は当然できると思います

しかしやりたいのは

Call Form変数.CommandButton変数_Clickなんです
(FormもButtonも変わる)

たとえば意味は違うけどこんな感じでできれば

ExecuteCommand Form変数.CommandButton変数.OnClick

とりあえずの解決方法は考えました

Select Case CommandButton変数.Name
Case "ButtonA"
Call Form変数.ButtonA_Click
Case "ButtonB"
Call Form変数.ButtonB_Click
        :
        :
        :
        :
End Select

ここを使用するコマンドボタンの名称を全て書けばできますが
できれば汎用的にしたかったもので

タイトルRe^3: 変数を用いてプロシージャを実行する方法?
記事No: 19215
投稿日: 2005/04/02(Sat) 01:44
投稿者: uni
とりあえず思い付いたことです。
合ってる自信はありませんが。。。すみません。

■案1)Eval 関数を使う
→標準モジュールの場合は、大丈夫そう。。。
 しかし、フォーム(クラス)モジュールで試したみたら、
 Eval 関数に渡した、文字列式 が、数回実行されてしまう。。。

参考
 文書番号:100164
 ACC:文字列変数を使用すると、関数を呼び出す方法。
 http://support.microsoft.com/default.aspx?scid=kb;ja;100164

 [AC97]カスタムメソッドが複数回実行される
 http://fukkey.dyndns.org/pins/acc/991130/21444.html

■案2)CallByName 関数を使う
→CallByName 関数は、ACCESS2000からの新関数(当方の環境は、AC2000)。
とりあえず以下のような感じで動いてるみたいです。

 ◆呼び出し元

 ◇ボタンのクリック時

 Private Sub BtnA_Click()
  DoCmd.OpenForm "フォーム名", , , , , , Me.Name & ":" & "SubA"
 End Sub

 ◇ボタンのクリック時のつづき(After_Logicの部分)

 Public Sub SubA()
  MsgBox Me.Name & "/SubA"
 End Sub

 ◆呼び出し先

 Dim MyFrm As Form
 Dim ProcName As String
 Dim Pos As Integer

 Pos = InStr(Me.OpenArgs, ":")
 Set MyFrm = Forms(Left(Me.OpenArgs, Pos - 1))
 ProcName = Mid(Me.OpenArgs, Pos + 1)

 CallByName MyFrm, ProcName, VbMethod

■追記(4/3 17:35)
もしかすると、以下のようなこと?の気がしてきた。。。

#021 指定オブジェクトが閉じるのを待つ
http://www.tsware.jp/tips/tips_021.htm

タイトル解決しました
記事No: 19233
投稿日: 2005/04/04(Mon) 11:47
投稿者: OgO
> ■案1)Eval 関数を使う
> →標準モジュールの場合は、大丈夫そう。。。
>  しかし、フォーム(クラス)モジュールで試したみたら、
>  Eval 関数に渡した、文字列式 が、数回実行されてしまう。。。

Eval はすでに試していましたがちょっと違いました

> ■案2)CallByName 関数を使う
> →CallByName 関数は、ACCESS2000からの新関数(当方の環境は、AC2000)。

ばっちりでした
これが欲しかった

当方ずっと97を使ってテストしていましたのでこの関数はヘルプにも出てきませんでした
2000でやってみたらばっちりでした

uni様 ありがとうございました

> ■追記(4/3 17:35)
> もしかすると、以下のようなこと?の気がしてきた。。。
>
> #021 指定オブジェクトが閉じるのを待つ
> http://www.tsware.jp/tips/tips_021.htm

結局はこういう事なのですが、ダイアログをやめると同時に
メインで開いているフォームの裏で別の処理を動かないようにしたかったのです
今回のケースでは呼び出し元の一プロシージャを実行すればいいだけでしたし

uni様 重ね重ねありがとうございました


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています

cPanelとPLESKインストール済みのアダルトサイト対応レンタルサーバーをご提供しています。もちろん、海外大手のデータセンターにサーバー機器を収納します。
cPanelやPLESKをインストールしたレンタルサーバー。
アダルトサイトにも対応済み。
海外大手データセンターにサーバー機器を収納しています。

 

ページの先頭へ 前ページへ戻る