• ベストアンサー

アクセス DCountの返り値が必ず0になる

DCountの返り値が必ず0になってしまうのです。 該当のフィールドには値は入っています。 しかし Sub test() Dim ColName As String ColName = "あああ" Debug.Print DCount("[" & ColName & "]", "test", "[" & ColName & "] = '" & ColName & "'") End Sub をすると、どんなに値がはいっていても0になってしまいます。 フィールドの型はテキスト型です。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

> DCount("[" & ColName & "]", "test", "[" & ColName & "] = '" & ColName & "'") これは何を得たいのでしょう。 ColName = "あああ" なら DCount("[あああ]", "test", "[あああ] = 'あああ'") になると思いますが、添付された図内に [あああ] = 'あああ' は無いですね。 単に DCount("[あああ]", "test") であれば、図の見えている範囲では 5 が返ってくると思いますが・・・・

PVTETEJPB8
質問者

お礼

フィールド名も検索文字も変数に入れてましたね。ありがとうございました。

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

先日はねぎらいのお言葉を戴き、ありがとうございました。 http://okwave.jp/qa/q7900814.html さて、本題ですが・・・ テキスト型のフィールドを絞り込み条件としたDCount関数 では、確かに第3引数は「[フィールド名]='検索文字列'」に なることが多いですが、それ以外の形を使用する場面も あります。 今回提示されたコード上の式から私が推測する、「想定した 式」に近く、かつ「意図した(と思われる)結果」が得られるのは、 以下に示す式です。 但し、Accessでテキスト型のフィールドを作成したときに 既定の値となる「Null」は特殊な値で、「=」では同じ値か どうかの判定ができません。 (イミディエイトウィンドウで「?Null=Null」の結果を確認する  と、「True」ではなく「Null」が返ります) PVTETEJPB8さんが、この点をどう想定していたかによって 「意図した結果」も変わるため、以下のように、結果が 異なる2通りの式が考えられます: a) Debug.Print DCount("[" & ColName & "]", "test", "[" & ColName & "]=[" & ColName & "]") b) Debug.Print DCount("[" & ColName & "]", "test", "Nz([" & ColName & "])=Nz([" & ColName & "])") 上記の2つの式のうち、  a)の場合は『あああ』の値が「Null」以外のものの全件数が、  b)の場合は『あああ』の値に関係なく、テーブルの全件数が、 それぞれ返されます。 (第2引数を省略したNz関数では、対象がテキスト型なら  空文字("")、数値型の場合は「0」に変換されます。  Nullと違い、「""=""」の比較結果は、通常の文字列と  同様に「True」となるため、テーブルの全件数がカウント  される結果となります) 但し、上記の結果を得たい場合、通常はそれぞれ以下のように 「第3引数を省略した式」を使用します: a) Debug.Print DCount("[" & ColName & "]", "test")  または b) Debug.Print DCount("*", "test") http://office.microsoft.com/ja-jp/access-help/HA001228817.aspx (ページ中ほどの「+ヒント」(青文字の折り畳み)以降を特に参照) ・・・以上、長くなりましたが、参考まで。

