• ベストアンサー

アクセス DLookup

If Nz(DLookup("[主キー]", strテーブル名, "[主キー] = '" & str主キー & "'"), False) = True Then bl_未転記データ = True 'ないならば Else bl_未転記データ = False 'あるならば End If このコードはどこがおかしいですか? テーブルに主キーがあるかどうかを調べたいのですが あってもなくても、 bl_未転記データ = False 'あるならば になってしまいます。

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

>テーブルに主キーがあるかどうかを調べたいのですが Dlookupの結果が主キーになってるからです。 [主キー] = True の結果は False にしかなりません。 DCount関数で、0 or 1以上の数値 で結果を出せばいいです。 If (DCount("*", strテーブル名, "[主キー] = '" & str主キー & "'") > 0 Then bl_未転記データ = True 'ないならば Else bl_未転記データ = False 'あるならば End If

medqwivlb
質問者

お礼

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

その他の回答 (3)

回答No.4

主キーはテキスト型ですよね。 DLookupは該当のレコードが見つかればそのテキストを返します。 "テキスト"はTrueとは違いますので、"テキスト"=True はFalseになります。 該当レコードが見つからない場合は、Nullを返します。Nz関数で Null を Falseに変換してますので、その場合も結果はFalseになります。 Nullを返せば該当レコードなし、テキストを返せば該当レコードがあり、ということですので、Nullかどうかを調べればいいです。IsNull関数で調べることができます。 If IsNull(DLookup("[主キー]", strテーブル名, "[主キー] = '" & str主キー & "'")) Then なお、DCountで結果が0かどうかで調べることもできますが、DCountだと全件をカウントしますが、DLookupは該当レコードが見つかった時点で処理を終了しますので、高速になることが期待できます。

medqwivlb
質問者

お礼

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

回答No.3

【補足】非数字の場合

medqwivlb
質問者

お礼

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

回答No.2

主キーが数字であると仮定しての回答です。

medqwivlb
質問者

お礼

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

関連するQ&A

  • アクセスにてテーブル内の重複チェックについて

    下記の様なテーブル構成になっています。 大分類マスタ 大分類 長整数型 分類見出し 文字列 このテーブルにフォームから入力をさせているのですが重複チェックの時にvercheckのデータ形式が違いますと出てエラーが出ます。色々とデータ形式を変えたのですがうまくいきません。 どの様にすれば宜しいのでしょうか?ご教授頂きます様お願い致します。 尚、テーブルの数値を文字形式にすれば動作するのは分かっているのですが数値形式の場合の やり方を教えてください。 Dim str大分類 As String Dim str分類見出し As String Dim vercheck As Variant If IsNull(大分類) = False Then str大分類 = 大分類 vercheck = DLookup("大分類", "T大分類マスタ", "大分類='" & str大分類 & "'") If Not IsNull(vercheck) Then MsgBox ("同じ大分類番号があります") Exit Sub Cancel = True Else End If Else Exit Sub End If If IsNull(分類見出し) = False Then str分類見出し = 分類見出し vercheck = DLookup("分類見出し", "T大分類マスタ", "分類見出し='" & str分類見出し & "'") If Not IsNull(vercheck) Then MsgBox ("同じ分類見出しがあります") Exit Sub Cancel = True Else End If Else Exit Sub End If -------ここからフォームから直にテーブルに書いています。--------- Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = Application.CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T大分類マスタ", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs![大分類] = Forms!F大分類マスタ登録画面!大分類 rs![分類見出し] = Forms!F大分類マスタ登録画面!分類見出し rs.Update End Sub

  • Access Dlookup関数について

    Dlookupで悩んでいます。 ExcelのVlookと違い、“数字”のコードでなければ引っ張ってこれないのでしょうか? 以下、がその内容です。 「T_得意先マスタ」の得意先コードフィールドに aaa というコードがあり、得意先名フィールドに ○○商事 とあります。 どうやってもできないのです。 なぜか、aaa ではなく、数字(例. 123)にすると出ます。 教えてください。 Private Sub 得意先コード_AfterUpdate() Dim a As Variant, b As String b = "得意先コード = " & Me![得意先コード] a = DLookup("得意先名", "T_得意先マスタ", b) If IsNull(a) = True Then Me.テキスト1.Value = "該当がありません。": Me![得意先コード] = Null Else Me.テキスト1.Value = a End If End Sub

  • マイクロソフトアクセス Dlookupの使い方

    先日、同じ質問をした者です。別角度からのトライをしてみました。 (経緯) Table1とTable2を作りました。Table1には5レコードを入力済みです。 tabale2からFoam2を作りました。で、table2のField2にDlookupの定義を書いてみました。単純に、Field1を選んだらField2がコピーされてくるだけです。(予定では・・・) Foam2でField1を選ぶ事は出来るのですが、Field2に移動しても何も表示されません。Field3に移動するとエラーがでます。debugを選ぶとdlookup分が黄色に反転してます。 参考書片手に苦戦しましたが変化無しです。アドバイスをお待ちしています! ●エラー Run-time error'3464'. datatype mismatch in criteria expression ●書いた定義 Private Sub Text6_Click() If Not IsNull(bakk) Then Field1 = DLookup("Field1", "Table1", "Field1=" & Field1) End If End Sub ●テーブル定義 Table1 Field1 (Text) Fleld2 (Text) Field3 (Text) Table2 Field1 (Table1のField1をコンボボックスで選択) Field2 (Table1のField2を自動で表示したい) Field3 (自分でテキストを入力) データタイプはTextで10文字指定です。

  • 文字列で渡された式

    質問です。 タイトルのままですが文字列で渡された式で 処理を決定させることはできるのでしょうか? たとえば ============================ dim str as string = "10 > 5" if strの文字列判定 then msgbox("TRUE") else msgbox("FALSE") end if ============================

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。

  • AccessのDLookupについて

    AccessのDLookupについての質問です。 いろいろ調べたのですがわからなかったので教えてください。 テーブル「社員」…ID、社員コード、氏名、所属、回数 フォーム…テーブルと同項目 フォームで社員コードを入力すると、自動的に氏名、所属が表示されるようにしました。 しかし、所属が変更になった社員氏名がうまく表示できません。 ~例~ ID_社員コード_氏名 _所属_回数 1_1234   _山田 _東京_1 2_1234   _山田 _東京_2 3_1234   _山田 _大阪_3 とあったときに、表示したいのはID_3のデータなのですが、ID_1のデータが表示になってしまうのです。(回数が最大の氏名、所属を表示したい) x = Nz(DMax("回数", "社員", "社員コード=" & [社員コード]), 0) Me!氏名 = DLookup("氏名", "社員", "社員コード=" & [社員コード]) _ & " and 回数=" & x) としています。エラーは出ません。 どこが変なのでしょう? よろしくおねがいします。

  • エクセルVBAでShapesまたはDrawingObjects

    シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub

  • VBAの比較処理においてバグ?

    環境はVistaBusiness、Excel2003です。 以下のような比較処理をして条件を満たせばTrueを返す関数を作成しましたが 偶然このパラメータ(関数上は引数としてデータ取得)が入ってきた場合に Trueを返すようになってしまいました。 論理的に考えれば当然Falseになるのかと思うのですが なぜかTrueが返ってきます。 If 163.05 < 163.07 Then If 163.04 < (163.05 - 0.01) Then Chk = True Exit Function End If End If Chk = False 但しこの数字を下記のように変更すると意図するとおり Falseが返ってきます If 163.06 < 163.07 Then If 163.05 < (163.06 - 0.01) Then Chk = True Exit Function End If End If Chk = False これはバグなのでしょうか? お分かりになる方がいれば回答お願いします。

  • Access EOFの判定がうまくいかない

    お世話になります。 Access2010 テーブルのEOFの判定がうまくいきません。  If TMP.EOF = False Then   MsgBox "EOFではありません"  Else   MsgBox "EOFです"  End If TMPには1レコードありますが、なぜかTrueになってしまいます。 なお、TMP.MoveLastしてもエラーにならず、その後、イミディエイト ウィンドウで?TMP.EOFとしてみると、Falseが返ってきます。 本来であればEOFでMoveLastするとカレントレコードが無い旨のエラーに なるかと思うので、EOFではないと思うのですが。。 どのようなことが考えられますでしょうか。 <TMPについて> ・(訳あって)主キーは設けておりません。 ・0レコードか1レコードです。1レコード以上になることはありません。 ・TMPはあるフォームのレコードソースとしています。  ※フォーム上の登録ボタンが押されたら、フォームのレコードソースを   ""としフォームを閉じます。このタイミングでTMPにレコードが生成   されます。   上記の判定処理は、フォームを閉じた直後に行っています。 ご教示の程、宜しくお願い致します。

  • またまた エクセルのユーザー定義で

    前回以下のようなコードを教えていただきましたが、この変換を複数列で使えるようにするにはどうしたらいいのでしょうか? D,G,N,Q,X,AA,の列に効かせたいのですが。 Private Sub worksheet_change(ByVal Target As Range) If Intersect(Target, Columns(1)) Is Nothing Or Selection.Count <> 1 Then Exit Sub Dim str As String str = Target Application.EnableEvents = False If Target <> "" Then If Len(str) = 7 Then Target = Left(str, 5) & "A" & Mid(str, 6, 1) & "-" & Right(str, 1) Else Target = Left(str, 5) & "A" & Mid(str, 6, 2) & "-" & Right(str, 1) End If End If Application.EnableEvents = True End Sub