Excel VBA質問箱 IV

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

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


3914 / 13644 ツリー ←次へ | 前へ→

【59135】「or条件」でファイルを探すためには? サイトー 08/11/30(日) 2:37 質問[未読]
【59136】Re:「or条件」でファイルを探すためには? Hirofumi 08/11/30(日) 8:22 回答[未読]
【59137】Re:「or条件」でファイルを探すためには? Hirofumi 08/11/30(日) 8:41 回答[未読]
【59139】Re:「or条件」でファイルを探すためには? サイトー 08/11/30(日) 14:04 質問[未読]
【59140】Re:「or条件」でファイルを探すためには? かみちゃん 08/11/30(日) 14:42 発言[未読]
【59143】Re:「or条件」でファイルを探すためには? サイトー 08/11/30(日) 15:06 発言[未読]
【59144】Re:「or条件」でファイルを探すためには? かみちゃん 08/11/30(日) 15:54 発言[未読]
【59147】Re:「or条件」でファイルを探すためには? サイトー 08/11/30(日) 16:31 お礼[未読]
【59146】Re:「or条件」でファイルを探すためには? Hirofumi 08/11/30(日) 16:28 発言[未読]
【59148】Re:「or条件」でファイルを探すためには? サイトー 08/11/30(日) 16:33 お礼[未読]
【59149】Re:「or条件」でファイルを探すためには? kanabun 08/11/30(日) 18:11 発言[未読]
【59486】報告_動作不良はエクセルVerによるもの サイトー 08/12/13(土) 0:46 発言[未読]

【59135】「or条件」でファイルを探すためには?
質問  サイトー  - 08/11/30(日) 2:37 -

引用なし
パスワード
    .Filename = Trim(Cells(2, 2).Value)でB2にある文字列のファイルを、
B1のフォルダから探し出す様になっています。
特定の文字列を含むファイルを探す場合はワイルドカードを使えば問題ないのですが、
時々必要になる「or条件」で探す方法が思いつきません。
例えば、100個のファイルがあるフォルダから、
「A」or「B」or「C」の文字列を含むファイルを検索するような場合です。
「時々」であれば、「A」→「B」→「C」で3回検索すれば良いのですが、
処理の短縮のために対応策を考えている次第です。

参考情報でも構いませんので、ご意見を伺えれば幸甚です。

  Dim vntF As Variant
  Dim objFS As FileSearch
  Dim objFSO As FileSystemObject
  Dim dteDate As Date
  Dim GYO As Long
  Dim cntFound As Long
  Set objFS = Application.FileSearch
  Set objFSO = New FileSystemObject
  Rows("5:65536").ClearContents
  GYO = 4
  With objFS
    .NewSearch
    .LookIn = Trim(Cells(1, 2).Value)
    .Filename = Trim(Cells(2, 2).Value)
    dteDate = DateAdd("m", Cells(3, 2).Value * -1, Date)
    .SearchSubFolders = True
    If .Execute() <> 0 Then
      For Each vntF In .FoundFiles
        With objFSO.GetFile(vntF)
          If .DateLastModified >= dteDate Then
            GYO = GYO + 1
            Cells(GYO, 1).Value = .Name
            Cells(GYO, 2).Value = .DateLastModified
            Cells(GYO, 3).Value = _
              Left(.Path, Len(.Path) - Len(.Name) - 1)
            cntFound = cntFound + 1
          End If
        End With
      Next vntF
    End If
  End With

【59136】Re:「or条件」でファイルを探すためには?
回答  Hirofumi  - 08/11/30(日) 8:22 -

引用なし
パスワード
   B2に入れる抽出条件をカンマ区切りで複数入れて
それをSplitで分割し、Loopでそれを回したら

Option Explicit

