
前任者が作ったACCESSのVBAを解析しているのですが、いかんせん初心者でして、ネットで都度検索しながら手探りでやっています。
★から★の記述の意味が分からず、ネットで検索しても同じ人物と思われる方が質問サイトに回答として投稿している記述に使われているものしかヒットしませんでした。
どなたかご教授いただければ幸いです。
※コメントは私が書いたものです。
Public Function DBLookup(ByVal strQuerySQL As String, _
Optional ByVal ReturnValue = Null) As Variant
'エラー処理
On Error GoTo Err_DBLookup
'宣言
Dim DataValue
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
With rst
'Open Source SQLステートメント,ActiveConnection,CursorType,LockType
.Open strQuerySQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
'先頭レコードでない場合、先頭レコードに移動し、DataValueに代入、フィールド0を
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
No.2ベストアンサー
- 回答日時:
No.1のお礼に対して。
>IIf(Len(DataValue & "") は >0 の記述が無いのに、
>If Len(DataValue & "") > 0 と同じなのですか?意味がわかりません。。(´;ω;`)どういうことか教えてください。
コードを書き換えるという点では回答した内容になると思います。
ただ基本Trueは-1、Falseは0なのでVisualBasic(.NET以降)ならともかく、何故そう書いているのかは先にも申し上げたように1番目のフィールドの値がどのようになっているのか?になるように思います。
ACCESSVBAについては未経験ではありますが、データの抽出が成功した場合・失敗した場合についてイミディエイトウィンドウなどで確認してみるしかないのでは?
>また、 (DataValue & "") の ”” は必要?何の意味があるのでしょうか?
これもフィールドの値次第ですから憶測にしかなりませんが、ExcelVBAでちょっと書いてみたものです。
Dim i As Integer
i = 123
Debug.Print Len(i)
Debug.Print Len(i & "")
Debug.Print TypeName(i)
Debug.Print TypeName(i & "")
結果は
2
3
Integer
String
まず変数:i をそのままLen関数で桁数を求めようとしても正確には出ません。
本来与える型はstring型である必要の為でしょうか。
なので数値ではなくstringである数字にするため、敢えて "" を連結していると思われます。
その辺は3,4番目の型の確認でわかるかと。
最初の問題点についても
Debug.Print IIf(Len(i), "◯", "×")
結果:◯
ですし、
Dim i As Integer
i = 123
If Len(i & "") Then
Debug.Print "◯"
Else
Debug.Print "×"
End If
これでも結果は "◯" とは表示されますね。
ただ i = 123 を消しても○にはなりますから、尚更フィールドの値が何なのか?と回答者側が疑問に思って逆質問になってしまいます。
結果的に抽出がキチンと出来ているのであれば、一旦『このようなもの』と割り切るのも手ではありますけど。
私は殆どそうやってきましたもので・・・・・・
No.5
- 回答日時:
あ、まだ残っていたのかサーバーを変えたのかな?
エラー処理
http://www.accessclub.jp/vba/vba_006.htm
Resumeステートメント
http://www.accessclub.jp/vba/vba_008.htm
めぐみん様
何度もありがとうございます!
教えて頂いたことも半分も理解できていないので、参考サイトを見ながら理解していってみます。
ご丁寧に教えて頂き非常に助かりました!!本当にありがとうございました!!
No.4
- 回答日時:
No.3のお礼について。
>変数:DataValueに何も値が入らない場合を考えると、なぜ& ""を付けなければならないのでしょうか?そもそも「& ""」の効果がわかりません。
Excelでの検証です。
Dim aaa
Debug.Print TypeName(aaa)
Debug.Print TypeName(aaa & "")
結果
Empty
String
Len関数に与える引数は【文字列(String)】とヘルプ等にあります。
あとは【作成された人の拘り】によりコードの内容は千差万別に変わります。
ある意味【明確にString型としたかった】のではないですかね?
中盤のは本来Trueは-1なので1以上でも
Len(DataValue & "") = True
これではFalseを返すかもですが、If文では【0か否か】で判断されているようです。
私自身はきちんと【 >0 】を使う側ですが、その人が何故そうしたのかは、【それでも期待通りに動くから】なのですかね?
そこはこちらも疑問を持ってしまいます。
>また、下記は「エラー時実行する」という認識でよろしいのでしょうか?
>Err_DBLookup:以下の記述との違いがわかりません。。
まずWith~Exit Function内でエラーが発生した場合、
'エラー処理
On Error GoTo Err_DBLookup
上記に従ってコードを順に実行せず目的のErr_DBLookup:以降を実行し、そのエラーについて詳細な理由を表示させます。
'エラー時次を実行
On Error Resume Next
ACCESSのデータベースが正常にClose出来ないなどのエラーが発生した(書いている場所からしての推測です)としても、そこでコードを中断せず
Err_DBLookup:に移行しエラーの理由を表示した後、DBLookup は
>Optional ByVal ReturnValue = Null
によりNull値を持ってExit Function(抜け出る)になると思います。(Resume Exit_DBLookupがある点で)
正直ACCESS自体は皆無なので説明がおかしいかも知れません。
昔は『ACCESS CLUB(だったかな?)』と言うわかりやすいし質問掲示板もあるサイトがあったのですが、
だいぶ前に閉鎖されてしまいました。ACCESSを始めようとした矢先の事でしたので、かなり残念でしたね。
No.3
- 回答日時:
No.2です。
あ~、もしかすると抽出できなかった場合変数:DataValueには何も値が入らないので、
Dim DataValue
Debug.Print Len(DataValue & "") = True
結果:False
Len(DataValue & "") は 0 (False) となるからですかね。
めぐみん様
ご返答ありがとうございます!
まず、該当のテーブルを見てみたのですが、Fields(0)には12桁の数字が入ることがわかりました。
一つ目の質問ですが、
DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue) は
DBLookupに代入、DataValueがあればDataValue、なければReturnValue というふうに理解しました。
二つ目の質問は、
① & ""があることでstring型になる。
ということはわかりましたが、
>抽出できなかった場合変数:DataValueには何も値が入らないので、
>Dim DataValue
>Debug.Print Len(DataValue & "") = True
>結果:False
>Len(DataValue & "") は 0 (False) となるからですかね。
上記の意味がわかりません。。
変数:DataValueに何も値が入らない場合を考えると、なぜ& ""を付けなければならないのでしょうか?そもそも「& ""」の効果がわかりません。
ネットで検索しても出てきませんでした。。
こちらの環境でイミディエイトウィンドウで試した結果、DataValue = 12345や"あいうえお"などを入れても結果がFalseになりました。
ですが、
Debug.Print IIf(Len(DataValue & ""), DataValue, ReturnValue)
とすると、12345やあいうえおを返します。
理屈がわかりません。とりあえず「深く考えないようにしよう」とするしか無いのでしょうか?
また、下記は「エラー時実行する」という認識でよろしいのでしょうか? Err_DBLookup:以下の記述との違いがわかりません。。
On Error Resume Next
rst.Close
Set rst = Nothing
DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
Exit Function
教えてください!宜しくお願い致します。
No.1
- 回答日時:
>Public Function DBLookup
と言うユーザー関数の値を決める部分ですよね。
>IIf(Len(DataValue & ""), DataValue, ReturnValue)
IIf はIf文を短くした感じの物ですが、
If Len(DataValue & "") > 0 Then
DBLookup = DataValue
Else
DBLookup = ReturnValue
End If
がIf文での書き方になるかな?
すなわち.Fields(0)の値の長さ(文字列なのかどうかは判断できないですが)が、0か0以上であるかを短縮して書いている物と思いますよ。
多分 & "" をつけているので空白ではないのかも知れない・・・かな?とは思えちゃいますけど、そこは実際にデータで確認されたし。
ご回答ありがとうございます!
IIf(Len(DataValue & "") は >0 の記述が無いのに、
If Len(DataValue & "") > 0 と同じなのですか?意味がわかりません。。(´;ω;`)どういうことか教えてください。
また、 (DataValue & "") の ”” は必要?何の意味があるのでしょうか?
ご回答お願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
On ErrorでエラーNoが0
-
【VBA】ワークブックを開く時に...
-
.VBSだとADODBのプロバイダが見...
-
ASPでこんなエラーが出たんです...
-
お助けください!VBAのファイル...
-
mailstorehomeのエクスポートで...
-
pythonのopenpyxlについて
-
Excel VBA のFunctionプロシー...
-
VBA データ(特定値)のある最...
-
バッチファイルで、あるスクリ...
-
ステートメントが見つかりません
-
【Access】Excelインポート時に...
-
VB6 MSFlexGrid行数指定について
-
VBAのリストボックスで、横スク...
-
マクロの「SaveAs」でエラーが...
-
レコード登録時に「演算子があ...
-
実行時エラー '8021'とはどんな...
-
ある1人の友達のLINEで、少しの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
On ErrorでエラーNoが0
-
VBA データ(特定値)のある最...
-
インポート時のエラー「データ...
-
マクロで"#N/A"のエラー行を削...
-
VBAのリストボックスで、横スク...
-
ApplicationとWorksheetFunctio...
-
Excel vbaについての質問
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
Filter関数を用いた結果、何も...
-
文字列内で括弧を使うには
-
【VB.NET】 パワポ操作を非表示で
-
レコード登録時に「演算子があ...
おすすめ情報