• 締切済み

AccessVBAで入力有無のチェック

こんにちは。 AccessでVBAを記述していたところわからないことがでてきてしまいましたので 質問させて頂きます。(ネットでいろいろと調べてみたのですが、それでも解決しませんでした・・・) バージョンは2003です。 サブフォームのある親フォームの[閉じる]ボタンを押すとサブフォームにある 指定したテキストボックスの値をチェックするという動作を実施したい意向です。 今回問題になってしまったのは、ある[A]というテキストボックスに値が入力されているか どうかのチェックをしようとしたのですが、記述が間違っているのか [オブジェクトはこのプロパティまたはメソッドをサポートしていません。] というエラーメッセージが表示されてしまいます。 いろいろ調べたとこ、IsNull関数を使用するということはわかったのですが 上手く動作しません。 現在使用している記述は以下に記載しますので宜しければどう記述を 修正すれば上手く動作するのかお教え頂ければと思います。 'Aが空白の場合 If IsNull(Forms![F_親フォーム].[F_サブフォーム].Form.[A].Value) Then '背景をイエローに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbYellow Else '背景をマゼンダに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbMagenta End If

みんなの回答

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

どの様にうまく動かなかったのか説明が欲しいのですが とりあえず、On Error ~のエラートラップはコメントアウトして どこで止まってその時のエラーメッセージを教えてください。 最初の質問のエラー? ところで、F_サブ は帳票フォームでは有りませんよね? 帳票フォームですと、レコード毎に条件に応じた判断は出来ません。 たぶんご承知だとは思いますが念のため。 あのSample.mdb で閉じるC1ボタンの結果を見てください。 で、コードの件ですが、これは実際のコードではありませんよね。 文法的な誤りが散見されます。 もし、実際のコードなら、あちらこちらが赤く表示されるはず。 例えば 変なところにスペースがあったり On Error Go To Err _閉じる_Click On Error GoTo Err_閉じる_Click 行継続文字にスペースが無かったり、変な文字が入っていたり Me![F_サブ]![M].FormatConditions.Add(_ Type:=acExpression,Expression1:="isnull([M])=true"_ ).NBackColor = vbYellow Me![F_サブ]![M].FormatConditions.Add( _ Type:=acExpression, Expression1:="isnull([M])=true" _ ).BackColor = vbYellow これは If Type Of ctrl Is TextBox Then If ctrl.controltype Is TextBox Then 他にも If と End If が合って無かったり・・ OKWAVEがおかしいのか私のPCがポンコツだからか・・ 変! まずはコンパイルでエラーが出なくなるまで頑張ってください。 その後、動かしてみて問題無さそうになって初めて エラートラップを有効にしてください。

macaron0321
質問者

お礼

