
仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。
そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をしました。
Private Sub 詳細記録_Click()
DoCmd.OpenForm 帳票名
End Sub
ボタンをクリックした時点で帳票名フィールドに記載されている
帳票の詳細記録フォームがたちあがります。
例えば帳票名フィールドが
「AA」の時→ボタンClick→AAの詳細記録フォームが立ちあがる。
「BB」の時→ボタンClick→BBの詳細記録フォームが立ちあがる。
(企業秘密のため具体的な帳票名を書けません。)
実はこのような動作をしてくれるのが目的だったのですが
疑問があるんです。
それより前には、上述のと1箇所だけ記述がいろいろ変えてました。
DoCmd.OpenForm "帳票名"
帳票名のところがダブルクォーテーションでくくってあるかないか
の違いです。
くくるとエラーが出ますが、くくらないとうまく行きます。
[帳票名]のときもうまく行きましたが、"[帳票名]" はだめのようです。
また、" "の中を具体的な帳票の名前にすると
(例:DoCmd.OpenForm "AA")
いつでもそのAAフォームだけがたちあがります。
(帳票名フィールドの記述がBBでも)
たまたまダブルクォーテーションをはずすと
うまく反応してくれたんでよかったんですが
ダブルクオーテーションひとつで
なぜこんなに動きが違うのか?
わかる方よろしくお願いします。
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理解の一助にでもなれば幸いです。
回答ありがとうございます。
後発の回答ですが、もっともわかりやすいです。
ダブルクォーテーションでくくったものは、その文字列が対象になり、
要素名の場合は、その指定した書式に該当する要素に入っている文字列が対象になる、ということですね。
わかりました。
No.2
- 回答日時:
おそらく、ダブルクオーテーションはVBAの中での「文字」を意味するからですね。
フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーション(シングルクオーテーションの場合もあります)で括ります。そうしないとデータ型が合いませんというエラーが起きるはずです。
ヘルプでも「DoCmd.OpenForm [ ],[ ],」といった感じのことが書いていませんでした?[]←これはフィールド名なんかを表します。
ただ、テーブル名などが関数の中に出てくるときは、これは””で括ったりします。
例えば、Dlookup("[フィールド名1]","[テーブル名]","[フィールド名2]=" & 1)
これはテーブル名のフィールド名1をフィールド名2が1のものを参照しなさいという意味ですが、このように””を使ったり使わなかったり、また文字と文字以外を一つの文にするときは&や+を使って結合してやる必要があります。
散漫な文章になってしまい申し訳ありません。
VBAはデータ型に厳しいのでがんばって勉強してください。
追加です。日付型のデータは##で括ります。
この回答への補足
回答ありがとうございます。
出てきたのはおっしゃる通り、「データ型が合いません」というエラーメッセージでした。
Quote)フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーションで括ります。そうしないと(Unquote
ここの説明がいまいちよくわからないのですが。
もしよければもうすこし詳しく説明をお願いします。
面倒くさければ結構です。
No.1
- 回答日時:
OpenFormの第1引数のフォーム名は、文字列式を使います。
文字列式とは、""で囲まれたものだと思えばよいでしょう。帳票名というのはコンボボックスの値(TextかValueプロパティ値)かそれを代入した変数ですよね。それはすでに文字列式になっていると思います。
つまり、AAという帳票名が選択されていれば、
帳票名 = "AA"
となっているので、帳票名をさらに""で囲めばエラーになるのではないでしょうか。
もちろん、フォーム名に具体的に "AA" と書けば当然AAしか立ち上がりません。
こんなところですかね。
第1号の回答、ありがとうございます。
帳票名というのはそういう名前のフィールド名です。
(質問欄に記載したVBAはそのまま複写しています)
コンボボックスの値ではないです。
帳票名 = "AA" という記述もしていないので、??という感じですが…。
とりあえず参考にしておきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クリスタルレポートで困ってい...
-
テーブルのデータ型の変更がで...
-
AccessのDAOでフィールド名を配...
-
accessでフィールド追加のあと...
-
日付と文字列を条件としてDLook...
-
DataTableに特定のフィールドが...
-
クリスタルレポート(8.5)の書式...
-
NULLを含む文字列の結合で...
-
FTPサーバーから受信したファイ...
-
ACCESS VBA Parametersで or演...
-
Access 追加クエリについて
-
C# DataTableに最後に追加した...
-
C#でbyte配列から画像を表示さ...
-
OutOfMemoryExceptionの回避策...
-
他のMDBのテーブルに追加したい
-
Dir関数で読み取り順を操作でき...
-
クリスタルレポートでレコード...
-
エクセル VBA 変数を一括で宣言...
-
DBから取得した値を配列へ代入する
-
EXCELのVBAでLenB関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INT64対応のprintf系関数はあり...
-
accessでフィールド追加のあと...
-
2つ目のレコードの値を取得す...
-
Accessのフィールド名に半角括...
-
NULLを含む文字列の結合で...
-
DataTableに特定のフィールドが...
-
クリスタルレポート(8.5)の書式...
-
AccessのDAOでフィールド名を配...
-
テーブルのデータ型の変更がで...
-
日付と文字列を条件としてDLook...
-
2次元のdictionary
-
ACCESSで視覚的タイムテーブル...
-
ADOでNullフィールドの抽出
-
Access 2010で実行時エラー3061
-
AccessVBAで他テーブルのデータ...
-
クリスタルレポートの式フィー...
-
Access クエリで変数を参照する...
-
ACCESSデータベースにV...
-
ACCESSで日別集計をする場合
-
Access 追加クエリについて
おすすめ情報