
仕事で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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) マイクロソフト アクセス2021のフォームビュー作成でレイアウトを帳票形式から単票形式にあとから変更 1 2023/03/03 10:56
- 会計ソフト・業務用ソフト VBA 記録簿の行間を空けないコードを教えて欲しい。 5 2023/07/10 19:29
- Visual Basic(VBA) ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:16
- IT・エンジニアリング ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:17
- その他(プログラミング・Web制作) Accessの代わりのノンプログラムデータベース作成 4 2022/10/21 09:26
- 会社経営 振り込みしたときのご利用明細票の取り扱いについて 2 2022/07/29 16:32
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Excel(エクセル) Excelの帳票形式をアクセスに取り込むため、 csvのデータ形式になるように、マクロを作成している 2 2022/06/12 22:52
- その他(税金) 銀行(および他の金融機関)で税金を払う方法は? 9 2022/05/24 06:58
- Excel(エクセル) Excelについて教えてください。 帳票データがあります。 アクセスに取り込むため、 データ形式にし 1 2022/06/08 19:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access クエリで変数を参照する...
-
実行時エラー'9':インデックス...
-
CString型 全角半角を意識せず...
-
vbaで出来ますか?
-
【excelマクロ】重複をチェック...
-
VB上でのレコードセットの扱い...
-
VBAでMODE関数をつくる
-
C#でbyte配列から画像を表示さ...
-
Dir関数で読み取り順を操作でき...
-
アクセステーブル、リンクとロ...
-
★クリスタルレポートの元になる...
-
コミットとは何でしょうか?
-
ACCESS2000 INPUTBOX でテーブ...
-
COBOL数値転記の仕様
-
vba フィルター 複数条件 3つ以...
-
配列の格納方法
-
コンボボックスのインデックス...
-
複数の配列変数を1つの配列変数...
-
16進コード文字列を文字列に変換
-
VBAでアクセスDBからデータの取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INT64対応のprintf系関数はあり...
-
accessでフィールド追加のあと...
-
2つ目のレコードの値を取得す...
-
Accessのフィールド名に半角括...
-
DataTableに特定のフィールドが...
-
テーブルのデータ型の変更がで...
-
ACCESSデータベースにV...
-
クリスタルレポート(8.5)の書式...
-
クリスタルレポートで文字列の...
-
日付と文字列を条件としてDLook...
-
Access 2010で実行時エラー3061
-
ADOでNullフィールドの抽出
-
Access クエリで変数を参照する...
-
NULLを含む文字列の結合で...
-
AccessのDAOでフィールド名を配...
-
アクセス ADO Null以外のレコ...
-
クリスタルレポートで0件時の表示
-
FTPサーバーから受信したファイ...
-
C#で変数名の取得
-
c言語で自分のホームディレク...
おすすめ情報