Excel VBA質問箱 IV

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

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


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

【70317】FileSearchで苦労してます。 すいまーひろ 11/11/1(火) 14:24 質問[未読]
【70318】Re:FileSearchで苦労してます。 kanabun 11/11/1(火) 16:21 発言[未読]
【70321】Re:FileSearchで苦労してます。 kanabun 11/11/1(火) 17:00 発言[未読]
【70323】Re:FileSearchで苦労してます。 すいまーひろ 11/11/1(火) 18:23 お礼[未読]
【70326】Re:FileSearchで苦労してます。 kanabun 11/11/1(火) 21:20 発言[未読]
【70329】Re:FileSearchで苦労してます。 すいまーひろ 11/11/2(水) 9:50 お礼[未読]

【70317】FileSearchで苦労してます。
質問  すいまーひろ  - 11/11/1(火) 14:24 -

引用なし
パスワード
   パソコンを入れ替えたため、Excel2003→2010になって苦労してます。
フォルダにテキストファイルがあり、それを読み込んで、先頭データが検索条件に一致したものだけをシートにリストアップします。
今まではFileSearchを使用していましたが、2010では使えないので、

Private Sub CommandButton1_Click()
  Dim ws1 As Worksheet, i As Long, j As Long, zuban As Variant, myname As Variant
  Dim flag As Boolean, k As Long, flag0 As Boolean, path As Variant, fn As Variant
  Dim FSO As Object, Folder As Variant, File As Variant
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set ws1 = Worksheets(1)
  ws1.Range("A:C").ClearContents
  If ws1.Range("F2") = "" Or ws1.Range("E2") = "" Then Exit Sub
  ws1.Range("F3") = "検索中です。しばらくお待ち下さい。"
  k = 1
  path = "Y:\DB\流用図\F" & ws1.Range("E2")
  For Each File In FSO.GetFolder(path).Files
    flag = False: flag0 = False
    Open path & "\" & File.Name For Input As #1
      Line Input #1, zuban
      If EOF(1) = False Then
        Line Input #1, myname
      Else
        flag0 = True
      End If
    Close #1
    If flag0 = False Then
      If Len(myname) >= Len(ws1.Range("F2")) Then
        If myname = ws1.Range("F2") Then
          flag = True
        ElseIf Len(myname) > Len(ws1.Range("F2")) Then
          j = 1
          Do
            If Mid(myname, j, Len(ws1.Range("F2"))) = ws1.Range("F2") Then
              flag = True
            Else
              j = j + 1
            End If
          Loop Until flag = True Or Len(ws1.Range("F2")) + j - 1 > Len(myname)
        End If
        If flag = True Then
          ws1.Range("A" & k) = zuban
          ws1.Range("B" & k) = myname
          ws1.Range("C" & k) = Left(File.Name, Len(File.Name) - 4)
          ws1.Cells(k, 1).Select
          k = k + 1
        End If
      End If
    End If
  Next File
  ws1.Range("F3") = "3列目をダブルクリックすると、図面が見れます。"
End Sub

素人が作ったものなので醜くてすいません。
上記で動かすと、フォルダ内のファイルが少ないとうまく行くのですが、多いといつまで待っても動きません。
2003-FileSearchでやっていたときは、古い、とろくさいパソコンでも3分ほどで処理できてたのですが・・・。

なにかアドバイスがあれば、よろしくお願いいたします。

【70318】Re:FileSearchで苦労してます。
発言  kanabun  - 11/11/1(火) 16:21 -

引用なし
パスワード
   ▼すいまーひろ さん:こんにちは〜

>フォルダにテキストファイルがあり、それを読み込んで、先頭データが検索条件に一致したものだけをシートにリストアップします。
>今まではFileSearchを使用していましたが、2010では使えないので、

>上記で動かすと、フォルダ内のファイルが少ないとうまく行くのですが、多いといつまで待っても動きません。
>2003-FileSearchでやっていたときは、古い、とろくさいパソコンでも3分ほどで処理できてたのですが・・・。

アドバイスでなくて確認なんですが、
ファイルの検索を FileSearchから Fsoに代えたら、少なくとも3分で終わってた処理が
「いつまで待っても」終わらないことがあるようになった、ということですか?