コードを記載致します。 デバックで黄色くなってしまった箇所に★をつけております。 Private Sub 閉じる_Click() Dim stDocName As String Dim stLinkCriteria As String 'フォーム上のコントロールを格納する変数 Dim ctrl As Control Dim msg As String '一般の場合 If Me!MUSENEXIST = 0 Then 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then 'Aの値が上限15.5下限13.5以内の場合背景をピンクに(正) If Forms![F_親フォーム].[F_サブ].Form.[A] <= 15.5 And Forms![F_親フォーム].[F_サブ].Form.[A] >= 13.5 Then Forms![F_親フォーム].[F_サブ].Form.[A].BackColor = vbMagenta Else 'Aの値が上限15.5下限13.5以外の場合背景を黄色に(誤) Forms![F_親フォーム].[F_サブ].Form.[A].BackColor = vbYellow End If 'Bの値が上限45下限玄米値+19未満の場合背景をピンクに(正) If Forms![F_親フォーム].[F_サブ].Form.[B] <= 45 And Forms![F_親フォーム].[F_サブ].Form.[B] >= Me!玄米B + 19 Then Forms![F_親フォーム].[F_サブ].Form.[B].BackColor = vbMagenta Else 'Bの値が45以上の場合背景を黄色に(誤) Forms![F_親フォーム].[F_サブ].Form.[B].BackColor = vbYellow End If 'C : 'Kの値が0の場合背景をピンクに(正) If Forms![F_親フォーム].[F_サブ].Form.[K] = 0 Then Forms![F_親フォーム].[F_サブ].Form.[K].BackColor = vbMagenta Else 'Kの値が1の場合背景を黄色に(誤) Forms![F_親フォーム].[F_サブ].Form.[K].BackColor = vbYellow End If 'Me![F_サブ]![M].FormatConditions.Add( _ 'Type:=acExpression, Expression1:="isnull([M]) = true" _ ').BackColor = vbYellow 'Me![F_サブ]![M].FormatConditions.Add( _ 'Type:=acExpression, Expression1:="isnull([M]) = false" _ ').BackColor = vbMagenta ★Me!F_サブ!M.FormatConditions.Add( _  Type:=acExpression, Expression1:="isnull([M]) = true" _  ).BackColor = vbYellow Me!F_サブ!M.FormatConditions.Add( _ Type:=acExpression, Expression1:="isnull([M]) = false" _ ).BackColor = vbMagenta End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Forms![F_親フォーム].[F_サブ].Form.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.BackColor = vbYellow Then 'msgにテキストボックスの名前を追加 msg = msg & ctrl.Name & vbCrLf 'メッセージボックスに名前を表示 'MsgBox ctrl.Name End If End If Next ctrl 'msgが空白じゃない場合 If msg <> "" Then 'メッセージボックスを表示 MsgBox msg Else stDocName = "F_親フォーム一覧" DoCmd.Close acForm, Me.Name DoCmd.OpenForm stDocName End If '特別の場合 Else 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then 'Aの値が上限15.0下限13.5以内の場合背景をピンクに(正) If Forms![F_親フォーム].[F_サブ].Form.[A] <= 15# And Forms![F_親フォーム].[F_サブ].Form.[A] >= 13.5 Then Forms![F_親フォーム].[F_サブ].Form.[A].BackColor = vbMagenta Else 'Aの値が上限15.0下限13.5以外の場合背景を黄色に(誤) Forms![F_親フォーム].[F_サブ].Form.[A].BackColor = vbYellow End If 'Bの値が上限55下限玄米値+27未満の場合背景をピンクに(正) If Forms![F_親フォーム].[F_サブ].Form.[B] <= 55 And Forms![F_親フォーム].[F_サブ].Form.[B] >= Me!玄米B + 27 Then Forms![F_親フォーム].[F_サブ].Form.[B].BackColor = vbMagenta Else 'Bの値が55以上の場合背景を黄色に(誤) Forms![F_親フォーム].[F_サブ].Form.[B].BackColor = vbYellow End If 'C : 'Kの値が1の場合背景をピンクに(正) If Forms![F_親フォーム].[F_サブ].Form.[K] = 1 Then Forms![F_親フォーム].[F_サブ].Form.[K].BackColor = vbMagenta Else 'Kの値が0の場合背景を黄色に(誤) Forms![F_親フォーム].[F_サブ].Form.[K].BackColor = vbYellow End If 'Me![F_サブ]![M].FormatConditions.Add( _ 'Type:=acExpression, Expression1:="isnull([M]) = true" _ ').BackColor = vbYellow 'Me![F_サブ]![M].FormatConditions.Add( _ 'Type:=acExpression, Expression1:="isnull([M]) = false" _ ').BackColor = vbMagenta Me!F_サブ!M.FormatConditions.Add( _ Type:=acExpression, Expression1:="isnull([M]) = true" _ ).BackColor = vbYellow Me!F_サブ!M.FormatConditions.Add( _ Type:=acExpression, Expression1:="isnull([M]) = false" _ ).BackColor = vbMagenta End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Forms![F_親フォーム].[F_サブ].Form.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.BackColor = vbYellow Then 'msgにテキストボックスの名前を追加 msg = msg & ctrl.Name & vbCrLf 'メッセージボックスに名前を表示 'MsgBox ctrl.Name End If End If Next ctrl 'msgが空白じゃない場合 If msg <> "" Then 'メッセージボックスを表示 MsgBox msg Else stDocName = "F_一覧" DoCmd.Close acForm, Me.Name DoCmd.OpenForm stDocName End If End If Exit_閉じる_Click: Exit Sub End Sub

