Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5651 / 13645 ツリー ←次へ | 前へ→

【49605】ファイルの検索について 多摩川 07/6/12(火) 19:19 質問[未読]
【49610】Re:ファイルの検索について ウッシ 07/6/13(水) 10:07 発言[未読]
【49649】Re:ファイルの検索について 多摩川 07/6/14(木) 17:48 お礼[未読]
【49615】Re:ファイルの検索について Jaka 07/6/13(水) 14:46 発言[未読]
【49651】Re:ファイルの検索について 多摩川 07/6/14(木) 17:53 お礼[未読]
【49623】Re:ファイルの検索について 多摩川 07/6/13(水) 20:56 発言[未読]

【49605】ファイルの検索について
質問  多摩川  - 07/6/12(火) 19:19 -

引用なし
パスワード
   皆さま,こんにちは。

ある特定のファイル名(例えば「aaa.prn」)が Thisworkbook のフォルダ内(サブフォルダは含まない)に存在する場合は,そのファイルを Open ステートメントで開き,無い場合は GetOpenFilename メソッドで選択してから開くようにすることを目標に,過去ログを参考に以下のようなマクロを作成しました。

Sub FileOpen()
'-------------------------------------------------------------------------
  Dim searchFile As String
  Dim InputFile As String
  Dim fileCounter As Long
