仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。

そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をしました。

Private Sub 詳細記録_Click()
DoCmd.OpenForm 帳票名
End Sub

ボタンをクリックした時点で帳票名フィールドに記載されている
帳票の詳細記録フォームがたちあがります。
例えば帳票名フィールドが
「AA」の時→ボタンClick→AAの詳細記録フォームが立ちあがる。
「BB」の時→ボタンClick→BBの詳細記録フォームが立ちあがる。
(企業秘密のため具体的な帳票名を書けません。)

実はこのような動作をしてくれるのが目的だったのですが
疑問があるんです。
それより前には、上述のと1箇所だけ記述がいろいろ変えてました。

DoCmd.OpenForm "帳票名"

帳票名のところがダブルクォーテーションでくくってあるかないか
の違いです。
くくるとエラーが出ますが、くくらないとうまく行きます。

[帳票名]のときもうまく行きましたが、"[帳票名]" はだめのようです。

また、" "の中を具体的な帳票の名前にすると
(例:DoCmd.OpenForm "AA")
いつでもそのAAフォームだけがたちあがります。
(帳票名フィールドの記述がBBでも)

たまたまダブルクォーテーションをはずすと
うまく反応してくれたんでよかったんですが
ダブルクオーテーションひとつで
なぜこんなに動きが違うのか?
わかる方よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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理解の一助にでもなれば幸いです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/09/05 10:16

おそらく、ダブルクオーテーションはVBAの中での「文字」を意味するからですね。


フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーション(シングルクオーテーションの場合もあります)で括ります。そうしないとデータ型が合いませんというエラーが起きるはずです。
ヘルプでも「DoCmd.OpenForm [  ],[  ],」といった感じのことが書いていませんでした?[]←これはフィールド名なんかを表します。

ただ、テーブル名などが関数の中に出てくるときは、これは””で括ったりします。
例えば、Dlookup("[フィールド名1]","[テーブル名]","[フィールド名2]=" & 1)
これはテーブル名のフィールド名1をフィールド名2が1のものを参照しなさいという意味ですが、このように””を使ったり使わなかったり、また文字と文字以外を一つの文にするときは&や+を使って結合してやる必要があります。

散漫な文章になってしまい申し訳ありません。
VBAはデータ型に厳しいのでがんばって勉強してください。

追加です。日付型のデータは##で括ります。

この回答への補足

回答ありがとうございます。
出てきたのはおっしゃる通り、「データ型が合いません」というエラーメッセージでした。

