• ベストアンサー

Form_Load 終了後

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

  • nao0
  • お礼率10% (50/483)

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

  • ベストアンサー
  • 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

  • Formオブジェクトについて

    Formオブジェクトに関する質問です。 ある関数にフォームオブジェクトを引数として渡してやりたいのですが、何かよい方法はありますでしょうか? 例) Private Sub cmdTest_Click(Index as Integer) Dim frm as Form If Index = 0 then Load_Test(Form 2) Else Load_Test(Form 3) End if End Sub Private Sub Load_Test(frm as Form) frm.Show frm.Label1.Caption = "TEST” End Sub

  • vb.netでForm_Loadの終了判定について

    vb.netのWindowsApplicationでForm_Loadの終了判定ってどうやっていますか? Visual Studio 2015 visual Basic .net TextChangedイベントなどが、Form_Loadの前に走って 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」 になってしまいがちですが、 これを回避するために、とりあえず下記の対応をしましたが、 スイッチをONにするハンドルはMyBase.Loadで良かったのか、 普通はどうするのか、 などをご教授ください。 <暫定対応> Dim SW_FormLoad As Boolean Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load  処理  :  SW_FormLoad = True End Sub Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged  If Not SW_FormLoad Then Return  処理 End Sub

  • VB6のform Load

    Private Sub Form_Load() Form1.ScaleMode = 0 Form1.Scale (-10, 10)-(10, -10) Form1.Line (-10, 0)-(10, 0) Form1.Line (0, -10)-(0, 10) End Sub とやって座標画面を作ろうとしましたが Lineが表示されません。 仕方が無いので Private Sub Form_Load() Form1.ScaleMode = 0 Form1.Scale (-10, 10)-(10, -10) End Sub Private Sub Form_Activate() Form1.Line (-10, 0)-(10, 0) Form1.Line (0, -10)-(0, 10) End Sub とやりました。 そういうものだとあきらめるしかないのでしょうか?

  • フリーズしてしまいます。

    アクセスでWebBrowserコントロールを使ってIE操作をしているのですが フリーズしてしまいます。 フォームに、WebBrowser0を配置して、 ---------------------------------- Private Sub Form_Load() Me.WebBrowser0.Navigate "http://login.yahoo.co.jp/config/login?logout=1" Call wait 省略・・・ End Sub ---------------------------------- Sub wait() Const READYSTATE_COMPLETE As Long = 4 Do Until Me.WebBrowser0.ReadyState = READYSTATE_COMPLETE Loop Do While Me.WebBrowser0.Busy = True DoEvents Loop End Sub ---------------------------------- を実行すると必ずフリーズします。 ---------------------------------- Sub wait() Do While Me.WebBrowser0.Busy = True DoEvents Loop End Sub ---------------------------------- にしたら問題なく表示されます。 でもこれだけだと、表示し終わりません。 表示されてないのに次のコードへ進んでしまいます。 そもそもなぜフリーズするのでしょうか? アクセス2007です。ご回答よろしくお願いします。

  • Form内関数のパラメタについて VB6.0

    現在、他人の作成したVBプログラムを解析しているのですが、 どなたかご存知でしたらご教授願います。 画面の初期表示時の処理(Form_Load)内でPrivate Subで関数処理を 行っています。 仮にaaaという名称だった場合、 Private Sub From_Load() … aaa (0) End Sub とした時に、実際のaaa側は Public Sub aaa(Optional Mode As Integer=-1, Optional Index As Integer=-1) … End Sub とあった場合、Form_Load内でaaaに渡している(0)の値は、 "aaa側の第1パラメタであるModeに0を渡している" と言う解釈で合っていますか? また、この時のIndexパラメタには-1が設定されていると言う解釈で 合ってますでしょうか? VBはあまり良くわからずに悪戦苦闘しています。 すみませんがよろしくお願いします。

  • VB.net(2005)でFormのLoadイベント処理について質問で

    VB.net(2005)でFormのLoadイベント処理について質問です 設定時刻として9:00とします。 formを起動した時刻が9時前ならまで何もせず。 9時以降になれば処理を開始する。 といったプログラムを作成しようと思います。 サンプル) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim settingtime As DateTime '現在時刻を設定 Dim nowtime As DateTime = System.DateTime.Now.ToShortTimeString '設定時間を9時 settingtime DateTime = DateTime.Parse("9:00").ToShortTimeString '現在時刻が9時より後のとき If nowtime < setting Then         処理A Else '現在時刻が9時より前のとき         9時まで処理Aをしない(9時になれば処理Aを開始) End If End Sub 上記のようにコーティングしましたが、 呼び出した時が9時以降なら処理Aをして以前ならElseの処理を行い抜けてしまいます。 9時になれば処理をAをしたいのです。 formを呼び出しにTimerのTickイベントで9時になれば処理Aを開始? なにかいい案があればよろしくお願いします。

  • フォームのイベントを標準モジュールから呼び出す

    フォームのイベントを標準モジュールから呼び出す事は出来ないのでしょうか? ちなみにアクセスです。 例えば、 Private Sub Form_Load() MsgBox "test" End Sub というのはフォームを開いたときにしか発生しないですよね。 でもフォームを開いている状態でForm_Loadと全く同じ事をしてほしい時は どうすればいいですか? 標準モジュールで Sub a() Call Form_フォーム1.Form_Load End Sub としてみましたが、メソッドまたはデータ メンバが見つかりません。 (Error 461)になりました。 MsgBox "test" だけなら、 Sub a() MsgBox "test" End Sub にすりゃいいじゃん!って思われがちですが、 実際はForm_Loadイベントにはたくさんのコードが書かれています。 標準モジュールからイベントの呼び出しを教えてください。

  • Timer_Tickについて

    Timerイベントについてですが、Interval = 1 に設定し、例えば下記のようなプログラムを動かした場合、 /*-------------------------------------------*/ Private Sub Form_Load(~~)~~     Timer1.Start()     Original() '自作プロシージャ End Sub Private Sub Timer1_Tick(~~)~~     num += 1 'Publicで宣言してある     if num > 100 then Timer1.Stop() End Sub /*-------------------------------------------*/ Original()の処理に移るのは、numが100より大きくなってTimer1がStopしてからでしょうか? それとも、Timer1が動いている最中に、移ってるのでしょうか?

  • シリアル通信:オフライン時にうまく終了してくれません

    シリアルプリンタの制御をVB6で行っております。 以下のようなコードですが、うまく終了してくれません。 'グローバル 'プリンタの状態 Dim BUF as String '起動時 Private Sub Form_Load() MSComm1.PortOpen = True Text1.Text = "" Timer1.Enabled = True End Sub '終了 Private Sub Form_Unload(Cancel As Integer) Timer1.Enabled = False MSComm1.PortOpen = False End Sub 'タイマー Private Sub Timer1_Timer() Timer1.Enabled = False Call CheckPrint Timer1.Enabled = True End Sub Private Sub MSComm1_OnComm() Dim TimeOut As Long Dim sTime As Long Dim eTime As Long Select Case MSComm1.CommEvent '受信 Case comEvReceive TimeOut = 100 sTime = timeGetTime Do If (TimeOut - eTime) < 0 Then Exit Do End If eTime = (timeGetTime - sTime) Loop Until MSComm1.InBufferCount >= 82 BUF = MSComm1.Input End Select End Sub プリンタの状態チェック Private Sub CheckPrint() Dim sTime As Long Dim eTime As Long Dim TimeOut As Long Dim i As Integer Dim n As Integer BUF = "" 'プリンタの情報取得コマンド MSComm1.Output = "~HS" 'タイマ開始 TimeOut = 400 sTime = timeGetTime eTime = 0 Do DoEvents If BUF <> "" Then Exit Do End If eTime = (timeGetTime - sTime) Loop Until TimeOut - eTime < 0 If BUF <> "" Then ... .. 宜しくお願いします。

  • リストのダブルクリックイベントをフォーム起動時に発

    アクセス2010です。 Private Sub Form_Load() Call lst_test_DblClick End Sub Private Sub lst_test_DblClick(Cancel As Integer) MsgBox "" End Sub このような事は出来ないのでしょうか? リストのダブルクリックイベントをフォーム起動時に発動したいのですが このコードを書くと Call lst_test_DblClick の部分で引数を省略できません。 になります。 どちらもフォームモジュールに書いています。

専門家に質問してみよう