Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


30629 / 76738 ←次へ | 前へ→

【51374】Re:OnTimeメソッドで呼び出すプロシージャへの引数の渡し方
発言  ichinose  - 07/9/13(木) 19:10 -

引用なし
パスワード
   こんばんは。


>Type で作製した型ではOnTimeメソッドの引数にならないのでしょうか?

変数は無理だと思いますよ!!
特にローカル変数って、スタック領域に作成されるはずですから、
Ontimeメソッドで指定されたプロシジャーを実行するときには、
すでにメモリ上にはないですからね!!

Application.OnTime Now + TimeValue("00:00:3"), _
      "'TestOnTime" & """" & i & """,""" & A & """'"
↑これが作動しているのは、あくまでも定数を引数にしているに過ぎません。


一例です。

新規ブックにて確認してください。


標準モジュールに
'===============================================================
Option Explicit
Public Type 足し算
  a As Long
  b As Long
  End Type
'==============================================================
Sub testtest(p As 足し算)
  MsgBox p.a + p.b
End Sub


上記のtesttestを連続して繰り返し実行させる事を考えます。


Thisworkbookのモジュールに
'======================================
Option Explicit
'=======================================================================
Event timejust(ByVal cnt As Long, cancel As Boolean, t_para As Variant)
'↑ イベント定義
Private t_int As Date 'インターバル
Private t_prm() As Variant 'パラメータ
Private t_pcnt As Long 'パラメータの個数
Private t_cnt As Long '連続処理回数
Sub timer_set(interval As Date, ParamArray para() As Variant)
'タイマーをセットする
'interval 連続処理を行う間隔
'para() データ渡しのためのパラメータ
  Dim g0 As Long
  Erase t_prm()
  t_int = interval
  t_pcnt = UBound(para()) + 1
  For g0 = LBound(para()) To UBound(para())
    ReDim Preserve t_prm(g0)
    t_prm(g0) = para(g0)
    Next
  Application.OnTime Now() + t_int, "thisworkbook.timer_exe"
  t_cnt = 0
End Sub
'===================================
Sub timer_exe()
'呼び出しプロシジャー
  Dim cancel As Boolean
  If t_pcnt = 0 Then
    RaiseEvent timejust(t_cnt + 1, cancel, False)
  Else
    RaiseEvent timejust(t_cnt + 1, cancel, t_prm())
    End If
  t_cnt = t_cnt + 1
  If cancel = False Then
    Application.OnTime Now() + t_int, "thisworkbook.timer_exe"
    End If
End Sub


更にSheet1のモジュールに
'==============================================================
Option Explicit
Dim WithEvents bk As ThisWorkbook
'===============================================================
Sub main()
  Set bk = ThisWorkbook
  bk.timer_set TimeValue("00:00:3")
End Sub
'=======================================================================
Private Sub bk_timejust(ByVal cnt As Long, cancel As Boolean, t_para As Variant)
'cnt 処理の繰り返し回数
'cancel trueを指定すると処理終了
't_para データ引渡し変数
このイベント内で呼び出したいプロシジャーにデータを渡します
  Dim a As 足し算
  a.a = cnt
  a.b = cnt
  Call testtest(a)
  If cnt >= 3 Then cancel = True '3回処理したら終了
End Sub


コードは長くなりましたが、再利用可能な形にはなりました。

尚、Sheet1のモジュールの代わりにクラスモジュールを使用して
工夫すればよいかもしれませんね。

一例ですから、試してみてください

0 hits

【51308】OnTimeメソッドで呼び出すプロシージャへの引数の渡し方 jabjab 07/9/11(火) 13:49 質問
【51312】Re:OnTimeメソッドで呼び出すプロシージャ... Lindy 07/9/11(火) 15:20 発言
【51313】Re:OnTimeメソッドで呼び出すプロシージャ... jabjab 07/9/11(火) 15:42 発言
【51374】Re:OnTimeメソッドで呼び出すプロシージャ... ichinose 07/9/13(木) 19:10 発言
【51375】Re:OnTimeメソッドで呼び出すプロシージャ... ichinose 07/9/13(木) 20:22 発言
【51389】繰り返し処理プロジェクト 設定編 ichinose 07/9/14(金) 10:46 回答
【51390】繰り返し処理プロジェクト 運用編 ichinose 07/9/14(金) 10:47 回答

30629 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free