なぜ一気に実行するとVBEが閉じてしまうのか?

このQ&Aのポイント
  • VBEを一気に実行すると、画面が閉じてしまう現象が発生します。しかし、ステップ実行(F8)を行うと画面は閉じません。
  • この現象の原因は、`Application.VBE.MainWindow.Visible = False`のコードにあります。このコードをコメントアウトすると、VBE画面は閉じませんが、該当のモジュールが実行後にアクティブになります。
  • Win8.1とAccess 2010の環境ではこの問題が発生します。一気に実行する場合、処理がスキップされることでVBEが閉じられるためです。
回答を見る
  • ベストアンサー

VBEが閉じてしまいます。

Sub Sample() Dim mdlName As String mdlName = "test" Debug.Print AllProcName(mdlName) End Sub Function AllProcName(ByVal strModuleName As String) As String Dim mdl As Module Dim lngDecCnt As Long '宣言セクションの行数 Dim strName As String 'プロシージャ名比較用 Dim strProcName As String '全プロシージャ名 Dim lngR As Long 'プロシージャの種類 Dim i As Long DoCmd.OpenModule strModuleName Application.VBE.MainWindow.Visible = False Set mdl = Modules(strModuleName) '宣言セクションの行数格納 lngDecCnt = mdl.CountOfDeclarationLines '最初のプロシージャ名格納 strName = mdl.ProcOfLine(lngDecCnt + 1, lngR) strProcName = strName & vbNewLine '宣言セクションの次行から最終行までループ For i = lngDecCnt + 1 To mdl.CountOfLines '新規プロシージャ名取得 If strName <> mdl.ProcOfLine(i, lngR) Then strName = mdl.ProcOfLine(i, lngR) 'プロシージャ名追加 strProcName = strProcName & strName & vbCrLf End If Next i Set mdl = Nothing AllProcName = strProcName End Function と言うコードをVBE画面でF5で実行すると、VBEが閉じてしまいます。 しかしF8でゆっくりやっていくとVBE画面は閉じません。 なぜ一気にやると閉じてしまうのでしょうか? Application.VBE.MainWindow.Visible = False をコメントアウトすると VBE画面は閉じませんが該当のモジュールが実行後にアクティブになります。 環境はwin8.1、アクセス2010です。

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

  • ベストアンサー
回答No.1

>DoCmd.OpenModule strModuleName ここで開いていますから >VBE画面は閉じませんが該当のモジュールが実行後にアクティブになります。 でしょうね。 >Application.VBE.MainWindow.Visible = False していてもデバッグモードというかステップ実行中は無視されているようです。 (確証はありません。) なので、 Sub Sample() Dim mdlName As String mdlName = "Module1" Debug.Print AllProcName(mdlName) End Sub Function AllProcName(ByVal strModuleName As String) As String Dim mdl As Object 'Module ※ Dim lngDecCnt As Long '宣言セクションの行数 Dim strName As String 'プロシージャ名比較用 Dim strProcName As String '全プロシージャ名 Dim lngR As Long 'プロシージャの種類 Dim i As Long 'DoCmd.OpenModule strModuleName 'Application.VBE.MainWindow.Visible = False Set mdl = Application.VBE.VBProjects.item(VBE.ActiveVBProject.Name).VBComponents(strModuleName).CodeModule 'Modules(strModuleName) ※ '宣言セクションの行数格納 lngDecCnt = mdl.CountOfDeclarationLines '最初のプロシージャ名格納 strName = mdl.ProcOfLine(lngDecCnt + 1, lngR) strProcName = strName & vbNewLine '宣言セクションの次行から最終行までループ For i = lngDecCnt + 1 To mdl.CountOfLines '新規プロシージャ名取得 If strName <> mdl.ProcOfLine(i, lngR) Then strName = mdl.ProcOfLine(i, lngR) 'プロシージャ名追加 strProcName = strProcName & strName & vbCrLf End If Next i Set mdl = Nothing AllProcName = strProcName End Function のようにしてみたら? ※印が変更点です。

tctrqzwplcg
質問者

お礼

回答頂きありがとうございました。

