プロが教える店舗&オフィスのセキュリティ対策術

Access2010のVBAにて
"AAA.txt"
"BBB.txt"
"CCC.txt"
"DDD.txt"
"EEE.txt"
といったファイル名の場合Trueを返すという関数を作成したいと思っています。

今思いついている方法としては
1.配列に格納してループで文字を検索
2.ifの条件で羅列して検索
3.Filter関数で妥協

3のFilter関数は「含まれる文字」という事で"AAA.t"の場合でもTrue扱いになってしまうので
これはほぼ却下のつもりです。

おおよそこの自作関数が呼ばれる回数が30回ほどになります。
ですので出来るだけ処理速度早い方がいいので、1のループで検索はためらっています。

という事で2の方法をとろうかと思っています。
他に何かいい方法はありますでしょうか?

===大まかな処理の流れ===
ルートフォルダーのパス取得

ルートから再帰でサブをたどる

サブ内にファイルがある場合上記5つのファイルか?
↓Yes
次の処理へ→処理後次のファイルへ
↓No
次のファイルへ

補足必要な場合はご指摘ください。

A 回答 (1件)

ファイル名の候補をテーブルに持たない理由があるんですか?


テーブルに持っておけば候補が多くなろうがコードの変更は不要ですよ。
私なら
フォルダを再帰でたどる部分 → FileSystemObject を使う。
ファイル名候補一覧 → テーブルに格納する。
ファイル名候補とファイル名とのすり合わせ → パラメーター クエリーを作っておき、フォルダー内で見つけたファイルの名前が格納されているか判断する。

"fileName" というテキスト型のフィールドを持つテーブルを "fileNameMaster" という名前で作っておき、ファイル名候補を入れておく。

以下のようなパラメーター クエリーを作成し、"FindFile" という名前で保存しておく
PARAMETERS [@FileName] Text ( 255 );
SELECT Count(fileNameMasuter.fileName) AS fileNameのカウント
FROM fileNameMasuter
WHERE (((fileNameMasuter.fileName)=[@FileName]));

VBA にて以下のような関数を作っておき、再帰処理で見つけたファイル名を投げる。
ヒットすれば True が返り、なければ False が返る。
Function FindFile(aFileName As String) As Boolean
  Dim con As ADODB.Connection
  Set con = CurrentProject.Connection

  Dim proc As New ADODB.Command
  With proc
    .CommandText = "FindFilename"
    .CommandType = adCmdStoredProc
    .ActiveConnection = con
  End With

  Dim param As ADODB.Parameter
  Set param = proc.CreateParameter
  With param
    .Name = "[@FileName]"
    .Type = adVarWChar
    .Size = 255
    .Value = aFileName
  End With
  proc.Parameters.Append param

  If proc.Execute.Fields(0).Value >= 1 Then
    FindFile = True
  Else
    FindFile = False
  End If
End Function

とか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ファイル名をテーブルに理由はありません。
ただ、あえて理由を付けるとしたら、「ファイル名の変更も無く、ファイル数も5つ」である(はず)
という理由ぐらいです。

まぁ、「はず」ですのでお教え頂いた通りにするのがすっきりかな?と思ったのでその様にいたします。
ありがとうございました。

お礼日時:2011/12/20 14:29

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

関連するカテゴリからQ&Aを探す