'-------------------------------------------------------------------------
  fileCounter = 0
  InputFile = "aaa.prn"
  searchFile = Dir(Thisworkbook.Path & "\" & InputFile)
'-------------------------------------------------------------------------
  If searchFile <> "" Then
    fileCounter = 1
  End If
'-------------------------------------------------------------------------
  Do While searchFile <> ""
    searchFile = Dir
    If searchFile <> "" Then
      fileCounter = fileCounter + 1
    End If
  Loop
'-------------------------------------------------------------------------
  If fileCounter = 1 Then
    Open InputFile For Input Access Read As #2
  Else
    InputFile = Application.GetOpenFilename _
          (Title:="ファイル開く", _
           FileFilter:="全てのファイル(*.*),*")
    If InputFile = "False" Then Exit Sub
    Open InputFile For Input Access Read As #2
  End If
'-------------------------------------------------------------------------
  'Call ステートメントに続きます
  MsgBox InputFile & "は" & .FoundFiles.Count & "個あります" 
  '今回は例としてこれで
'-------------------------------------------------------------------------
  Close
End Sub

上記のコードで思い通りの動作をしてくれるため,全く問題ないのですが,ファイルの検索としては,FileSearch オブジェクトを使うことが一般的だと思い, FileSearch オブジェクトにて表してみようと思い,次のようなコードを作成しました。

Sub FileOpen2()
'-------------------------------------------------------------------------
  Dim searchFile As String
  Dim InputFile As String
  Dim fileCounter As Long
'-------------------------------------------------------------------------
  With Application.FileSearch
    .NewSearch
    .LookIn = Thisworkbook.Path
    .SearchSubFolders = False
    .FileName = "aaa.prn"
    .MatchTextExactly = True
    If .Execute() > 0 Then
      Open InputFile For Input Access Read As #2
    Else
      InputFile = Application.GetOpenFilename _
            (Title:="ファイル開く", _
             FileFilter:="全てのファイル(*.*),*")
      If InputFile = "False" Then Exit Sub
      Open InputFile For Input Access Read As #2
    End If
  End With
'-------------------------------------------------------------------------
  'Call ステートメントに続きます
  MsgBox InputFile & "は" & .FoundFiles.Count & "個あります" 
  '今回は例としてこれで
'-------------------------------------------------------------------------
  Close
End Sub

例えば,同フォルダ内には "aaa1.prn","c1_aaa.prn","aaa_1.prn" があり "aaa.prn" が無い場合,FileOpen の方は0個を返すのですが,FileOpen2 のほうは「ファイルが見つかりません」とエラーとなってしまいます。
(3個ファイルが見つかった状態となってしまいます)
ヘルプからMatchTextExactly プロパティが原因と思ったのですが,False にしても変わりありませんでした。
現状では FileOpen の方法で問題なくマクロを作動させているのですが,疑問が残ったままにしておくのも嫌なので,FileSearch オブジェクトにおいて,ファイル名の完全一致を制御する方法を教えていただけないでしょうか?

よろしくお願いします。

【49610】Re:ファイルの検索について
発言  ウッシ  - 07/6/13(水) 10:07 -

引用なし
パスワード
   こんにちは

完全一致したファイルだけ処理するなら、Sub FileOpen()でいいと思います。

FileSearch自体が検索ワードがファイル名の一部にヒットするものを全て検索し処理する
という用途に使用するのもなので、その質問は疑問に思ってはいけないのかも?

それでもと言うのでしたら、.FoundFiles をループしてDirでファイル名を取得して
「InputFile = "aaa.prn"」に一致したファイルをオープンするようにしてはどうでしょうか?

【49615】Re:ファイルの検索について
発言  Jaka  - 07/6/13(水) 14:46 -

引用なし
パスワード
   >Sub FileOpen2()
>'-------------------------------------------------------------------------
>  Dim searchFile As String
>  Dim InputFile As String
>  Dim fileCounter As Long
>'-------------------------------------------------------------------------
>  With Application.FileSearch
>    .NewSearch
>    .LookIn = Thisworkbook.Path
>    .SearchSubFolders = False
>    .FileName = "aaa.prn"
>    .MatchTextExactly = True
>    If .Execute() > 0 Then
>      Open InputFile For Input Access Read As #2
          ↑
         InputFileの中身が不明。
>    Else
>      InputFile = Application.GetOpenFilename _
>            (Title:="ファイル開く", _
>             FileFilter:="全てのファイル(*.*),*")
>      If InputFile = "False" Then Exit Sub
>      Open InputFile For Input Access Read As #2
>    End If
>  End With
>'----
>  'Call ステートメントに続きます
>  MsgBox InputFile & "は" & .FoundFiles.Count & "個あります"
                 ↑
               何のために「.」が、ついているのか不明。
               こんな場所でいいのかな?
>  '今回は例としてこれで
    例として出すとろくな結果が返ってこない方が多いです。
    まともなコードを提示してない方が多い、ろくなデータを提示してない方が多いので....   
>'-----
>  Close
>End Sub

【49623】Re:ファイルの検索について
発言  多摩川  - 07/6/13(水) 20:56 -

引用なし
パスワード
   ウッシ さん,Jakaさん

レス,ありがとうございます。
当方,ちょっと仕事が急に入り,しばらくレスの内容をじっくり確認できない状況です。後日,改て・・・

取り急ぎお礼まで

【49649】Re:ファイルの検索について
お礼  多摩川  - 07/6/14(木) 17:48 -

引用なし
パスワード
   ウッシ さん,こんにちは。

>FileSearch自体が検索ワードがファイル名の一部にヒットするものを全て検索し処理する
>という用途に使用するもの
はじめて知りました! お恥ずかしい限りです。
Windows自体の検索機能では完全一致ができたので VBA においてもできると思い, FileName プロパティの定義の方法にひょっとしたらコツがあるのでは?と思い質問してみたのですが,完全一致は無理なようですね。
ただ,FileSearch の本来?の用途を学べたことで質問した甲斐がありました。

>.FoundFiles をループしてDirでファイル名を取得して>「InputFile = "aaa.prn"」に一致したファイルをオープン
FileOpen をそのまま利用しようと思ったのですが,アドバイスいただいた↑方法で作ってみました。(動作確認はしました)
こちらの方がスッキリしているのでこちらを利用していきたいと思いますます。

Sub FileOpen3()
'------------------------------------------------------
  Dim InputFile As String
  Dim fileCounter As Long
  Dim i As Long
'------------------------------------------------------
  fileCounter = 0
  InputFile = "aaa.prn"
  With Application.FileSearch
    .NewSearch
    .LookIn = ThisWorkbook.Path
    .SearchSubFolders = False
    .Filename = InputFile
    .MatchTextExactly = True
    If .Execute() > 0 Then
      For i = 1 To .FoundFiles.Count
        If InputFile = Dir(.FoundFiles(i)) Then
          fileCounter = fileCounter + 1
          Exit For
        End If
      Next i
    End If
    MsgBox InputFile & "は" & fileCounter & "個あります"
  End With
End Sub


返事が遅くなりましたが,大変ありがとうございました。

【49651】Re:ファイルの検索について
お礼  多摩川  - 07/6/14(木) 17:53 -

引用なし
パスワード
   こんにちは。
End With の記述場所がおかしかったようですね。失礼しました。
下記のようにすべきでした。

Sub FileOpen2()
'-------------------------------------------------------------------------
  Dim InputFile As String
'-------------------------------------------------------------------------
  InputFile = "aaa.prn"
  With Application.FileSearch
    .NewSearch
    .LookIn = ThisWorkbook.Path
    .SearchSubFolders = False
    .Filename = InputFile
    .MatchTextExactly = True
    .Execute
'↓以下も個数を返すうえでは必要ないですね
'    If .Execute() > 0 Then
'      Open InputFile For Input Access Read As #2
'    Else
'      InputFile = Application.GetOpenFilename _
'            (Title:="ファイル開く", _
'             FileFilter:="全てのファイル(*.*),*")
'      If InputFile = "False" Then Exit Sub
'      Open InputFile For Input Access Read As #2
'    End If
'↑

'  End With 'ここではなかったですね (^^;
'-------------------------------------------------------------------------
    'Call ステートメントに続きます
    MsgBox InputFile & "は" & .FoundFiles.Count & "個あります"
    '今回は例としてこれで
'-------------------------------------------------------------------------
  End With 'こっちの誤りでした
  Close
End Sub


作成しているマクロ自体 FileOpen の方法で既に出来上がっており,こちらのコードでファイル検索の意図が伝わると思い込んでいました。
検索数で完全一致したかどうかを確認する材料として例をあげたのですが,いけない質問の仕方だったのですかね?
(実はXXXなんですが,と質問を発展させる気は全く無かったのですが・・・)
コードを省略して掲載するのはボリュームの問題等もあり致し方ないことだと思っているのですが,質問するのも難しいものですね!
VBAの勉強以外に他の方の質問の仕方についても気にしながら,今後もこちらのサイトを利用していきたいと思います。
今後ともよろしくご教示願います。

5651 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free