関連するQ&A

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

  • 使い方がわかりません。ヘルプ

    このサンプルコード、どうやって使えばいいのでしょうか? ヘルプを色々見てたら気になるコードを見つけました。(アクセスです) Module.CountOfDeclarationLines プロパティです。 サンプルコードは、 ********************************************** Public Sub ModuleLineTotal(ByVal strModuleName As String) Dim mdl As Module ' Modules コレクションに含まれるモジュールを開きます。 DoCmd.OpenModule strModuleName ' Modules オブジェクトへの参照を返します。 Set mdl = Modules(strModuleName) ' モジュールの行数を表示します。 Debug.Print "モジュール行数: ", mdl.CountOfLines ' 宣言セクションの行数を表示します。 Debug.Print "宣言セクション行数: ", _ mdl.CountOfDeclarationLines End Sub ********************************************** なのですが、標準モジュールに貼りつけて、F5を押しても動きません。 Sub test() Call ModuleLineTotal End Sub を作ってF5を押すと、「引数は省略できません。」となります。 使い方を教えてください。ご回答よろしくお願いします。

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • マクロがエラーになります

    下記のようなマクロ使いたいのですがエラーになり   動作しません 実行時エラー'1004': アプリケーション定義またはオブジェクト定義エラー のエラーになりますどのように直せばよいのでしょうか? よろしくお願いします。 Sub test() Dim ReturnMessage As VbMsgBoxResult ReturnMessage = MsgBox("VBEを閉じますか?", vbYesNo, "確認") If ReturnMessage = vbYes Then Application.VBE.MainWindow.Visible = False End If End Sub

  • VBEについて

    例えば Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) '***** 特定セルを選択するとイベントを実行する ***** Dim tate As Long Dim yoko As Long Dim 数量 As Long Dim 判定 As Integer tate = ActiveCell.Row yoko = ActiveCell.Column If yoko = 2 Then On Error GoTo skip01 数量 = InputBox("数量を入力してください。") 判定 = MsgBox("数量 = " & 数量 & " で間違いありませんか?", vbYesNo + vbInformation) If 判定 = vbYes Then Cells(tate, 2) = Cells(tate, 2) + 数量 End If End If skip01: End Sub ですが、上記コードでは2行目のみの物になりますが、例えば7と8行目にしたいときなどはどうすればいいのでしょうか?素人質問ですが宜しくお願い致します。

  • アクセスのインポートエラー 続き

    先ほど、質問しました続きです。以下のVBAを作成しましたが、うまくいきません。助言お願いします。 Option Compare Database Private Sub 実行_Click() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim strName As String Dim i As Long strName = "エラー" i = 0 Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection For Each tbl In cat.Tables If tbl.Name = strName Then i = 1 If MsgBox(tbl.Name & "テーブルを削除しますか?", _ vbYesNo) = vbYes Then cat.Tables.Delete tbl.Name MsgBox tbl.Name & "テーブルの削除を完了しました。" End If Next tbl If i <> 1 Then MsgBox strName & "テーブルが存在しません。" Set cat = Nothing End Sub

  • Accessで登録更新日をメッセージで表示したい。

    資格等の登録更新日をメッセージで表示したいと考えています。 下記のような回答が有りましたが、下記の場合は該当者1名しか表示できません。 複数人をメッセージで表示できないでしょうか。 ******************************************** この関数型プロシージャに Public Function fncStartMessage() Dim strName As String sttName = Nz(DLookup("名前","T_誕生日マスタ","誕生日 = " & Date()),"") If strName <> "" then MsgBox "今日は、" & strName & "さんの誕生日です。" End If ******************************************** よろしくお願いします

  • [VBA] 型宣言の順番について

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) 私はVBAのレベルとしては初級で、具体的には配列内で処理をしたり、連想配列のコードが書けるぐらいで、クラスモジュールはわかりません、ぐらいの感じです。(分かりづらくてすみません) 私はいつも宣言の文を書くときに、プロシージャの一番上に全て書き、順番もだいたい大きい(と感じる)型のものから書いています。 例: Sub test()  Dim FSO As Object  Dim oDic As Object  Dim wbSour As Workbook, wbDest As Workbook  Dim wsSour As Worksheet, wsDest As Worksheet  Dim r as Range  Dim tmp As Variant  Dim destDir As String  Dim i As Long, j As Long, k As Long  ~  ~  ~  ~  ~  ~ End Sub みたいな感じです。 いつもこれでいいのかなぁ?と思いながら宣言文を書いてるんですが、ネットに転がっている他のソースコードを見ると、変数を使う直前で都度宣言しているものもあったりするので、正しい(とされている)宣言のしかたってあるのでしょうか? そんなの人と場合によるって感じだと思うのですが、こういう理由で自分はこう宣言している、とか、これからのことを考えるとこうしたほうがいい、みたいなのがあれば教えてください。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • レジストリエディタを起動させて手前に表示させたい

    VBE画面から Sub test() Dim i As Long i = Shell("C:\WINDOWS\regedit.exe") End Sub を実行するとレジストリエディタを起動できるのですがアクティブ(前画面)になりません。 Sub test() Dim i As Long i = Shell("C:\WINDOWS\regedit.exe") AppActivate i End Sub これにしたも同じく全画面になりません。 ただ、一度起動した後に再度このコードを実行すると、 プロシージャの呼び出し、または引数が不正です。(Error 5) と言うエラーになりますが、1回目に開いたレジストリエディタがアクティブになります。 vbaコードで起動だけではなく、手前に表示させるにはどうすればいいですか?

  • これは実行中のVBEコードのイミディエイトウイント

    Sub Sample() Dim WD, task, n As Long Set WD = CreateObject("Word.Application") 'Wordを起動します For Each task In WD.Tasks 'Word VBAのTasks'コレクションを調べます If task.Visible = True Then ' タスク(プロセス)が実行中だったら Debug.Print task.Name ' タスクの名前を書き出します End If Next WD.Quit Set WD = Nothing End Sub これを実行すると 結果に イミディエイト も含まれるのですが、 これは実行中のVBEコードのイミディエイトウインドウのことを言っているのでしょうか?

専門家に質問してみよう