• ベストアンサー

Form_Load 終了後

Form_Load  省略 End Sub フォームが表示された後、 private sub test  do   省略  loop while() End sub test関数内の処理(do...loop)を処理したいのですが フォームロード関数終了(End sub)後にtest関数の処理をしたい 場合どのようにすれば、良いのでしょうか  よろしくお願いします Timer関数以外で対応したいと考えています

質問者が選んだベストアンサー

  • ベストアンサー
  • mas_sama
  • ベストアンサー率50% (2/4)
回答No.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

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • akirou
  • ベストアンサー率35% (26/73)
回答No.3

Form_Loadイベント内に記述するだけでよいかと思います。  Form_Load   省略   Call test  End Sub あるいは標準モジュールから呼び出す方法もあります。 1.プロジェクトに標準モジュールを追加する。 2.プロジェクトのプロパティを開き「スタートアップの設定」に「Sub Main」を選択する。 3.標準モジュール内で以下のように記述する  Sub Main()   '' フォームの呼び出し   Load Frm1   '' test関数呼び出し   Call test  End Sub こうすれば「Sub Main関数」が各処理を順番に行ってくれます。

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 タイマーコントロールを使用する方法もあります。 例えば、フォーム上にTimer1という名前のタイマーコントロールを置き、Intervalプロパティを適当な値(1秒なら1000)に設定しておきます。 そして、Timerイベントの一番最初に、 Me.Timer1.Interval = 0 としておけば、イベントは1度しか発生しません。 上記コードの後に、そのtestというプロシージャを実行するコードを記述すればいいわけです。

すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

次に Formが アクティブになるのでしたら、 そこに記述すればいいですよ。 ロードの時に、フラグをつくり、オフにしておいて、 アクティブで 一度処理したら、オンにし、 オンだったら処理しないというふうにすれば いいかと思います。

すると、全ての回答が全文表示されます。

関連するQ&A