プログラムの後半(Line Input# でOpenして2行読む部分)は
考え方として 変更なしですか?

後半の処理に大きな変更がないなら、前半の FileSearch の方法を変えたことが
処理が遅くなっている原因、という結論におのずと導かれるのですが、実は
FSOによる検索処理は、通常 FileSearchよりは高速に動作します。
(といっても Dir関数のLoopに比べれば、格段に遅いし、Dir関数よりも
 Dirコマンドのほうが速いですし、もちろんFind File系のAPIが最速ですが)

なので、遅くなった理由は FSO に切り替えたことより、
ひょっとして 後半の処理もなにか根本的なところを変更されていて
それが原因で、全体の動作が緩慢になっているとは考えられませんか?

後半の処理で、気になるところですが、
プロパティに何度もアクセスするのは遅くなる元です。プロパティで取得した
値は変数に格納して、それを使いまわししましょう。

具体的には
>   If Len(myname) >= Len(ws1.Range("F2")) Then

以降に出てくる 「ws1.Range("F2")」です。

ひょっとしたら、この部分の記述は

   If InStr(myname, ws1.Range("F2").Value) > 0 Then
   'もし myname に ws1.Range("F2").Value が含まれていたら

ですむとか?

【70321】Re:FileSearchで苦労してます。
発言  kanabun  - 11/11/1(火) 17:00 -

引用なし
パスワード
   >▼すいまーひろ さん

>ひょっとしたら、この部分の記述は
>
>   If InStr(myname, ws1.Range("F2").Value) > 0 Then
>   'もし myname に ws1.Range("F2").Value が含まれていたら
>
>ですむとか?
という疑問は、こういう風に書けないか?という疑問です。

(途中から)
  ws1.Range("F3") = "検索中です。しばらくお待ち下さい。"
  k = 1
  Path = "Y:\DB\流用図\F" & ws1.Range("E2")
  For Each File In FSO.GetFolder(Path).Files
    Open Path & "\" & File.Name For Input As #1
      Line Input #1, zuban   '1行目
      If Not EOF(1) Then
        Line Input #1, myname '2行目
        If InStr(myname, ws1.Range("F2").Value) > 0 Then
          ws1.Range("A" & k) = zuban
          ws1.Range("B" & k) = myname
          ws1.Range("C" & k) = Left(File.Name, Len(File.Name) - 4)
          ws1.Cells(k, 1).Select
          k = k + 1
        End If
      End If
    Close #1
  Next File
  ws1.Range("F3") = "3列目をダブルクリックすると、図面が見れます。"

【70323】Re:FileSearchで苦労してます。
お礼  すいまーひろ  - 11/11/1(火) 18:23 -

引用なし
パスワード
   早速のレスありがとうございます。
私、全くの独学で、恥ずかしながらInStrを知りませんでした。
これだけでもいい勉強になりました。

で、早速試しましたが、ファイルの量が比較的少ないフォルダで、多少速くなった程度で、FileSearchより遅い様に感じます。
引き続き、ご教授いただけたらと思います。

【70326】Re:FileSearchで苦労してます。
発言  kanabun  - 11/11/1(火) 21:20 -

引用なし
パスワード
   ▼すいまーひろ さん:

>私、全くの独学で、恥ずかしながらInStrを知りませんでした。
>これだけでもいい勉強になりました。
>
>で、早速試しましたが、ファイルの量が比較的少ないフォルダで、
> 多少速くなった程度で、FileSearchより遅い様に感じます。

で、こちらからの質問

> プログラムの後半(Line Input# でOpenして2行読む部分)は
> 考え方として 変更なしですか?

については、どうですか?

【70329】Re:FileSearchで苦労してます。
お礼  すいまーひろ  - 11/11/2(水) 9:50 -

引用なし
パスワード
   原因がわかりました。
YドライブはLAN(1000BASE)上の外付けHDですが、なぜか新パソコンは通信に時間がかかっているようです。
最初にCopyFolderでCドライブに複写したら、複写には多少時間がかかるものの、処理は一瞬で終わりました。

無知がゆえ皆様(特にkanabun様)にはご迷惑おかけしました。
ありがとうございますした。

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