• ベストアンサー

フォーム1が開いているのならMsgBoxを表示

Sub マクロ() If フォーム1が開いているのなら Then MsgBox "フォーム1は開いています" End If End Sub アクセスで上記の事をやりたいのですが、コードを教えていただけますか? Sub test() Dim myForm As Form For Each myForm In Forms Debug.Print myForm.Name Next End Sub で、フォームをループできるのですが、いちいちループさせずに、フォーム1だけをつかんで、 起動している(開いている)ならメッセージボックスを表示させたいです。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

2002でIsloadedプロパティが存在するならば、関数名が かぶってしまったようですね。それでは関数名を以下のように 変更し、プロシージャの中の関数名も変更します。 Function funcIsLoaded(ByVal strFormName As String) As Boolean ' 指定したフォームがフォーム ビューまたはデータシート ビューで開かれている場合 True を返し ます。 Const conObjStateClosed = 0 Const conDesignView = 0 If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then If Forms(strFormName).CurrentView <> conDesignView Then funcIsLoaded = True End If End If End Function それから、使い方のところでも、 Sub マクロ() If funcIsLaoded("フォーム1") = True Then MsgBox "フォームは開いています" Else MsgBox"フォームは開いていません" End If End Sub のように関数名を変更します。

cdbvtnyjv4
質問者

お礼

ご回答ありがとうございます。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

if currentproject.allforms("フォーム1").isloaded then msgbox "開いてます" ・・・ にて。Access2002以降なら使えます。 ※『フォーム1』が存在しない場合ではエラーになります。

cdbvtnyjv4
質問者

お礼

Sub マクロ() If CurrentProject.AllForms("フォーム1").IsLoaded Then MsgBox "開いてます" End If End Sub でうまく出来ました。ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

方法はいろいろあるのですが、昔からの定番で、 Accessに付属しているサンプルのNorthWindow というファイルにある方法で。 以下のコードを標準モジュールに貼り付け保存します。 Function IsLoaded(ByVal strFormName As String) As Boolean ' 指定したフォームがフォーム ビューまたはデータシート ビューで開かれている場合 True を返します。 Const conObjStateClosed = 0 Const conDesignView = 0 If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then If Forms(strFormName).CurrentView <> conDesignView Then IsLoaded = True End If End If End Function 使い方は、 Sub マクロ() If IsLaoded("フォーム1") = True Then MsgBox "フォーム1は開いています" End If End Sub

cdbvtnyjv4
質問者

お礼

標準モジュールにそっくりそのまま Option Compare Database Option Explicit Function IsLoaded(ByVal strFormName As String) As Boolean 指定したフォームがフォーム ビューまたはデータシート ビューで開かれている場合 True を返します。 Const conObjStateClosed = 0 Const conDesignView = 0 If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then If Forms(strFormName).CurrentView <> conDesignView Then IsLoaded = True End If End If End Function Sub マクロ() If IsLaoded("フォーム1") = True Then MsgBox "フォームは開いています" End If End Sub を貼り付けたのですが、 If IsLaoded("フォーム1") = True Thenの IsLaodedの部分でコンパイルエラーになってしまいました。