PVTETEJPB8
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • アクセス DCount Between and

    テーブルの5月分の件数をvbaで取得するにはどうすればいいでしょうか? Sub test() Debug.Print DCount("[取引日]", "T取引先", "[取引日] = Between #5/1/2013# And #5/31/2013#") End Sub これだと、実行時エラー3075「クエリ式の構文エラー:演算子がありません。」が返ります。 多分、クライテリアの士気が間違ってるんだと思います。 Sub test() Debug.Print DCount("[取引日]", "T取引先", "[取引日] = #5/1/2013#") End Sub これなら取得できました。 Sub test() Debug.Print DCount("[取引日]", "T取引先", "[取引日] = #5/*/2013#") End Sub ワイルドカードは使えないようで、これもエラーになりました。 5月分の件数を取得する方法はありますか? よろしくお願いします。

  • アクセス複数の条件で同じ書式をつけるには?

    条件付き書式です。(しかもVBAです) 一つのフィールドに対して違う条件だけど同じ書式をつけたい時、 まとめる事は出来ないのでしょうか? 例えばフォールド1の「あ」と「い」を赤にしたい場合、 Sub test01() Dim Field As String Dim MyFormName As String MyFormName = "フォーム" Field = "フィールド1" With Forms(MyFormName).Controls(Field) With .FormatConditions .Delete With .Add(acExpression, , "[" & Field & "]=""あ""" And "[" & Field & "]=""い""") .ForeColor = 225 End With End With End With End Sub のような事は出来ないのでしょうか? これをすると 実行時エラー:型が一致しません。(Error 13) になります。 素直に、 Sub test02() Dim Field As String Dim MyFormName As String MyFormName = "フォーム" Field = "フィールド1" With Forms(MyFormName).Controls(Field) With .FormatConditions .Delete With .Add(acExpression, , "[" & Field & "]=""あ""") .ForeColor = 225 End With With .Add(acExpression, , "[" & Field & "]=""い""") .ForeColor = 225 End With End With End With End Sub としなくちゃダメでしょうか? 何故こんな事がしたいかと言うと、3つ以上やりたい条件がありので、 同じ書式のものはまとめたいのです。 ご教授よろしくお願いします。

  • 変数を続けて宣言した場合はEmpty型になる?

    Sub test1() Dim Int1, Int2 As Long Debug.Print "---------- test1の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub Sub test2() Dim Int1 As Long Dim Int2 As Long Debug.Print "---------- test2の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub を実行すると、 ---------- test1の実行結果 ---------- Empty Long ---------- test2の実行結果 ---------- Long Long の結果が得られます。 test1のInt1がEmpty型になりますが、変数の型にEmptyはないですよね? どういうことなのでしょう???

  • VBA 複数の文字のコードを一気に返すには

    Sub test1() Dim myStr As String myStr = "abc" Debug.Print Asc("a") Debug.Print Asc(myStr) End Sub このコードは、どちらも97が返るのですが、 myStrは3文字です。 3文字全ての文字コードを返すには、 Sub test2() Dim myStr As String myStr = "abc" Debug.Print Asc(Mid(myStr, 1, 1)) & Asc(Mid(myStr, 2, 1)) & Asc(Mid(myStr, 3, 1)) End Sub のようにするしかないのでしょうか?

  • アクセスのクエリでSplit関数は使えないのですか

    レコードにaaa/bbb/cccと入っていて、 クエリで SELECT Split([テーブル1]![フィールド1],"/") AS test FROM テーブル1; とすると、 式に未定義関数 <関数名> があります。(Error 3085) になります。 VBAでやるとしたら Sub test() Dim str As String str = "aaa/bbb/ccc" Debug.Print Split(str, "/")(1) End Sub のような事がしたいのですが クエリでは無理なのでしょうか?

  • 変数iもjも同じく値を保持できるからどちらを使って

    このサンプルコードは、 変数iもjも同じく値を保持できるから、test1を使ってもtest2を使っても一緒なのでしょうか? Option Explicit Dim i As Integer Sub test1() Static j As Integer j = j + 1 Debug.Print j End Sub Sub test2() i = i + 1 Debug.Print i End Sub ご回答よろしくお願いします。

  • 変数の型の色の違い

    Sub test() Dim a As String Dim i As Range End Sub とすると 変数の型のが 「String」と「Range」の色が違いますがなぜでしょう?

  • InputBox  String型・Variant

    VBAです。 InputBox  String型・Variant型がエラーにならない理由がわかりません。 Sub 日付型() Dim 日 As Date 日 = InputBox("値をいれてください") End Sub Sub 数値型() Dim i As Long i = InputBox("値をいれてください") End Sub Sub 通貨型() Dim 円 As Currency 円 = InputBox("値をいれてください") End Sub Sub String型() Dim a As String a = InputBox("値をいれてください") End Sub Sub Variant型() Dim v As Variant v = InputBox("値をいれてください") End Sub String型・Variant型以外は、 「実行時エラー '13'; 型が一致しません。」になります。 String型・Variant型はならない理由を教えてください。ご回答よろしくお願いします。

  • VB2008: 構造体に関するMSDNの解釈について!

    ' ================== ' 構造体変数の代入 ' ================== Module theTEST   Private Structure TEST4     Dim MembersCount As Integer     Dim Member1 As String     Dim Member2 As String   End Structure   Sub Main()     Dim T4_1 As TEST4     Dim T4_2 As TEST4     T4_1.MembersCount = 1     T4_1.Member1 = "T4_1:Member1"     T4_1.Member2 = "T4_1:Member2"     T4_2 = T4_1     Debug.Print(T4_2.MembersCount.ToString)     Debug.Print(T4_2.Member1)     Debug.Print(T4_2.Member2)   End Sub End Module [イミディエイト ウインドウ] 1 T4_1:Member1 T4_1:Member2 >構造体の要素が文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 (http://msdn.microsoft.com/ja-jp/library/18ytyskd(VS.80).aspx) このMSDNライブラリの説明によると、 [イミディエイト ウインドウ] 0 T4_1:Member1 T4_1:Member2 という結果を得るというのが私の予測。 もしかしたら、MSDNライブラリの説明の舌足らず。 >構造体の要素が値型であらば値がコピーされますが、文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 ということでしょうか?

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

専門家に質問してみよう