- 締切済み
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
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- venzou
- ベストアンサー率71% (311/435)
>ところで、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)
ラベルじゃなくテキストボックスにするか Nz関数で空き文字("")にしてやればいいのでは
Public Function DBLookup(ByVal strField As String, _ ByVal strTable As String, _ Optional ByVal strWhere As String = "", _ Optional ByVal ReturnValue = "") As Variant ReturnValue の初期値をミスってました。
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