• 締切済み

Access レポートでのラベルの表示について

こんにちは。 Access2003,windowsXPです。 レポート機能で、ラベルにテーブルのデータを表示させているのですが、指定したテーブルが空白の場合、エラーが出ます。 NULL値でもエラーが出ないように設定したいのですが、方法はありますか? 参考までに(VBA) Private Sub Report_Open(Cancel As Integer)   Me!ラベル133.Caption = DLookup("テーマNo", "BMM", "ID = 1") Me!ラベル134.Caption = DLookup("テーマ名称", "BMM", "ID = 1") Me!ラベル135.Caption = DLookup("請求額", "BMM", "ID = 1") End Sub

みんなの回答

  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

>ところで、DLookup関数は実に動作が遅いです。 >しかし、次のように ADODB で DBLookup関数を自作すればおおよそ3倍速で表示されます。 気になったので検証してみました。 ------------------------------------------ 環境  WindowsXP Access2000 ------------------------------------------ テストプログラム Private Sub test1()  Dim i As Long  Dim st As Single  Dim tmp As Long    tmp = Rnd(-1)  Randomize 1    st = Timer  For i = 1 To 10000   tmp = DLookup("DATA", "テストテーブル", "ID = " & Int(Rnd() * 100000) + 1)  Next  Debug.Print Timer - st   End Sub Private Sub test2()  Dim i As Long  Dim st As Single  Dim tmp As Long    tmp = Rnd(-1)  Randomize 1    st = Timer  For i = 1 To 10000   tmp = DBLookup("DATA", "テストテーブル", "ID = " & Int(Rnd() * 100000) + 1)  Next  Debug.Print Timer - st   End Sub ------------------------------------------ テストテーブル(ID,DATA)  ID  オートナンバー(主キー)  DATA 数値型(長整数) テーブルの内容は10万件のデータで、 IDは1~100000 DATAは乱数 ------------------------------------------ 結果 DLookup  12.375 秒 DBLookup 22.656 秒 DLookupの方が早いという結果でした。 ------------------------------------------ AccessのmdbはADOよりもDAOの方が相性が良いと思います。 また、組み込み関数はC言語などで作られているので、 VBAで作った自作関数と比べて、速度的に有利です。 場合によっては、DBLookup関数の方が速いケースも あるかも知れませんが、必ずそうなるとは言えないと思います。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

ラベルじゃなくテキストボックスにするか Nz関数で空き文字("")にしてやればいいのでは

noname#140971
noname#140971
回答No.2

Public Function DBLookup(ByVal strField As String, _              ByVal strTable As String, _              Optional ByVal strWhere As String = "", _              Optional ByVal ReturnValue = "") As Variant ReturnValue の初期値をミスってました。

noname#140971
noname#140971
回答No.1

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)   Me.ラベル0.Caption = DLookup("TEL", "Customer", "ID=4") & ""   Me.ラベル1.Caption = Nz(DLookup("TEL", "Customer", "ID=4"))   Me.ラベル2.Caption = DBLookup("TEL", "Customer", "ID=4") End Sub エラーを回避するには "" をアペンドされたらいいです。 Nz関数を利用しても構いませんが、"" をアペンドするのが簡単かと思います。 補足: DLookup関数の難点を自作関数で補う法。 ところで、DLookup関数は実に動作が遅いです。 しかし、次のように ADODB で DBLookup関数を自作すればおおよそ3倍速で表示されます。 DBLookup関数では、ヌル値であれば既定値で ""を戻します。 [イミディエイト] ? DBLookup("ID", "Customer", "TEL='000-000-000'", 0) 0 ? DBLookup("ID", "Customer", "TEL='000-000-000'", "Not found!") Not found! このように、ヌルの場合の戻り値を指定することも可能です。 Public Function DBLookup(ByVal strField As String, _              ByVal strTable As String, _              Optional ByVal strWhere As String = "", _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim strQuerySQL As String   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   strQuerySQL = "SELECT " & strField & " FROM " & strTable   If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere   End If   With rst           .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        DataValue = .Fields(0)      End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

関連するQ&A