macaron0321
質問者

補足

大変遅くなってしまい申し訳ありません。 F_サブは単票形式ですので、帳票フォームではありません。 コードにつきましては、一応会社で使用するモノなのでフィールド名を メモ帳の置換機能にて多少変更しています。(例:本来の名前⇒A) 変なところにスペースが入ってる等ご指摘頂きました件については、 コードを乗せるにあたり文字数削減のために余分なスペースをメモ帳で一括で 置換をしたのが原因でございます。 横着な性格なものでよく考えもせず半角スペースを全て失くすという操作を 実施したところソース内の必要なスペースまで削除してしまい、焦って自分で スペースを入力したのが原因となります。申し訳ありません; 尚、エラートラップを無効にして動作を確認したところMの記述のところで 実行時エラー'438':オブジェクトは、このプロパティまたはメソッドをサポートしていません。 と出てしましました…(Mの記述を全てコメントアウトすると問題なく動作します。) 私の記述の仕方がおかしいのでしょうか。 それとも、もしかしてフィールド名が日本語なのがエラーの原因だったりするのでしょうか。 御礼コメントにて再度コードを載せさせていただきますので、宜しければ再度ご指摘等 頂ければと思います。すみません;;

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.4

> [オブジェクトはこのプロパティまたはメソッドをサポートしていません。] というエラーメッセージの内容と、 > If IsNull(Forms![F_親フォーム].[F_サブフォーム].Form.[A].Value) Then という構文を、自分の経験に照らし合わせての予想になりますが・・・ サブフォームの「名前」(コントロール名)と「ソースオブジェクト」(データ表示 用のフォーム名)を、混同されてはいないでしょうか(汗) 「Forms!~」で参照する場合、使用するのは「名前」の方になります。 サブフォームの「名前」は、以下の方法で確認できます:  1)「F_親フォーム」をデザインビューで開く  2)適当な場所をダブルクリックするなどしてプロパティシートを表示  3)当該サブフォームの外枠を1回だけクリック  4)プロパティシートの『その他』タブを選択し、『名前』欄の値を確認 ・・・以上です。 もしも「F_サブフォーム」以外の名前になっていた場合は、  a)上記「名前」プロパティの値を「F_サブフォーム」にするか、  b)VBA内の「F_サブフォーム」を全てその値に修正するか のどちらか好きな方(楽なのは当然ながら前者ですが・・・)の処理を 行えば、「オブジェクトはこのプロパティまたは~」のエラーは発生しなく なるものと思います。 【余談】 上記「a/b」いずれかの対応が終わった後の話になりますが、   Forms![親フォーム].[サブフォーム].Form.[コントロール].Value は   Forms![親フォーム]![サブフォーム]![コントロール].Value 又は   Forms![親フォーム]![サブフォーム]![コントロール] さらにその式が親フォーム上に記述している場合は     Me![サブフォーム]![コントロール]   又は     Me.[サブフォーム]![コントロール] と指定することもできますので、併せて参考まで。 (この修正を行う場合、「.」ではなく「!」を使用している点に注意してください) 【参考】 「.」と「!」の違い: http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaDotVsBangOperator.html (非常に参考になると思うのですが、ボリュームも大ですので、もしも  興味があって、読み通す気力が残っていれば、ということで・・・(汗))

macaron0321
質問者

お礼

遅くなってしまいすみません;; ご回答を基にフォームの「名前」を確認してみましたが「F_サブフォーム」であっていました。 尚、コントロールの指定の仕方ですがこちらで試してみましたが上手く動作しませんでした。 お忙しいところご回答ありがとうございました。

