- ベストアンサー
[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でも) たまたまダブルクォーテーションをはずすと うまく反応してくれたんでよかったんですが ダブルクオーテーションひとつで なぜこんなに動きが違うのか? わかる方よろしくお願いします。
- みんなの回答 (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理解の一助にでもなれば幸いです。
その他の回答 (2)
- ema_0222
- ベストアンサー率34% (63/185)
おそらく、ダブルクオーテーションはVBAの中での「文字」を意味するからですね。 フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーション(シングルクオーテーションの場合もあります)で括ります。そうしないとデータ型が合いませんというエラーが起きるはずです。 ヘルプでも「DoCmd.OpenForm [ ],[ ],」といった感じのことが書いていませんでした?[]←これはフィールド名なんかを表します。 ただ、テーブル名などが関数の中に出てくるときは、これは””で括ったりします。 例えば、Dlookup("[フィールド名1]","[テーブル名]","[フィールド名2]=" & 1) これはテーブル名のフィールド名1をフィールド名2が1のものを参照しなさいという意味ですが、このように””を使ったり使わなかったり、また文字と文字以外を一つの文にするときは&や+を使って結合してやる必要があります。 散漫な文章になってしまい申し訳ありません。 VBAはデータ型に厳しいのでがんばって勉強してください。 追加です。日付型のデータは##で括ります。
補足
回答ありがとうございます。 出てきたのはおっしゃる通り、「データ型が合いません」というエラーメッセージでした。 Quote)フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーションで括ります。そうしないと(Unquote ここの説明がいまいちよくわからないのですが。 もしよければもうすこし詳しく説明をお願いします。 面倒くさければ結構です。
- maruru01
- ベストアンサー率51% (1179/2272)
OpenFormの第1引数のフォーム名は、文字列式を使います。文字列式とは、""で囲まれたものだと思えばよいでしょう。 帳票名というのはコンボボックスの値(TextかValueプロパティ値)かそれを代入した変数ですよね。それはすでに文字列式になっていると思います。 つまり、AAという帳票名が選択されていれば、 帳票名 = "AA" となっているので、帳票名をさらに""で囲めばエラーになるのではないでしょうか。 もちろん、フォーム名に具体的に "AA" と書けば当然AAしか立ち上がりません。 こんなところですかね。
お礼
第1号の回答、ありがとうございます。 帳票名というのはそういう名前のフィールド名です。 (質問欄に記載したVBAはそのまま複写しています) コンボボックスの値ではないです。 帳票名 = "AA" という記述もしていないので、??という感じですが…。 とりあえず参考にしておきます。
お礼
回答ありがとうございます。 後発の回答ですが、もっともわかりやすいです。 ダブルクォーテーションでくくったものは、その文字列が対象になり、 要素名の場合は、その指定した書式に該当する要素に入っている文字列が対象になる、ということですね。 わかりました。