仕事で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も見ています
-
ちょっと先の未来クイズ第2問
9月9日(月)に発表される「第3回子どもマネー川柳」に入賞する川柳を考えてこちらに投稿してください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
アクセスVBAのMe!と[ ]
Access(アクセス)
-
レコードを保存するコード アクセスvba
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INT64対応のprintf系関数はあり...
-
2次元のdictionary
-
2つ目のレコードの値を取得す...
-
アクセスでADO 並べ替えが適用...
-
クリスタルレポートで文字列の...
-
accessでフィールド追加のあと...
-
Access 2010で実行時エラー3061
-
テーブルのデータ型の変更がで...
-
Accessのフィールド名に半角括...
-
(ADO)フィールド名から取得し...
-
AccessVBAの処理の流れについて。
-
AccessVBAで他テーブルのデータ...
-
日付と文字列を条件としてDLook...
-
[VB2008] datatableを使ったDB(...
-
アクセスのD○○関数について
-
c言語で自分のホームディレク...
-
FTPサーバーから受信したファイ...
-
NULLを含む文字列の結合で...
-
DataTableに特定のフィールドが...
-
ADOでNullフィールドの抽出
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2つ目のレコードの値を取得す...
-
Access 2010で実行時エラー3061
-
Accessのフィールド名に半角括...
-
accessでフィールド追加のあと...
-
INT64対応のprintf系関数はあり...
-
DataTableに特定のフィールドが...
-
AccessのDAOでフィールド名を配...
-
クリスタルレポートで文字列の...
-
アクセスでADO 並べ替えが適用...
-
テーブルのデータ型の変更がで...
-
日付と文字列を条件としてDLook...
-
Access クエリで変数を参照する...
-
ACCESSデータベースにV...
-
クリスタルレポート(8.5)の書式...
-
NULLを含む文字列の結合で...
-
2次元のdictionary
-
フィールド名をループの添え字...
-
Access Dcount関数で引数が指定...
-
ACCESSで視覚的タイムテーブル...
-
オートナンバー型を抽出条件に...
おすすめ情報