macaron0321
質問者

補足

ご回答ありがとうございます! ご回答して頂いたのにすぐに対応できずすみません。 現在他業務が忙しく、Access業務に手が回らない状態です;; 頂いた内容を参考に動作確認を実施したいと思います。 後日、またその結果をこのご回答への[お礼]としてご報告させて頂きます! (25日、26日くらいにはできるかと…)

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

んー何故だろう? 'Aが空白の場合 If IsNull(Forms![F_親フォーム].[F_サブフォーム].Form.[A].Value) Then '背景をイエローに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbYellow Else '背景をマゼンダに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbMagenta End If ここで前述のエラーで止まってしまっているのですよね? エラー処理(On Error ・・・)はしてませんよね? If ~ End If までをコメントにして(処理させないで)おいた場合は エラーは発生してませんよね? 差し支えなければ、全文をアップできませんか? と思いましたが、条件付き書式をVBAでどうやるか知らなかったので、 試してみました。 下記にサンプルを置いてあります。 http://firestorage.jp/download/61ec4c4cdba228d77022a7f81a2bc16ed1e9ec04 一週間の命です。自動的に削除されてしまいます。 参考になったのはここ http://www.serpress.co.jp/access/vba040.html ヘルプだけでは無理(どこに書いてあるのやら・・わからん!) 以下は後からこれをご覧になる方の為に。 親フォームFparentにコマンドボタンC2があり 子フォームFchildのF3(テキストボックス)の条件付き書式を変更する場合 Private Sub C2_Click() '条件付き書式でサブフォームFchildのコントロールF3を変えてます Me!Fchild!F3.FormatConditions.Add( _ Type:=acExpression, Expression1:="isnull([F3]) = true" _ ).BackColor = vbYellow Me!Fchild!F3.FormatConditions.Add( _ Type:=acExpression, Expression1:="isnull([F3]) = false" _ ).BackColor = vbMagenta End Sub Private Sub C3_Click() '解除 Me!Fchild!F3.FormatConditions.Delete End Sub

macaron0321
質問者

お礼

