こんにちは。
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件)
- 最新から表示
- 回答順に表示
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関数の方が速いケースも
あるかも知れませんが、必ずそうなるとは言えないと思います。
No.2
- 回答日時:
Public Function DBLookup(ByVal strField As String, _
ByVal strTable As String, _
Optional ByVal strWhere As String = "", _
Optional ByVal ReturnValue = "") As Variant
ReturnValue の初期値をミスってました。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワードかエクセルで、KOKU...
-
エクセル宛名ラベルが重複する
-
一点一葉とはどんな意味ですか?
-
ラベルの差込印刷で2ページ目以...
-
<excel> 差し込み印刷ヘッダー設定
-
ワードで宛名ラベルのフォント...
-
wordの差込印刷(ラベル作成)...
-
インデックスに印刷する方法
-
ワード差し込み印刷:作成した...
-
Excelの結合セルの印刷について
-
Excel VBAのフォーム_ラベルの...
-
Accessのレポートで複数列の見...
-
ワード(エクセル)で名札を作成
-
エクセル2002の円グラフのデー...
-
ワード差込印刷 縦書き・横書き...
-
CDやDVDの表面へのラベル...
-
ラベルマイティのipad版教えて...
-
エーワンラベルに差し込み印刷...
-
筆王
-
エクセルのデータを基に宛名ラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一点一葉とはどんな意味ですか?
-
ワードかエクセルで、KOKU...
-
エクセル宛名ラベルが重複する
-
ラベルの差込印刷で2ページ目以...
-
インデックスに印刷する方法
-
筆王
-
CDやDVDの表面へのラベル...
-
DVDのタイトルを変更したい
-
ワード差込印刷 縦書き・横書き...
-
エクセルでマイタックラベルへ...
-
フラットファイルの背表紙部分...
-
A4横文書を横のまま、A4縦用紙...
-
ピボットテーブルのΣ値のタイト...
-
ワード差し込み印刷:作成した...
-
Excel VBAのフォーム_ラベルの...
-
宛名ラベル 2枚目以降が表示、...
-
wordでラベル差込印刷時に右端...
-
ラベル屋さんでひとつひとつの...
-
ワードで宛名ラベルのフォント...
-
CDの曲名のテンプレートを作り...
おすすめ情報