Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2016)
プロシージャ名を変数にしたい
投稿日時: 19/05/06 18:38:46
投稿者: アロハ

お世話になります。
 
フォームにテキストボックスが5つあります。(テキスト1〜5)
コマンドボタンをクリックしたときに、テキスト1〜5の更新後の処理を連続でやりたいです。
変数strTextに、"テキスト" & i (iは1〜5)を代入し、For i=1 to 5 で
Call strText としましたが、Callには変数の使用はできませんでした。
いろいろ調べた結果、Run strText とすればできそうでしたが、できませんでした。
呼ばれる側のプロシージャは、Private → Publicにしてみてもできませんでした。
 
Runの他にできる方法はあるのでしょうか。
 
ご指導の程、よろしくお願いします。

回答
投稿日時: 19/05/07 04:26:21
投稿者: hatena
投稿者のウェブサイトに移動

Application.Run で呼び出すプロシージャは標準モジュールに記述する必要がありますが、そうしてますか。
 
 
For i=1 to 5 から Next までの実際のコードと、
Call で呼び出されるプロシージャのコードを提示してください。
 
おそらく、CallやRunしなくてもいい、もっといい方法を提案できると思います。
 

投稿日時: 19/05/08 21:22:49
投稿者: アロハ

hatena様
 
いつもお世話になっております。
 
>>Application.Run で呼び出すプロシージャは標準モジュールに記述する必要がありますが、そうしてますか。
 
はい。標準モジュールに記述しております。
 
>>For i=1 to 5 から Next までの実際のコードと、
>>Call で呼び出されるプロシージャのコードを提示してください。
 
呼ぶ側として
Private Sub コマンド1_Click()
Dim strproc As String
     For i = 1 To 5
          strproc = "テキスト" & i
          Call proc_execution(strproc)
     Next i
End Sub
 
呼ばれる側として
Function proc_execution(strproc As String)
     Run strproc & "_AfterUpdate()"
End Function
 
と、なっております。
 
どうかご指導の程、よろしくお願いします。

回答
投稿日時: 19/05/09 09:09:28
投稿者: hatena
投稿者のウェブサイトに移動

アロハ さんの引用:
呼ばれる側として
Function proc_execution(strproc As String)
     Run strproc & "_AfterUpdate()"
End Function

 
Run strproc & "_AfterUpdate"
というようにしてください。
() は不要です。
 
あと、テキスト1_AfterUpdate, テキスト2_AfterUpdate ・・・・というプロシージャが標準モジュールにある必要がありますが、ありますか。
 
名前から判断すると、テキストボックスのイベントプロシージャのようですが。
もしそうなら、フォームのモジュールにあることになりますので、Run で呼び出すことはできません。
 
 

回答
投稿日時: 19/05/09 09:34:39
投稿者: sk

引用:
フォームにテキストボックスが5つあります。(テキスト1〜5)
コマンドボタンをクリックしたときに、テキスト1〜5の更新後の処理を連続でやりたいです。

各テキストボックスの AfterUpdate イベントの発生時において
それぞれどんなコードを実行しているのかを明記された方が
良さそうな印象。

回答
投稿日時: 19/05/09 10:01:27
投稿者: hatena
投稿者のウェブサイトに移動

sk さんの引用:
引用:
フォームにテキストボックスが5つあります。(テキスト1〜5)
コマンドボタンをクリックしたときに、テキスト1〜5の更新後の処理を連続でやりたいです。

 
見落としてました。テキストボックスの更新後処理ですね。
なら、Run では呼び出せません。
 
CallByName で呼び出すことになりますね。
 
Private Sub テキスト1_AfterUpdate()
の Private を Public に書き換えて、
 
Public Sub コマンド10_Click()
    Dim i As Long
    For i = 1 To 5
        CallByName Me, "テキスト" & i & "_AfterUpdate", VbMethod
    Next
End Sub

 
[quotee="sk"]各テキストボックスの AfterUpdate イベントの発生時において
それぞれどんなコードを実行しているのかを明記された方が
良さそうな印象。[/quote]
 
同感です。
CallByNameを使わなくてもいい方法がありそうな気がします。

回答
投稿日時: 19/05/09 11:16:50
投稿者: よろずや

グッドアイデアだと思っているんでしょうが、
プロシージャ名を変数になんか入れたら、
他人が見たら解読不能なプログラムになってしまいます。
 
完成して3ヶ月経ったら自分も他人です。
 
修正する必要が出来たときに、自分の書いた
プログラムが読めないなんていう悲惨なことになります。
 
素直にプログラミングしましょう。

回答
投稿日時: 19/05/09 23:13:53
投稿者: MMYS

テキスト1_AfterUpdate から
テキスト5_AfterUpdate まで順番に呼び出すなら単純に
 

Private Sub コマンド1_Click()
  Call テキスト1_AfterUpdate
  Call テキスト2_AfterUpdate
  Call テキスト3_AfterUpdate
  Call テキスト4_AfterUpdate
  Call テキスト5_AfterUpdate
End Sub

では駄目なんですか。

投稿日時: 19/05/12 20:07:57
投稿者: アロハ

sk様
 
ご回答ありがとうございます。
 
>各テキストボックスの AfterUpdate イベントの発生時において
>それぞれどんなコードを実行しているのかを明記された方が
>良さそうな印象。
 
フォームにテキストボックスが5つあります。(テキスト1〜5)
上記はあくまでも例であって「Runの他にできる方法はあるのか」が
知りたいことであったので実行コードの明記は省略しております。
 
hatena様
 
いつもお世話になっております。
 
>>CallByName で呼び出すことになりますね。
 
さすがです。やりたいことができました。どうもありがとうございました。
 
よろずや様
 
ご見解ありがとうございます。
 
>>素直にプログラミングしましょう。
 
素直にプログラミングするように努めます。
見解よりも技術的なご回答であれば幸いでした。
 
MMYS様
 
>>テキスト1_AfterUpdate から
>>テキスト5_AfterUpdate まで順番に呼び出すなら単純に
  
 
>>Private Sub コマンド1_Click()
>> Call テキスト1_AfterUpdate
>> Call テキスト2_AfterUpdate
>> Call テキスト3_AfterUpdate
>> Call テキスト4_AfterUpdate
>> Call テキスト5_AfterUpdate
>>End Sub
 
 
>>では駄目なんですか。
 
普通ならそうするに決まっていますよね。
今回テキストボックス・コンボボックス等コントロール数がとてつもなく多いフォームの処理をすることになってしまったので、そういったことができるのかを質問してみた次第です。