大変遅くなってしまい申し訳ありません;; 先日頂いたAccessを参考に動作確認を致しましたがやはり上手く動きません… 部分的だとわかりずらいと思いますので全文を載せさせていただきます。 Private Sub 閉じる_Click() On Error Go To Err _閉じる_Click Dim stDocName As String Dim stLinkCriteria As String 'フォーム上のコントロールを格納する変数 Dim ctrl As Control Dim msg As String '一般の場合 If Me!MUSENEXIST = 0 Then 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.Control Type = acTextBox Then 'Aの値が上限15.5下限13.5以内の場合背景をピンクに(正) If Forms![F_メイン].[F_サブ].Form.[A] <= 15.5 And Forms![F_メイン].[F_サブ].Form.[A] >= 13.5 Then Forms![F_メイン].[F_サブ].Form.[A].BackColor = vbMagenta Else 'Aの値が上限15.5下限13.5以外の場合背景を黄色に(誤) Forms![F_メイン].[F_サブ].Form.[A].BackColor = vbYellow End If 'Bの値が上限45下限規定の値+19未満の場合背景をピンクに(正) If Forms![F_メイン].[F_サブ].Form.[B] <= 45 And Forms![F_メイン].[F_サブ].Form.[B] >= Me!規定+19 Then Forms![F_メイン].[F_サブ].Form.[B].BackColor = vbMagenta Else 'Bの値が45以上の場合背景を黄色に(誤) Forms![F_メイン].[F_サブ].Form.[B].NBackColor = vbYellow End If 'C : 記述は同じなので省略 : 'Lの値が1の場合背景を黄色に(誤) Forms![F_メイン].[F_サブ].Form.[L].NBackColor = vbYellow End If 'Mが空白の場合背景を黄色に(誤) 'IfIsNull(Forms![F_メイン].[F_サブ].Form.[M].Value ) Then 'Forms![F_メイン].[F_サブ].Form.[M].NBackColor = vbYellow 'Else 'Mが空白でない場合背景をピンクに(正) 'Forms![F_メイン].[F_サブ].Form.[M].NBackColor = vbMagenta 'End If Me![F_サブ]![M].FormatConditions.Add(_ Type:=acExpression,Expression1:="isnull([M])=true"_ ).NBackColor = vbYellow Me![F_サブ]![M].FormatConditions.Add(_ Type:=acExpression,Expression1:="isnull([M])=false"_ ).NBackColor = vbMagenta End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Forms![F_メイン].[F_サブ].Form.Controls 'テキストボックスのコントロールを取得 If Type Of ctrl Is TextBoxThen '取得したコントロールが黄色だった場合 If ctrl.NBackColor = vbYellowThen 'msgにテキストボックスの名前を追加 msg=msg&ctrl.Name&vbCrLf 'メッセージボックスに名前を表示 'MsgBox ctrl.Name End If End If Next ctrl 'msgが空白じゃない場合 If msg <> "" Then 'メッセージボックスを表示 MsgBox msg Else stDocName="F_メイン一覧" DoCmd.Close acForm,Me.Name DoCmd.Open Form stDocName End If '特別の場合 Else 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then 'Aの値が上限15.0下限13.5以内の場合背景をピンクに(正) If Forms![F_メイン].[F_サブ].Form.[A] <= 15# And Forms![F_メイン].[F_サブ].Form.[A] >= 13.5 Then Forms![F_メイン].[F_サブ].Form.[A].NBackColor = vbMagenta Else 'Aの値が上限15.0下限13.5以外の場合背景を黄色に(誤) Forms![F_メイン].[F_サブ].Form.[A].NBackColor = vbYellow End If 'Bの値が上限55下限規定の値+27未満の場合背景をピンクに(正) If Forms![F_メイン].[F_サブ].Form.[B] <= 55 And Forms![F_メイン].[F_サブ].Form.[B] >= Me!規定 + 27 Then Forms![F_メイン].[F_サブ].Form.[B].NBackColor = vbMagenta Else 'Bの値が55以上の場合背景を黄色に(誤) Forms![F_メイン].[F_サブ].Form.[B].NBackColor = vbYellow End If 'C : 記述は同じなので省略 : 'Lの値が1の場合背景をピンクに(正) If Forms![F_メイン].[F_サブ].Form.[L] = 1 Then Forms![F_メイン].[F_サブ].Form.[L].NBackColor = vbMagenta Else 'Lの値が0の場合背景を黄色に(誤) Forms![F_メイン].[F_サブ].Form.[L].NBackColor = vbYellow End If Me!F_サブ!M.FormatConditions.Add(_ Type:=acExpression,Expression1:="isnull([M])=true"_ ).NBackColor = vbYellow Me!F_サブ!M.FormatConditions.Add(_ Type:=acExpression,Expression1:="isnull([M])=false"_ ).NBackColor = vbMagenta End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Forms![F_メイン].[F_サブ].Form.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.N BackColor = vbYellowThen 'msgにテキストボックスの名前を追加 msg=msg&ctrl.Name&vbCrLf 'メッセージボックスに名前を表示 'MsgBox ctrl.Name End If End If Next ctrl 'msgが空白じゃない場合 If msg <> "" Then 'メッセージボックスを表示 MsgBox msg Else stDocName="F_一覧" DoCmd.Close acForm,Me.Name DoCmd.Open Form stDocName End If End If Exit_閉じる_Click: ExitSub Err_閉じる_Click: MsgBox Err.Description Resume Exit_閉じる_Click EndSub

macaron0321
質問者

補足

