愚者の経験

「また今度」はほとんどこない

VBA 非同期処理クラス?

タイマー無しで無限ループに突入できます!実用性は…使う人次第と言ったところでしょうか。
このクラスが有効に使えそうな状況があったら教えて下さいm(__)m
「pc_AsyncMethod」クラスモジュール

Option Compare Database
Option Explicit

Private d As Object
Private Target As Form
Private Method As String

Private Sub Class_Initialize()
    Set d = CreateObject(“htmlfile”)
    Set d.parentWindow.onhelp = Me
End Sub

Private Sub Class_Terminate()
    Set d = Nothing
End Sub

Public Sub AsyncStart(TimeLag As Long, MethodName As String)
    d.parentWindow.setTimeout “onhelp.CallMethod”, TimeLag, “VBScript”
    Set Target = CodeContextObject
    Method = MethodName
End Sub

Public Sub CallMethod()
    CallByName Target, Method, VbMethod
End Sub

フォームモジュール

Option Compare Database
Option Explicit

Private Async As New pc_AsyncMethod

Private Declare Function Sleep Lib “kernel32” (ByVal dwMilliSeconds As Long) As Long
Private endloop As Boolean

Private Sub proc_Click()
    Async.AsyncStart 500, “InfiniteLoop”
End Sub

Private Sub procend_Click()
    endloop = True
End Sub

Public Sub InfiniteLoop()
    endloop = False
    Dim l As String
    Dim b As String
    Const a As String = ”                           Access2010″
    b = Nz(Me.txt.Value, “”)
    Do
        DoEvents
        Sleep 100
        If b = “” Then
            b = a
        Else
            b = Mid$(b, 2)
        End If
        Me.txt.Value = b
        If endloop = True Then Exit Do
        DoEvents
    Loop
End Sub

フォームに以下のコントロールを準備してください。
テキストボックス 「txt」
コマンドボタン     「proc」
コマンドボタン     「procend」

左クリックを押しっぱなしにするとループが止まります。
また「proc」ボタンのイベント内でブレークポイントを指定するとループに入りません。

AsyncMethod.zip
ボタンクリックでメッセージボックスを2つ表示するおまけ付きです。

追記:(2012/2/16)
標準モジュールにある「Public Function」を呼びたい場合は

「Eval」関数を使ってください。未検証ですがおそらく動くと思います。
ダメです…Evalでユーザー定義関数使えたり使えなかったりで…Runメソッドを使ってください。

Public Sub CallMethod()
    ‘CallByName Target, Method, VbMethod
    ‘Eval Method & “()”
    Run Method
End Sub
できなくてもフォームのプロシージャ経由して呼べばいいと言われればそうですが…

ちなみに「RaiseEvent」はエラーにもならず何も起きません。不思議。

Public Event Async()

~~~~~~~
Public Sub CallMethod()
    RaiseEvent Async
End Sub


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。