• ベストアンサー

Access2010 VBA での文字検索

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 次のファイルへ 補足必要な場合はご指摘ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 とか。

nobb_hero
質問者

お礼

回答ありがとうございます。 ファイル名をテーブルに理由はありません。 ただ、あえて理由を付けるとしたら、「ファイル名の変更も無く、ファイル数も5つ」である(はず) という理由ぐらいです。 まぁ、「はず」ですのでお教え頂いた通りにするのがすっきりかな?と思ったのでその様にいたします。 ありがとうございました。

関連するQ&A

  • ACCESS VBA にて複数項目のあいまい検索をしようとしています。

    ACCESS VBA にて複数項目のあいまい検索をしようとしています。 txt部所、txt内容、txt備考はそれぞれ検索窓です。 実行すると、 「オブジェクト変数またはWithブロック変数が設定されていません」 というメッセージがでます。 また、動作としては部所の検索のみでき、 内容、備考検索は上記のエラーメッセージが出てできない状態です。 アドバイスよろしくお願いいたします。 以下がコードになります。 Private Sub cmd01_Click() Me.FilterOn = False If txt部所 <> "" Then Me.Filter = "[部所氏名]like '*" & txt部所 & "*'" ElseIf txt内容 <> "" Then Me.Filter = "[内容]like '*" & txt内容 & "*'" ElseIf txt備考 <> "" Then Me.Filter = "[備考]like '*" & txt備考 & "*'" ElseIf Nz(txt部所) & Nz(txt内容) & Nz(txt備考) = "" Then MsgBox "検索条件を入力してください" End If Me.FilterOn = True End Sub

  • accessの検索フォームについて(複数条件)

    access初心者です。 本などを参考に検索フォームを作成しました。 1つの条件で検索することは出来たのですが、複数の条件を入力するとうまく検索出来ません。 全ての条件を満たすデータの抽出を行いたいと思います。 「あ」「い」「う」というテキストボックスを用意しています。 Private Sub コマンド14_Click() If Not IsNull(Me.txt_あ) Then ' Me.Filter = "あ LIKE '*" & Me!txt_あ & "*'" End If If Not IsNull(Me.txt_い) Then ' Me.Filter = "い LIKE '*" & Me!txt_い & "*'" End If If Not IsNull(Me.txt_う) Then ' Me.Filter = "う LIKE '*" & Me!txt_う & "*'" End If Me.FilterOn = True End Sub よろしくお願いします。

  • Accessの検索フォーム

    またまたAccessについての質問です。 検索フォームというのを作りました。 テーブルのデータから条件に合うものだけを抽出したいのです。 たとえば1つ目の検索フォーム[A]のテキストボックスに「AAA」を入力します。 そのあとBには「BBB」と入力します。 同じくCには「CCC」と入力します。 そして絞込みボタンを押したらAAAでBBBでCCCのものが抽出されます。 これはうまくいきました。 とりあえず、複数条件なので、わけもわからず「&」で結んでしまいました・・・。 ↓は絞込みボタンのクリック時です。↓ 困ったのは、すべて検索条件を指定しない場合です。 たとえば「AAA」で「CCC」のものを抽出したいとき、[A]のテキストボックスに「AAA」と入れ [C]のテキストボックスに「CCC」と入れます。 そして絞込みボタンをクリック。 するとBが未記入だからか、抽出されたのは真っ白でした・・・。 Option Compare Database Private Sub コマンド50_Click() Me.Filter = "契約='" & Me!テキスト51 & "'and A='" & Me!テキスト57 & "'" Me.FilterOn = True End Sub 組み合わせが自由になる検索フォームにするにはどうすればよいのでしょうか? 誰か助けてくださ~い!

  • 文字列検索で・・・

    Instr関数で文字列の存在チェックを行っています。 この場合、変数indexに1が入った場合 Instr("aaa1_a.sql","index") <----- この場合問題はないのですが、 Instr("aaa12_a.sql","index") <-----となる場合も値がとれてしまうので どうしたものかと困っています。 うまく検索させる方法はないでしょうか? ちなみに検索する文字列には aaa数字.sql aaa数字_a.sql aaa数字_b.sql というパターンがあります。 どなたかよきアドバイスをいただけませんでしょうか? よろしくお願い致します。

  • ファイルへ書込み

    こんにちわ。 ■質問1 ファイルへの書込み(書替え)をどうやってやればいいか悩んでいます。 既に存在する aaa.txt という名前のファイルがあるとします。 aaa.txtをファイルオープンし、ある文字列をキーに検索し、 値を書替えたいのです。 以下の例の様にaaa.txtに、書かれているとします。 例)aaa.txtファイルの中身 LOOP_CNT1=50 LOOP_CNT2=100 LOOP_CNT3=200 LOOP_CNT4=300 LOOP_CNT5=400 "LOOP_CNT3"という文字列をキーに、ファイルから対象文字列を検索し、設定値の 200 を 10000 に書き換えたいのです。 書き換える値、10000 はパラメータから取得します。 書き換えれる場合、それ以降の文字列の値が 上書かれてしまったり、領域を壊してしまったりはしないでしょうか? いい方法があったら教えてください! ■質問2 新規でオープンしたファイルに、 DBからループ処理で取得した値を書き込む処理を行うとします。 ※データは何件あるか分からず、なくなるまで処理します。 エラーが起きた場合のみ、ファイル書込み処理を行っていても 最終的には何も書かれていない0バイトファイルを作成したいのですが どのようにやればいいでしょうか? ※一時的にテンポラリ領域に、格納してエラーがなかった場合のみ ファイルへ書込む場合、テンポラリはどのような持ち方をすれいいで しょうか? テンポラリ用にchar型の変数を用意? データが何件あるか分からないので、 変数のサイズはどのように宣言すればいいですか? そもそも考え方が間違っていますか?

  • Access 任意の文字を含むレコードを検索したい

    すべてのレコードを表示する帳票形式のフォームのヘッダーに、非連結のテキストボックスにキーワードを入力して検索するコマンドボタンを設定し、検索対象のレコードを表示させたいと思っています。 特定のコントロールソースでの検索はできたのですが、すべてのコントロールソースの中から検索する方法がわかりません。 ご存じの方がいらっしゃったらお教えください。 【特定のコントロールソースでの検索でやったこと】 非連結のテキストボックスを作り、コマンドボタンのイベントプロシージャで次のように記述しました。 Private Sub cmd_検索_Click() Me.Filter = "[非連結のテキストボックスの名前] Like " & " '*" & Me.特定のコントロースソースの名前 & "*'" Me.FilterOn = True End Sub Filterを使った上記の方法は、Accessの本を参考にしました。 本では特定のコントロースソースについての検索だったので、そのまま使わせてもらったのですが、Visual Basicを勉強していないのでそれ以上のことは私には難しいです。この程度の私ですが、できる方法があれば教えてください。 よろしくお願いします。

  • 2つのファイルを用いた文字列置換(削除)の方法

    こんにちは。 テキストファイルA.txtに、検索したい文字列を1行ずつ入れておき、別のテキストファイルB.txtのうち、A.txtにある文字が含まれている行を削除するという作業をしたいです。 例えば A.txt AAA BBB B.txt hoge hogeAAAhoge hogeBhoge hogeBBBhoge の場合、 hoge hogeBhoge を出力させたいです。 このような処理ができる方法はないでしょうか?(コマンドやプログラム等)

  • ACCESSで複数検索をしたいのですが・・・

    T_1・・・テーブル  No.、得意先名、商品名、売上日、備考 Q_1・・・クエリ  「T_1」を元に作成 「Q_1」からなる「F_1」というフォームのヘッダーに [Txt得意先名]、[Txt商品名]、[Txt売上日]という3つのテキストボックスと、 検索ボタン[Cmd検索]を配置し、1~3つの条件を入力して検索する フォームを作りたいと考えています。 そこで、http://okwave.jp/qa/q2029954.html にあるコードを使い、 下記のコードを書いてみました。 ================= Private Sub Cmd検索_Click() Dim MyCriteria As String MyCriteria = "売上日 ="  If IsNull(Txt売上日) Then   MyCriteria = MyCriteria & True  ElseIf Not IsNull(Txt売上日) Then   MyCriteria = MyCriteria & "#" & Me!Txt売上日 & "#"  Else  End If strfilter = MyCriteria strfilter = strfilter & " And 得意先名 Like '*" & Me.Txt得意先名.Value & "*' And 商品名 Like '*" & Me.Txt商品名.Value & "*'" Filter = strfilter FilterOn = True Me.Requery End Sub ================= ただ、上記のコードでは、[Txt売上日]を空欄で検索した場合、 仮に「T_1」で売上日が未入力だった時にそのデータは検索してくれません。 自分でもいろいろ調べて試したのですが、なかなかうまくいかず・・・。 ご存知の方、教えていただけませんでしょうか? よろしくお願いいたします。

  • 文字列検索

    文字列検索 テキストファイルの検索を行いたいです. 下記のようなサンプルファイルでfooを検索し, 含まれるならマッチした個数,含まれないならnilを返す関数を作りたいです. mecabを用いて形態素解析を1行ずつしようかと思ったんですが, 大量のファイルを処理する予定なので,オーバヘッドが気になります. 関数でgrepがあるみたいですが,マッチした行しか返されません. 標準関数で1行ずつよみこんで,1行のなかでマッチした回数を返す関数はありますか? --sample.txt-- foo foo bar bar foo hoge,hoge,hoge,hoge hage-hage-hage-foo -- end --

    • ベストアンサー
    • Ruby
  • Access VBAで、数字だけをチェックする方法。

    Access VBAで、数字だけをチェックする方法。 お世話になっております。 Access2002 VBAで、テキストボックスに入力された内容が、 数字(整数のみ)だけかをチェックしたいのです。 しかし、IsNumeric使用すると、 例> IsNumeric("1000,")=True IsNumeric("1000.")=True IsNumeric("1000+")=True となってしまいますし、 Valを使用すると、0(ゼロ)のチェックが出来ません。 ちょっと思いつかないので、 If txt_Word.Value <> Trim(Str(Val(txt_Word.Value)))) Then 'エラー処理 End If とか、 ループで回し、1文字ずつIsNumericするか・・・とか、馬鹿なことを思ってしまっています。 ちなみに、当テキストボックスは、パターンによって文字も許容したりするので、 書式設定で数字のみ入力は出来ません。 何か、本当に数字のみかをチェックするよい方法はありますか? よろしくお願いいたします。