Public Sub Test()

  Dim vntF As Variant
  Dim objFS As FileSearch
  Dim objFSO As FileSystemObject
  Dim dteDate As Date
  Dim GYO As Long
  Dim cntFound As Long
  
  Dim i As Long
  Dim vntPath As Variant
  Dim vntFileNames As Variant
  
  dteDate = DateAdd("m", Cells(3, 2).Value * -1, Date)
  vntPath = Trim(Cells(1, 2).Value)
  vntFileNames = Trim(Cells(2, 2).Value)
  
  Rows("5:65536").ClearContents
  
  If vntFileNames = "" Then
    GoTo Wayout
  End If
  vntFileNames = Split(vntFileNames, ",")
  
  Set objFS = Application.FileSearch
  Set objFSO = New FileSystemObject
  
  GYO = 4
  With objFS
    For i = 0 To UBound(vntFileNames)
      .NewSearch
      .LookIn = vntPath
      .Filename = vntFileNames(i)
      .SearchSubFolders = True
      If .Execute() <> 0 Then
        For Each vntF In .FoundFiles
          With objFSO.GetFile(vntF)
            If .DateLastModified >= dteDate Then
              GYO = GYO + 1
              Cells(GYO, 1).Value = .Name
              Cells(GYO, 2).Value = .DateLastModified
              Cells(GYO, 3).Value = _
                  Left(.Path, Len(.Path) - Len(.Name) - 1)
              cntFound = cntFound + 1
            End If
          End With
        Next vntF
      End If
    Next i
  End With

Wayout:

  Set objFS = Nothing
  Set objFSO = Nothing

End Sub

【59137】Re:「or条件」でファイルを探すためには?
回答  Hirofumi  - 08/11/30(日) 8:41 -

引用なし
パスワード
   もう少し丁寧にするなら
抽出条件が複数に成るので、重複したファイル名を抽出しない様に

Option Explicit

Public Sub Test2()

  Dim vntF As Variant
  Dim objFS As FileSearch
  Dim objFSO As FileSystemObject
  Dim dteDate As Date
  Dim GYO As Long
  Dim cntFound As Long
  
  Dim i As Long
  Dim vntPath As Variant
  Dim vntFileNames As Variant
  Dim strList As String
  
  dteDate = DateAdd("m", Cells(3, 2).Value * -1, Date)
  vntPath = Trim(Cells(1, 2).Value)
  vntFileNames = Trim(Cells(2, 2).Value)
  
  Rows("5:65536").ClearContents
  
  If vntFileNames = "" Then
    GoTo Wayout
  End If
  vntFileNames = Split(vntFileNames, ",")
  
  Set objFS = Application.FileSearch
  Set objFSO = New FileSystemObject
  
  GYO = 4
  With objFS
    strList = vbTab
    For i = 0 To UBound(vntFileNames)
      .NewSearch
      .LookIn = vntPath
      .Filename = vntFileNames(i)
      .SearchSubFolders = True
      If .Execute() <> 0 Then
        For Each vntF In .FoundFiles
          With objFSO.GetFile(vntF)
            If .DateLastModified >= dteDate Then
              'ファイル名が重複しなければ
              If InStr(1, strList, vbTab & .Name & vbTab, vbTextCompare) = 0 Then
                GYO = GYO + 1
                Cells(GYO, 1).Value = .Name
                Cells(GYO, 2).Value = .DateLastModified
                Cells(GYO, 3).Value = _
                    Left(.Path, Len(.Path) - Len(.Name) - 1)
                strList = strList & .Name & vbTab
              End If
              cntFound = cntFound + 1
            End If
          End With
        Next vntF
      End If
    Next i
  End With

Wayout:

  Set objFS = Nothing
  Set objFSO = Nothing

End Sub

【59139】Re:「or条件」でファイルを探すためには?
質問  サイトー  - 08/11/30(日) 14:04 -

引用なし
パスワード
   ご返答を有難うございます。
勉強させて頂きました。

重複名が抽出されないCode方で検討を重ねたいと思います。

ところで、基本的で恐縮ですが、今、手元にあるパソコンで、
ご返答頂いた2つのCodeを含む3つのCodeを使ってみたのですが、
拡張子が.docのファイルしか検索対象としない様です。

今は手元にないのですが、もう一つのパソコンでは、
.doc以外の.pdfや.txtも対象となっています。

今更の話ですが、Excellのバージョンも同じ200ですし、
先程から理由が思い浮かびません。

併せて、ご意見を伺えればと思います。

【59140】Re:「or条件」でファイルを探すためには?
発言  かみちゃん E-MAIL  - 08/11/30(日) 14:42 -

引用なし
パスワード
   こんにちは。かみちゃん です。

横から失礼します。

> 拡張子が.docのファイルしか検索対象としない様です。

Hirofumiさんからのコメントがあると思いますが、
B3セルの値は、何を入れていますか?
たとえば、2 を入力してある場合、
DateLastModified が、マクロを実行するパソコンのシステム日付より2ヶ月前以降
のファイルを抽出しますが、そういう条件はあっているのでしょうか?
B1セルに設定したパス配下に、.doc 以外にその条件に一致するファイルがあるのでしょうか?

