dポイントプレゼントキャンペーン実施中!

前任者が作った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

A 回答 (5件)

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 を消しても○にはなりますから、尚更フィールドの値が何なのか?と回答者側が疑問に思って逆質問になってしまいます。

結果的に抽出がキチンと出来ているのであれば、一旦『このようなもの』と割り切るのも手ではありますけど。
私は殆どそうやってきましたもので・・・・・・
    • good
    • 0

あ、まだ残っていたのかサーバーを変えたのかな?



エラー処理
http://www.accessclub.jp/vba/vba_006.htm
Resumeステートメント
http://www.accessclub.jp/vba/vba_008.htm
    • good
    • 0
この回答へのお礼

めぐみん様

何度もありがとうございます!
教えて頂いたことも半分も理解できていないので、参考サイトを見ながら理解していってみます。
ご丁寧に教えて頂き非常に助かりました!!本当にありがとうございました!!

お礼日時:2018/03/26 17:38

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を始めようとした矢先の事でしたので、かなり残念でしたね。
    • good
    • 0

No.2です。



あ~、もしかすると抽出できなかった場合変数:DataValueには何も値が入らないので、

Dim DataValue
Debug.Print Len(DataValue & "") = True

結果:False

Len(DataValue & "") は 0 (False) となるからですかね。
    • good
    • 0
この回答へのお礼

めぐみん様
ご返答ありがとうございます!

まず、該当のテーブルを見てみたのですが、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

教えてください!宜しくお願い致します。

お礼日時:2018/03/26 13:13

>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以上であるかを短縮して書いている物と思いますよ。
多分 & "" をつけているので空白ではないのかも知れない・・・かな?とは思えちゃいますけど、そこは実際にデータで確認されたし。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
IIf(Len(DataValue & "")   は >0 の記述が無いのに、
If Len(DataValue & "") > 0 と同じなのですか?意味がわかりません。。(´;ω;`)どういうことか教えてください。

また、 (DataValue & "") の ”” は必要?何の意味があるのでしょうか?

ご回答お願い致します。

お礼日時:2018/03/24 11:54

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