• ベストアンサー

[Access VBA] DoCmd.OpenForm ...の書式について(VBAに詳しい方求む!)

仕事でAccessを使用しています。 帳票管理のデータベースを作ってて 帳票名フィールドに各種の帳票の名前が格納されています。 ここはコンボボックスにしてあり、データベース化する 対象の帳票も決まってます。 メインのフォームには帳票の基礎データを入力し フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで 各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。 そこで、メインのフォームに設けたボタンの 「クリック時」のイベントプロシージャに以下の記述をしました。 Private Sub 詳細記録_Click() DoCmd.OpenForm 帳票名 End Sub ボタンをクリックした時点で帳票名フィールドに記載されている 帳票の詳細記録フォームがたちあがります。 例えば帳票名フィールドが 「AA」の時→ボタンClick→AAの詳細記録フォームが立ちあがる。 「BB」の時→ボタンClick→BBの詳細記録フォームが立ちあがる。 (企業秘密のため具体的な帳票名を書けません。) 実はこのような動作をしてくれるのが目的だったのですが 疑問があるんです。 それより前には、上述のと1箇所だけ記述がいろいろ変えてました。 DoCmd.OpenForm "帳票名" 帳票名のところがダブルクォーテーションでくくってあるかないか の違いです。 くくるとエラーが出ますが、くくらないとうまく行きます。 [帳票名]のときもうまく行きましたが、"[帳票名]" はだめのようです。 また、" "の中を具体的な帳票の名前にすると (例:DoCmd.OpenForm "AA") いつでもそのAAフォームだけがたちあがります。 (帳票名フィールドの記述がBBでも) たまたまダブルクォーテーションをはずすと うまく反応してくれたんでよかったんですが ダブルクオーテーションひとつで なぜこんなに動きが違うのか? わかる方よろしくお願いします。

  • momoo
  • お礼率62% (51/81)

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

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

文字列と要素名との使い分けで混乱なさってるようですね。 ダブルクォーテーションで括るのは、「ソースコード中に直接、文字列を記述する」場合のみです。 'テキストボックスに「こんにちは」と表示する MsgBox "こんにちは" この例では、MsgBox命令に対して、「こんにちは」という文字列を渡しています。 Dim Message as String Message = "こんにちは" MsgBox Message この例では、Message という変数に「こんにちは」という文字列を代入し、MsgBox命令にMessage という変数を渡しています。 Messageは変数であって文字列ではないため、ダブルクォーテーションで括る必要がないのです。 DoCmd.OpenForm でも同様。 DoCmd.OpenForm "帳票A" は、「帳票A」という文字列をDoCmd.OpenForm命令に渡しています。 帳票フィールドに「帳票A」という文字が格納されているとき、 DoCmd.OpenForm Me![帳票フィールド] とすると、DoCmd.OpenFormに渡されるのは「Me![帳票フィールド]」という文字列ではなく、帳票フィールドに格納されている「帳票A」という文字列が渡されるのです。 尚、この命令文は Dim Chouhyou As String Chouhyou = Me![帳票フィールド] DoCmd.OpenForm Chouhyou とするのと同じです。 あんまりいい説明じゃないかもしれませんが、VBA理解の一助にでもなれば幸いです。

momoo
質問者

お礼

回答ありがとうございます。 後発の回答ですが、もっともわかりやすいです。 ダブルクォーテーションでくくったものは、その文字列が対象になり、 要素名の場合は、その指定した書式に該当する要素に入っている文字列が対象になる、ということですね。 わかりました。

その他の回答 (2)

  • ema_0222
  • ベストアンサー率34% (63/185)
回答No.2

おそらく、ダブルクオーテーションはVBAの中での「文字」を意味するからですね。 フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーション(シングルクオーテーションの場合もあります)で括ります。そうしないとデータ型が合いませんというエラーが起きるはずです。 ヘルプでも「DoCmd.OpenForm [  ],[  ],」といった感じのことが書いていませんでした?[]←これはフィールド名なんかを表します。 ただ、テーブル名などが関数の中に出てくるときは、これは””で括ったりします。 例えば、Dlookup("[フィールド名1]","[テーブル名]","[フィールド名2]=" & 1) これはテーブル名のフィールド名1をフィールド名2が1のものを参照しなさいという意味ですが、このように””を使ったり使わなかったり、また文字と文字以外を一つの文にするときは&や+を使って結合してやる必要があります。 散漫な文章になってしまい申し訳ありません。 VBAはデータ型に厳しいのでがんばって勉強してください。 追加です。日付型のデータは##で括ります。