Quote)フォームの名称は文字ではないんでが、テーブルに格納するときデータ型がテキスト型だと「文字」を格納します。その際VBAで更新や追加を行うときは、格納する文字をダブルクオーテーションで括ります。そうしないと(Unquote

ここの説明がいまいちよくわからないのですが。
もしよければもうすこし詳しく説明をお願いします。
面倒くさければ結構です。

補足日時:2001/09/05 10:07
    • good
    • 0

OpenFormの第1引数のフォーム名は、文字列式を使います。

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

第1号の回答、ありがとうございます。

帳票名というのはそういう名前のフィールド名です。
(質問欄に記載したVBAはそのまま複写しています)
コンボボックスの値ではないです。
帳票名 = "AA" という記述もしていないので、??という感じですが…。

とりあえず参考にしておきます。

お礼日時:2001/09/05 09:53

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qaccess レコードソースを選択し、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には、対応するテキストボックスは用意してあります。

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.RecordSo...続きを読む

Aベストアンサー

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > 0 Then
    Me.RecordSource = Me.OpenArgs
  End If
End Sub

まあ、好き好きでしょうが<2>がOKのバージョンであれば<2>がお勧めです。

<補足>

ただ、WhereCondition を使うのが一般的かと思います。
全く異なるクエリであれば、それぞれに対応したフォームを用意した方がシンプルでは・・・。

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > ...続きを読む

QACCESS2000の帳票フォームでカーソルのあるレコードの他のフィールドの書式変更のモジュール

ACCESS2000の帳票フォームで、一番左のフィールドが得意先名、
間にいくつかのフィールドがあり、一番右のフィールドが金額を入金フィールドとして、
入金フィールドにカーソルがある場合、今どの得意先にいるか分かるように、今いるレコードの得意先フィールドの色を変えたいと思ってます。
この場合のモジュールの書き方を教えて頂けますでしょうか?
条件付書式設定でも無理なので、今はレコードセレクタを使ってます。
でもフィールドが多いため、右のほうに行けばどのレコードにいるのか分からなくなってしまうのです。
宜しくお願いいたします。

Aベストアンサー

>"テキスト72"="SHIIRE_CD"
これじゃ文字列の比較式です
[テキスト72]=[SHIIRE_CD]

Qアクセスのフォームビューの帳票フォームではレコード

アクセスのフォームビューの帳票フォームではレコードを削除する事は出来ないのでしょうか?

データシートビューではレコードセレクタを選択し右クリックをすると
「レコードの削除(R)」という項目が出てきますが
帳票フォームでは出てきません。

帳票フォームでレコードを削除する方法を教えてください。
よろしくお願いいたします。

Aベストアンサー

ツールバー上の[レコードの削除]コマンドボタン か
レコードセレクタを選択し、[Delete]キー

Q単票フォームと帳票フォームを連動 アクセス

どういう構成にすればいいか教えてください。

元データはT_testのみですが
T_testを元に、単票フォームと帳票フォームを作り、
この二つのフォームをサブフォームにし、1つの親フォームにはめて、
帳票フォームのレコードをクリックする(カレントレコードが変わる)度に
単票フォームは、帳票フォームのデータを表示させたいのですが
どうすればいいでしょう?

レコードソースは親フォームに設定すればいいのでしょうか?
それとも単票フォームと帳票フォームそれぞれにT_testを設定すればいいでしょうか?

帳票フォームのレコードをクリックして単票フォームのデータを表示させる際は、
帳票フォームの値を取得して単票フォームにフィルタをかければいいのでしょうか?

Aベストアンサー

No2 さんの方法を VBA を使用しないで実現。

hatena さんのを拝借して

帳票フォームの埋め込んであるサブフォームコントロール名を、SubForm1
単票フォームの埋め込んであるサブフォームコントロール名を、SubForm2
とします。

「T_test」の中に、オートナンバ「an」フィールドがあると仮定します。
オートナンバでなくてもレコードを一意に決定できるフィールドなら OKです。

細工1)
メインに不可視のテキストボックス「txt1」を配置します。
txt1 のコントロールソースを
=[subform1].[Form].[an]

細工2)
SubForm2 の リンク親/子フィールドを設定します。
(直接の手入力で:ビルドは使いません(この状況では使えません))
・リンク親フィールド : txt1
・リンク子フィールド : an

Qフィールド名(フィールド自体)の並び替えについて

Access初心者です。
Accessに詳しい人が作ったDBをちょっといじって
使いやすくしたいのですが、方法が分からず困っています。

そのdbはクエリを使ってフォームを作っているのですが、
フォームを開くと、

A__|B__|C__| ←フィールド名
***|***|***| ←データ

と、テーブルのような表が実行されます。

これのフィールド自体の順番を変更したいのですが、

A__|B__|C__| ←フィールド名
***|***|***| ←データ

A__|C__|B__| ←AとBの間にCを入れる
***|***|***|

どこをいじればよいかが分かりません。
フォームをデザインビューで開くと、
フォームを実行した時とは全く異なるビューが表示されます。

ご教授の程、宜しくお願い致します。

Aベストアンサー

フォームをデザインビューで開き
メニューの [表示] - [タブオーダー] で 順番を変えてください。
上にあるものが左になります。


人気Q&Aランキング

おすすめ情報