アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
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

A 回答 (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関数の方が速いケースも
あるかも知れませんが、必ずそうなるとは言えないと思います。
    • good
    • 0

ラベルじゃなくテキストボックスにするか


Nz関数で空き文字("")にしてやればいいのでは
    • good
    • 0

Public Function DBLookup(ByVal strField As String, _


             ByVal strTable As String, _
             Optional ByVal strWhere As String = "", _
             Optional ByVal ReturnValue = "") As Variant

ReturnValue の初期値をミスってました。
    • good
    • 0

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
    • good
    • 0

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