momoo
質問者

補足

回答ありがとうございます。 出てきたのはおっしゃる通り、「データ型が合いません」というエラーメッセージでした。 Quote)フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーションで括ります。そうしないと(Unquote ここの説明がいまいちよくわからないのですが。 もしよければもうすこし詳しく説明をお願いします。 面倒くさければ結構です。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

OpenFormの第1引数のフォーム名は、文字列式を使います。文字列式とは、""で囲まれたものだと思えばよいでしょう。 帳票名というのはコンボボックスの値(TextかValueプロパティ値)かそれを代入した変数ですよね。それはすでに文字列式になっていると思います。 つまり、AAという帳票名が選択されていれば、   帳票名 = "AA" となっているので、帳票名をさらに""で囲めばエラーになるのではないでしょうか。 もちろん、フォーム名に具体的に "AA" と書けば当然AAしか立ち上がりません。 こんなところですかね。

momoo
質問者

お礼

第1号の回答、ありがとうございます。 帳票名というのはそういう名前のフィールド名です。 (質問欄に記載したVBAはそのまま複写しています) コンボボックスの値ではないです。 帳票名 = "AA" という記述もしていないので、??という感じですが…。 とりあえず参考にしておきます。

関連するQ&A

  • MS ACCESS2000のVBAでDocmd.openformしてます

    openform のパラメータのwhereconditionに、like演算子を使って、 「 フィールド名 like %文字% 」 というような指定をしたいのですが、上手くいきません。 演算子が無いとか、いろいろ言われてしまいます。 どのように記述すると、動作するでしょうか?

  • Access DoCmd.OpenFormの引数

    現在Access VBAを勉強中の者です。 DoCmd.OpenForm については、同じQ&Aがありますが回答内容の意味が理解できず応用が利きません。 具体的には、 DoCmd.OpenForm "フォーム名", , , "商品番号 = '" & Me!商品番号 & "'" における、Where句の「"」と「'」の使い方です。 私の情報収集では、   (1)文字列は「"」で囲む。   (2)Where句は「"」で囲む。   (3)「"」の囲みが重複したら内側を「'」に変更する。 なのですが、(2)と(3)は上記の例からでは理解に苦しみます。 DoCmd.OpenForm のWhere句の「"」と「'」の使い方についてその仕様を教えて下さい。

  • DoCmd.OpenFormパラメータが表示される

    いつもお世話になっています。 DoCmd.OpenFormで条件に合致するフォームが開く以下のコードを作成して使っています。 Private Sub send_Click() DoCmd.OpenForm "集計", acFormDS, , "[支所] =" & Me.支所 & " And [部署] =" & Me.部署, , acHidden End Sub [部署]はこれまで数値で表していましたが、テキストを使用することになりました。 上記のプロシージャを実行すると[部署] のところにパラメータが表示されて 入力すると指定の支所と部署のデータが表示されます。 別の質問で、テキスト型を検索する記述方法は教えていただいて解決したのですが、 パラメータを表示せずに上記の式に反映するにはどうしたらいいのでしょうか。 型は数値型からテキスト型に変更しています。 お力添えをお願いいたします。

  • VBAのopenformについて

    はじめまして。 現在、Accessを仕事で使うために勉強中です。 使用しているOSはWindowsXP、Accessは2003を使用しています。 顧客管理のデータベースのようなものを練習で作っているのですが、 作成した一覧のフォームから顧客コードを元に別のフォームを開けるように したいのですが、うまくいきません。 フォーム1:顧客一覧 フォーム2:顧客登録画面 このフォーム1とフォーム2は、同じテーブルを元にしたフォームです。 フォーム1の「顧客コード」というところをダブルクリックすると、該当の顧客コードの フォーム2が開くようにしたいと思い、フォーム1のテキストボックスに、 Private Sub 顧客コード_DblClick(Cancel As Integer) DoCmd.OpenForm "顧客登録", , , "[顧客コード] ='" & Me![顧客コード] & "'" End Sub と記載しましたが、いざ実行をすると 「OpenFormアクションの実行はキャンセルされました」 と表示されてしまいます。 どのようにしたら、この現象が回避でき希望する動きができるのかわからず悩んでおります。 すみませんが、解決する方法を教えていただければと思います。 宜しくお願いいたします。

  • VBAでのj検索

    Access2000のVBAで18つのチェックボタンでフィールドを選択し、1つのテキストボックスに文字列を入力して検索ボタンで検索するプログラムを以下のような記述の仕方で作成しました。 Private Sub 条件検索_Click() Dim stFilter As String Dim stDocName As String If 特定検索 = 1 Then stDocName = "メイン" stFilter = "フィールド名1='" & テキストボックス名 & "'" DoCmd.OpenForm stDocName, , , stFilter ElseIf 特定検索 = 2 Then stDocName = "メイン" stFilter = "フィールド名2='" & テキストボックス名 & "'" DoCmd.OpenForm stDocName, , , stFilter ・ ・ 上記のような記述で上手くいかないので、部分一致で検索 出来る方法を教えていただけませんでしょうか。 よろしくお願い致します。

  • OpenFormがACCESS2000でエラー

    メニューのフォームで使っているOpenFormがACCESS2000で次のエラーがでます。OFFICE365では出ません。 「selectステートメントが間違っている予約語や引数を含んでいるか、区切り記号が正しくありません」 例えば次のコードです。 Private Sub 受注入力_Click() DoCmd.OpenForm "受注入力" End Sub 同じようなコードでも次のコードではなぜか出ていません。 Private Sub 受注入力B_Click() DoCmd.OpenForm "受注入力B" End Sub このフォームは何年も変更しておらずエラーは出なかったのですが、1か月前あたりから出るようになりました。 なぜかお分かりの方がおられましたらご教示願えませんでしょうか。

  • アクセスVBA 変数を渡したい

    フォーム1のcmd_ボタンをクリックして、フォーム2を開く際に、変数を渡したいのですが、どう渡せばいいのでしょうか? Private Sub cmd_ボタン_Click() myStr = "あああ" DoCmd.OpenForm "フォーム2" (myStr) End Sub とすると、エラーになります。 文の書き方を教えてください。

  • Excel2003 VBA ボタンを押したらフォームを開く

    オブジェクト名”きほん”というフォームをつくって、表示させるためのボタンを”検索”というシートに作りました。 なぜかエラーが出ます。 msgbox的なイメージで考えていたのですが、前提の定義がいるっぽいエラーメッセージが入ってます。 どうしたらいいと思いますか? (”検索”内のボタンは、ボタン441という名称です。) Sub ボタン441_Click() Docmd.OpenForm ("きほん") End Sub

  • access レコードソースを選択し、DoCmd.OpenFormする方法

    Select Caseのフレームで、レコードソース(クエリ)を選択し、 そのソースを基にDoCmd.OpenFormする方法がわかりません。 よろしくお願いします。 ---------------------------------------------------- Dim strSource As String Dim Q1, Q2 As String Dim stDocName As String Dim フォーム1 As Form stDocName = "フォーム1" Q1 = "クエリ1" Q2 = "クエリ2" Select Case フレーム1 Case 1 strSource = Q1 Case 2 strSource = Q2 End Select 'stDocName.RecordSource = strSource '-----この文はこの位置でよいのでしょうか? DoCmd.OpenForm stDocName, acFormDS ---------------------------------------------------- クエリ1,クエリ2は基になるテーブルが違いますが、フィールドは同一にしてあります。 ですのでフォーム1には、対応するテキストボックスは用意してあります。

  • ACCESS VBA 一覧から別フォームを開きたい

    顧客管理をしようとしています。 表形式のフォームで一覧を表示させています。 一覧の詳細セクションに「詳細」というボタンをつけていて、 すべての行に、詳細ボタンを表示させています。 この詳細ボタンを押したら、この顧客カード(単票形式のフォーム)を開きたいと思っています。 現在、下記の記述をしていますが、 「抽出条件でデータ型が一致しません」とのエラーメッセージが出ます。 どこを修正したら良いかわかりません。 わかる方、よろしくお願いいたします。 現在の記述 Private Sub コマンド29_Click() If Me.NewRecord Then MsgBox "新規レコードから詳細情報を表示することはできません。" Else DoCmd.OpenForm "顧客フォーム", , , "顧客ID='" & 顧客ID & "'" End If End Sub

専門家に質問してみよう