> 今更の話ですが、Excellのバージョンも同じ200ですし、

詳しいことはわかりませんが、OSのバージョンやサービスパックの適用の有無も
同じでしょうか?

また、まったく関係ないと思いますが、エクスプローラの「ツール」−「フォルダオプション」の
「表示」タブの「登録されている拡張子は表示しない」は統一されていますか?

【59143】Re:「or条件」でファイルを探すためには?
発言  サイトー  - 08/11/30(日) 15:06 -

引用なし
パスワード
   お返事、有難うございます。

更新日時の設定も問題ないようです。

例えば、検索値として「03」を検索した場合、
「003.doc」は表示されるのですが、
「003.doc」をファイル名の変更で「003.pdf」とすると、
表示されないのです。

「登録されている拡張子は表示しない」は、
どちらもチェックを入れていません。

どうやら、Office系の拡張子「.ppt」「.xls」「.doc」等は、
表示対象になるようです。
ただ、「*.*」ですと全表示されるんですよ・・・。

もうちょっとCodeを含め検討し続けてみます。
進展がありましたら報告いたします。

【59144】Re:「or条件」でファイルを探すためには?
発言  かみちゃん E-MAIL  - 08/11/30(日) 15:54 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>どうやら、Office系の拡張子「.ppt」「.xls」「.doc」等は、
>表示対象になるようです。
>ただ、「*.*」ですと全表示されるんですよ・・・。

私の手元の環境は、Excel2002 SP3 なので、その事象は確認されないのですが、
以下の★印の行を追加するといかがでしょうか?

      .Filename = vntFileNames(i)
      .FileType = msoFileTypeAllFiles '★
      .SearchSubFolders = True

Excel2000 で
Application.FileSearch

FileTypeプロパティを省略すると、
msoFileTypeOfficeFiles
が指定されたことになるのでしょうか?
ちょっとこのあたりは、よくわかりません。

【59146】Re:「or条件」でファイルを探すためには?
発言  Hirofumi  - 08/11/30(日) 16:28 -

引用なし
パスワード
   「FileSearch オブジェクト」の「FileType プロパティ」が関係しているのかも知れませんね?
Helpでは
「既定値は msoFileTypeOfficeFiles です。」
と成っていますので
以下を入れて見たらどうですか?

    strList = vbTab
    For i = 0 To UBound(vntFileNames)
      .NewSearch
      .LookIn = vntPath
      .FileType = msoFileTypeAllFiles '★
      .Filename = vntFileNames(i)
      .SearchSubFolders = True
      If .Execute() <> 0 Then

【59147】Re:「or条件」でファイルを探すためには?
お礼  サイトー  - 08/11/30(日) 16:31 -

引用なし
パスワード
   .FileType = msoFileTypeAllFiles
を追加したら問題なく検索できました。

さっぱり理由が分かりませんが、
明日、もう一つのパソコンの状況を検分してみようと思います。

Hirofumiさん
かみちゃんさん

ご丁寧に有難うございました。

【59148】Re:「or条件」でファイルを探すためには?
お礼  サイトー  - 08/11/30(日) 16:33 -

引用なし
パスワード
   ▼Hirofumi さん:

msoFileTypeAllFiles
を入れたら問題なく動作しました。

↑でも書いていますが、
明日、もう一つのパソコンを検分したいと思っています。

ご丁寧に有難うございました。

【59149】Re:「or条件」でファイルを探すためには?
発言  kanabun  - 08/11/30(日) 18:11 -

引用なし
パスワード
   ▼サイトー さん:
横から失礼。

> 「A」or「B」or「C」の文字列を含むファイルを検索するような場合です。

> 参考情報
ですが、

>    .Filename = Trim(Cells(2, 2).Value)
を、
    .Filename = "A*.*;B*.*;C*.*"

としてみる方法はお試し済みですか?

【59486】報告_動作不良はエクセルVerによるもの
発言  サイトー  - 08/12/13(土) 0:46 -

引用なし
パスワード
   手元にないパソコン(msoFileTypeAllFiles無しで動作)はExcell2000(SP3)で、
手元にあるパソコン(msoFileTypeAllFiles有りで動作)はExcell2000でした。

SPが有る無しで変わるんですね・・・。
勉強になりました。

遅れましたが、ご報告までに。

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