ご回答ありがとうございます! ご回答して頂いたのにすぐに対応できずすみません。 現在他業務が忙しく、Access業務に手が回らない状態です;; 頂いた内容を参考に動作確認を実施したいと思います。 後日、またその結果をこのご回答への[お礼]としてご報告させて頂きます! (25日、26日くらいにはできるかと…)

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

んーと 閉じる時ではなく、読み込み解除時イベントなら、Cancel 出来るので Private Sub Form_Unload(Cancel As Integer) ここでチェック処理をして、未入力があったら Cancel = true msgbox "からっぽ" のようにしては?

macaron0321
質問者

お礼

ご回答ありがとうございます! 読み込み解除時イベントに記述してみましたが、こちらも上手く動作しませんでした。 別の方法を考えてみたほうが良いのでしょうか;; 私としてはどうしても他のチェックと同時に実行したいのですが…

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

こちらの環境(WinXP Access2002)では、 イミディエイトウィンドウで確認しましたがエラーにはなりませんでした。 ?Isnull(For・・・・・・・・・) で結果が返りました forms!・・・・・・・・・・・ 色が変わりました。 閉じる時に処理をさせるのが問題かも? 条件付き書式では問題があるのでしょうか? 式 Isnull([コントロール名]) = true で書式

macaron0321
質問者

お礼

ご回答ありがとうございます。 nicotinism様の環境ではエラーにならなかったのですか; 処理的にはAの他にB,C,D…と19個のテキストボックスがあり、 閉じるボタンを押した際19個のうちの17個は既定値を超えた場合に、 あとの2つは入力がされていない場合にメッセージボックスにオブジェクト名を 表示するという流れになっています。 nicotinism様の仰る通り条件付き書式で処理するのが一番単純かと思いますが、 各テキストボックスへの入力毎にではなく、閉じるボタンを押した際に サブフォームにある全てのテクストボックスをまとめてチェックしたいのです…。 VBA難しいですね;汗

