アプリ版:「スタンプのみでお礼する」機能のリリースについて

Form_Load
 省略
End Sub
フォームが表示された後、

private sub test
 do
  省略
 loop while()
End sub
test関数内の処理(do...loop)を処理したいのですが
フォームロード関数終了(End sub)後にtest関数の処理をしたい
場合どのようにすれば、良いのでしょうか
 よろしくお願いします

Timer関数以外で対応したいと考えています

A 回答 (4件)

蛇足ですが、


フォームロード時に重い処理をすると、
応答がないように見えユーザが不信に思うので~(^^;
重い処理をしてもフォームは表示するサンプルです。

空のフォームモジュールを1つ、標準モジュールを2つ用意し、
下のサンプルを貼り付けて使って下さい。
「プロジェクト」→「~のプロパティ」→「スタートアップの設定」
にSub Mainを設定するのを忘れずに。

--------------------------------------------------------------------------
フォームモジュール Form1.bas
--------------------------------------------------------------------------
Private Sub Form_Load()
Dim i As Long
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Form_Load start"
Do Until i = 10000000
i = i + 1
If i Mod 100000 = 0 Then
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Form_Load " & i
End If
Loop
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Form_Load ended"
End Sub
--------------------------------------------------------------------------
標準モジュール Module1.bas
--------------------------------------------------------------------------
Option Explicit

Public Sub Main()
Dim lngFromsCount As Long
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Main start"
lngFromsCount = VB.Forms.Count
Call Form1.Show
'フォーム1がロードするまで待ち合わせ(必要ないかも)
'Do Until VB.Forms.Count = lngFromsCount + 1: Loop
Call Module1.test(Form1)
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "Main ended"
End Sub

Public Sub test(Optional ByRef frmCallFrom As Form)
Dim i As Long
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test start"
i = 0
'呼出元がフォームの場合再描画し、フォーム以外の場合再描画しない。
If Not frmCallFrom Is Nothing Then
Do Until i = 10000000
i = i + 1
If i Mod 100000 = 0 Then
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test " & i
Call frmCallFrom.Refresh '呼出元フォームの再描画
Call VBA.Interaction.DoEvents 'フォーム1を操作可能状態にする。
End If
Loop
Else
Do Until i = 10000000
i = i + 1
If i Mod 100000 = 0 Then
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test " & i
Call VBA.Interaction.DoEvents 'フォーム1を操作可能状態にする。
End If
Loop
End If
putlog Format(Now, "yyyy/mm/dd hh:mm:ss") & "test ended"
End Sub
--------------------------------------------------------------------------
標準モジュール Module2.bas
--------------------------------------------------------------------------
Option Explicit

Public Sub putlog(strState As String)
Dim intFileNumber As Integer
Const LOG_FILE_NAME = "c:\test.log"
intFileNumber = FreeFile
Open LOG_FILE_NAME For Append As #intFileNumber
Print #intFileNumber, strState
Close #intFileNumber
End Sub
    • good
    • 0

Form_Loadイベント内に記述するだけでよいかと思います。



 Form_Load

  省略

  Call test

 End Sub


あるいは標準モジュールから呼び出す方法もあります。
1.プロジェクトに標準モジュールを追加する。
2.プロジェクトのプロパティを開き「スタートアップの設定」に「Sub Main」を選択する。
3.標準モジュール内で以下のように記述する
 Sub Main()

  '' フォームの呼び出し
  Load Frm1

  '' test関数呼び出し
  Call test

 End Sub

こうすれば「Sub Main関数」が各処理を順番に行ってくれます。
    • good
    • 0

こんにちは。

maruru01です。

タイマーコントロールを使用する方法もあります。
例えば、フォーム上にTimer1という名前のタイマーコントロールを置き、Intervalプロパティを適当な値(1秒なら1000)に設定しておきます。
そして、Timerイベントの一番最初に、

Me.Timer1.Interval = 0

としておけば、イベントは1度しか発生しません。
上記コードの後に、そのtestというプロシージャを実行するコードを記述すればいいわけです。
    • good
    • 0

次に Formが アクティブになるのでしたら、


そこに記述すればいいですよ。

ロードの時に、フラグをつくり、オフにしておいて、
アクティブで 一度処理したら、オンにし、
オンだったら処理しないというふうにすれば
いいかと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!