関連するQ&A

  • テキストボックスかコンボボックスを条件としたい

    フォーム上のコントロールを取得する時に、 「テキストボックスかコンボボックスなら」としたいのですが、VBAコードがわかりません。 ************************************************************ Sub Sample() Dim myCtrl As Control Dim myForm As String myForm = "フォーム1" For Each myCtrl In Forms(myForm).Controls If myCtrlのタイプがテキストボックス Or コンボボックス Then Debug.Print myCtrl.Name End If Next End Sub ************************************************************ に修正していただけますか? ControlType プロパティを使うと思うのですが、使い方がわかりません。 ご回答よろしくお願いします。

  • フォームを表示してからメッセージボックスを表示する

    メッセージボックスが表示される前に、フォームを表示させたいです。アクセスです。 ナビゲーションウインドウからフォームをダブルクリックしてフォームを開くのですが、 今のままだとメッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを表示してからメッセージボックスを表示するにはどうすればいいでしょう? Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" End Sub だと、先ほど述べたように、メッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを開いたときのイベントは複数あるようで、 Private Sub Form_Activate() MsgBox "Form_Activate" Debug.Print "Form_Activate" End Sub Private Sub Form_Current() MsgBox "Form_Current" Debug.Print "Form_Current" End Sub Private Sub Form_GotFocus() MsgBox "Form_GotFocus" Debug.Print "Form_GotFocus" End Sub Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" Debug.Print "Form_Open" End Sub Private Sub Form_Load() MsgBox "Form_Load" Debug.Print "Form_Load" End Sub をすると、 ・Form_Load ・Form_Activate ・Form_GotFocus ・Form_Open ・Form_Current の順に開きますが、やはりフォームが最後に表示されてしまいます。 どうにかして先にフォームを表示させる方法はないでしょうか? ご回答よろしくお願いします。

  • アクセス フォームが存在するかを一発で取得したい

    フォームが50個くらいあるのですが 該当のフォームが存在するかvbaで取得したいのですが If CurrentProject.AllForms("フォーム1").IsLoaded Then のように、一発で取得する方法はありますか? 今は Sub Sample1() Dim DB As DAO.Database Dim f As DAO.Document Set DB = CurrentDb Dim strForm As String Dim flg As Boolean strForm = "Fメインメニュー" For Each f In DB.Containers!Forms.Documents If strForm = f.Name Then flg = True Exit For End If Next If flg = False Then MsgBox strForm & "は存在しません" End If End Sub のような感じで、すべてのフォームをループしているのですが 無駄が多い気がします。 改善策があればお願いします。

  • フォームを作成してフォームビューで表示するには?

    Sub Sample01() Dim myForm As Form Set myForm = CreateForm DoCmd.RunCommand acCmdFormView End Sub vbaでフォームを作成し、フォームビューで作成したいのですが これだと何も起きないのですが、表示されるにはどうすればいいでしょうか?

  • MsgBoxの表示について

     ユーザーフォームのチェックボックスの選択後(複数選択可)コマンドボタンのクリックで各チェックボックスのマクロを実行するようにしていますが、下記コードだとマクロの実行後もMsgBoxが表示されてしまいますが(当たり前ですが)、これをコマンドボタンのみをクリックした場合のみMsgBoxを表示させることは可能でしょうか?お教え下さい。 Windows7・SP1 Office2010・SP2 Private Sub CommandButton1_Click() Sheets("編集").Select If CheckBox9 Then Unload UserForm6 変更後編集データの保存 End If If CheckBox10 Then Unload UserForm6 変更前編集データの保存 End If If CheckBox11 Then Unload UserForm6 指定勤務有あり編集データの保存 End If If CheckBox12 Then Unload UserForm6 指定勤務有なし編集データの保存 End If If CheckBox2 Then Unload UserForm6 日付データの保存 End If If CheckBox3 Then Unload UserForm6 個人情報の保存 End If MsgBox ("保存する編集データを選択してください。"), vbExclamation End Sub

  • アクセス For Eachの時点 絞る

    For Eachの時点で、コマンドボタンのみに絞ることは可能ですか? Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls Debug.Print ctl.Name Next ctl End Sub これでフォーム上の全てのコントロール名を取得できますが ループの時点でコマンドボタンのみを抽出できますか? For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acCommandButton Then Debug.Print ctl.Name End If Next ctl こうすれば、コマンドボタンのみ絞れますが コントロールの数が多すぎて、処理に時間がかかります。 なので For Each ctl In Forms(myFormName).Controls の部分の、ループの時点でコマンドボタンを絞りたいのですが 絞れる方法があれば教えてください。

  • フォームを閉じないようにする VB6 SP6

    VB6 でプログラムを作成中です。 プログラムを実行して、フォームが立ち上がった所で右上の×を押し、画面を閉じようとします。 そこで以下のコードで、もし×が押されたらvbYesNoメッセージボックスを表示させ、もし「いいえ」が押されたらフォームを閉じないようにし、実行画面を維持したいのです。 しかし、Exit Sub ですとプログラムが終了してしまい、困っています。宜しくお願い致します。 Private Sub Form_Unload(Cancel As Integer) 'フォームを閉じる Dim last As String last = MsgBox(" プログラムを終了させますか?", vbYesNo, "終了確認1") If (last = vbYes) Then Dim last2 As String last2 = MsgBox(" 本当にプログラムを終了させますか?", vbYesNo, "終了確認2") If (last2 = vbNo) Then Exit Sub End If End If If (last = vbNo) Then Exit Sub End If End Sub

  • msgboxの表示

    A列の値とC列の値をMsgboxに表示するにはどうしたらいいのでしょうか?C列で一番高い商品とその品名A列を表示させたいのですが・・ Sub hinmei() Dim i As Long For i = 2 To Range("C65535").End(xlUp).Row Dim x As Long Dim a As Long x = Cells(i + 1, 5) If Cells(i, 5).Value < x Then a = x End If Next MsgBox a End Sub

  • VB6.0でフォームをずらして表示したいのですが

    以下のコードを実行すると、メッセージボックスに10としか表示されません。 同じ場所にフォームが追加されていきます。 複数表示されているフォームを数える方法はないでしょうか? ご存知の方教えてください。 よろしくお願いします。 Private Sub CMD_drow_Click() Dim GraphForm As New Form2 Dim GraphNumber As Integer 'グラフカウント GraphNumber = Form2.Count MsgBox GraphNumber 'グラフ表示 GraphForm.Show '表示位置の設定 With GraphForm If GraphNumber <= 5 Then ' .StartUpPosition = 0 .Top = GraphNumber * 100 .Left = 0 Else ' .StartPosition = 0 .Top = (GraphNumber - 5) * 100 .Left = 300 End If End With End Sub

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

専門家に質問してみよう