関連するQ&A

  • AccessVBAでサブフォームの値チェック

    こんにちは。前々回http://okwave.jp/qa/q6556906.htmlにて 質問させて頂いたサブフォームの値チェックをする際のVBAの記述で 教えて頂きたい事ができましたので、質問させて頂きます。 Accessのバージョンは2003です。 以下のようなVBAを記述しているのですが、一度VBAでの処理を実行すると フォームを一度閉じてから再度フォームを開くと該当フィールドの色が 元に戻らず黄色又はマゼンダのままとなってしまっています… 別のAccessにて動作確認した際は、再度フォームを開いてもフィールドの 色は元のままだったのですが… どこが原因なのか教えていただければ幸いです。 長文で見辛いですが宜しくお願いします。 Dim stDocName As String Dim stLinkCriteria As String 'フォーム上のコントロールを格納する変数 Dim ctrl As Control Dim msg As String 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then 'Aの値が15.5未満の場合 If Forms![F_親フォーム].[F_サブフォーム].Form.[A] <= 15.5 Then '背景をピンクに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbMagenta Else '背景を黄色に Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbYellow End If 'Bの値が45未満の場合 If Forms![F_親フォーム].[F_サブフォーム].Form.[B] <= 45 Then '背景をピンクに Forms![F_親フォーム].[F_サブフォーム].Form.[B].BackColor = vbMagenta Else '背景を黄色に Forms![F_親フォーム].[F_サブフォーム].Form.[B].BackColor = vbYellow End If End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Forms![F_親フォーム].[F_サブフォーム].Form.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.BackColor = vbYellow Then 'msgにテキストボックスの名前を追加 msg = msg & ctrl.Name & vbCrLf 'メッセージボックスに名前を表示 End If End If Next ctrl 'msgが空白じゃない場合 If msg <> "" Then 'メッセージボックスを表示 MsgBox msg Else 'ctrl.BackColor = vbWhite stDocName = "F_フォーム1" DoCmd.Close acForm, Me.Name DoCmd.OpenForm stDocName End If Exit_閉じる_Click: Exit Sub Err_閉じる_Click: MsgBox Err.Description Resume Exit_閉じる_Click End Sub

  • アクセスのサブフォームの値のチェック

    Accessのサブファームにある、コンボボックスの値をチェックしたいので、下記のようにしてみました。 Dim ctl As Control For Each ctl In Me.Controls If ctl.ControlType = acSubform Then msgbox Forms!メインフォーム名!サブフォームコントロール名.Form!コントロール名 End If Next すると、サブフォームの現在選択しているコンボボックスの値しか表示されません。 現在表示されているサブフォームのコンボボックスの値すべてを表示させるにはどうすればいいのでしょうか。よろしくお願います。

  • 別フレームのフォームへの入力で

    フレーム1(f1)のボタンを押すとフレーム2(f2)のテキストボックス(t1)に文章を入力するようにしたいのですが、 フレーム2のフォームに名前がついている時は(フォーム名はform1)、 parent.f2.form1.t1.value = "test"; で動作したのですが、フォームに名前がない場合に、 parent.f2.forms[0].t1.value = "test"; とした場合、「'parent.f2.forms.0'はNULLまたはオブジェクトではありません」とエラーが出てしまいます。 これを解消したいのですが、エラーの原因がわかりません。 教えてください。 よろしくお願いしますm(_ _)m

  • AccessVBAコードの間違いを指摘してください

    Microsoft Accessでデータベースを作っています。テーブル「駅時刻リスト」「列車リスト」クエリ「クエリ1」フォーム「一列車フォーム」「サブフォーム」を作りました。「一列車フォーム」から列車コードを選択すると「サブフォーム」の列車が列車コードで絞り込まれるようにするコードを書きました。間違いを指摘してください。 Private Sub 列車コード_AfterUpdate() Me!サブフォーム.Form.Filter = "列車コード like '*' & [Forms]![一列車フォーム]![列車コード] & '*'" Me!サブフォーム.Form.FilterOn = True DoCmd.Requery End Sub

  • 条件に該当したテキストボックスの名前を(2)

    前回 http://okwave.jp/qa/q6556269.html で テキストボックスの名前をメッセージボックスに表示する方法(VBA)を 教えて頂いたのですが新たにわからない事がでてきてしまったので 質問させて下さい><自力で解決しようとしたのですがどうしてもできなくて… Accessのバージョンは2003です。 フォームに伝票番号と得意先コードの2つの入力フィールド (テキストボックス)があります。 やりたいことは、以下のようなことです。 伝票番号は100未満の数値でなくてはならず、 得意先コードは1以上かつ10未満でなくてはなりません。 もし、上記の条件に該当しない場合はテキストボックスの色を 黄色に変更させます。 そうしたら黄色に変更されたテキストボックスだけの名前を メッセージボックスに表示させます。 前回教えて頂いたVBAを追記して動かしたところ どちらか片方がエラーの場合はテキストボックスの名前が メッセージボックスに表示されるのですが、 2つともエラーの場合、メッセージボックスが2回表示され 1つのメッセージボックスに1つの名前しか表示されません。 記述したVBAでは正常な動作だと思うのですが、 これを1つのメッセージボックスに黄色のテキストボックスの 名前をいっぺんに表示させたいのですが、 どのようにすれば宜しいでしょうか。 良かったらご教授お願いします!>< 現在記述しているVBAは以下になります。 ---------------------------------------------------------------- Private Sub 閉じる_Click() 'フォーム上のコントロールを格納する変数 Dim ctrl As Control 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then '伝票番号の値が100未満の場合 If Me!txtNo <= 100 Then '背景をピンクに Me!txtNo.BackColor = vbMagenta Else '背景を黄色にして値を元に戻す Me!txtNo.BackColor = vbYellow End If '得意先コードの値が1以上かつ10未満の場合 If Me!txtCode <= 10 And Me!txtCode >= 1 Then '背景をピンクに Me!txtCode.BackColor = vbMagenta Else '背景を黄色にして値を元に戻す Me!txtCode.BackColor = vbYellow End If End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.BackColor = vbYellow Then 'メッセージボックスに名前を表示 MsgBox ctrl.Name End If   End If Next ctrl End Sub

  • 複数の条件で検索したい!

    複数の条件で検索したい! 現在下記のコードでフォームのtxtBoxとcmbBoxの条件でサブフォームを絞込みしています。 これを複数の条件を満たしたレコードだけを絞込みしたいのですが、 txtBox1の条件も拾うしcmb1の条件も拾ってしまう・・・ これを txtBox1の条件を満たした中のcmb1条件も満たすのレコードで絞込みしたいのですが、 どのようにしたら良いか教えてください。よろしくお願いいたします。 Private Sub cmd検索_Click() If Not IsNull(txtBox1) Then サブフォーム.Form.Filter = "顧客コード like '*" & txtBox1.Value & "'" サブフォーム.Form.FilterOn = True End If If Not IsNull(cmb1) Then サブフォーム.Form.Filter = "顧客区分 like '" & cmb1.Value & "'" サブフォーム.Form.FilterOn = True End If If Not IsNull(txtBox2) Then サブフォーム.Form.Filter = "顧客名カナ like '*" & txtBox2.Value & "*'" サブフォーム.Form.FilterOn = True End If

  • accessVBAでのコードの表記方法について

    Sub test() Form_親フォーム.Requery Forms("親フォーム").Requery Forms!親フォーム.Requery End Sub 上記のコードで、すべて問題なく実行できるのですが、 それぞれ「○○方式」という書き方の名前をご存知の方教えてくださいませ。

  • メインフォームからサブフォームの背景色を変えたい。

    メインフォームからサブフォームの背景色を変えたい。 いつもお世話になっています、度々よろしくお願いします。 メインフォームの開く時にレコード内容によりメインフォームの背景色を変えています、 同時にサブフォームの背景色も同色に変更したく(メインフォームの開く時イベント)に下記コードでやってみたのですが プロパティー、メッソッドがサポートされないとエラーが出ます、 Me!サブフォーム名.詳細.BackColor = RGB(192, 192, 192) 親フォームからサブフォームの背景色変更は出来ないのでしょうか? アドバイス宜しくお願いいたします。

  • Accessでチェックしたらサブフォームもチェック

    T_マスタテーブル ・ID ・氏名 ・チェック T_サブテーブル ・ID ・住所 ・チェック となっていて、それぞれフォームを作成していて、 F_マスタフォームの中にF_サブフォームが入っています。 (IDでリンク) マスタテーブルに 1001  山田 太朗   というデータがあったとすると サブには 1001 東京都*** と入っているのですが、 サブは1人につき、1件とは限らず、 1001 東京都渋谷区*** 1001 東京都新宿区*** 1001 埼玉県さいたま市*** となっていることもあります。 F_マスタフォームのチェックの「更新後処理」に Private Sub チェック_AfterUpdate() If チェック = True Then [Form]![F_サブフォーム]![チェック] = True Else [Form]![F_サブフォーム]![チェック] = False End If End Sub と入っていて、F_マスタの方にチェックをすればF_サブのほうにもチェックが 入るようにしたいのですが、 1件目しかチェックがされません。 IDが同じもののチェックにはすべてチェックがされるようにするには どのようにかけばいいのでしょうか? 宜しくお願いします。 Ac2000です。

  • GoToRecordでサブフォームを指定したい

    Fフォームの中にSF詳細という名前のサブフォームを埋め込んでいます。 このサブフォームに対して、 指定したレコードに移動したいのですが DoCmd.GoToRecord acDataForm, Form_SF詳細, acGoTo, 3 DoCmd.GoToRecord acDataForm, Forms("Fフォーム").Controls("SF詳細").Form, acGoTo, 3 DoCmd.GoToRecord acDataForm, "SF詳細", acGoTo, 3 全部エラーになり、うまくいきません。 正しい記述の仕方を教えてください。

専門家に質問してみよう