Excel VBA質問箱 IV

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

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


2375 / 13646 ツリー ←次へ | 前へ→

【68395】複数のCSVファイルの総行数を集計する際に時間がかかる ひよっこ 11/3/2(水) 17:32 質問[未読]
【68396】Re:複数のCSVファイルの総行数を集計する際... SK63 11/3/2(水) 19:06 発言[未読]
【68402】Re:複数のCSVファイルの総行数を集計する際... ひよっこ 11/3/3(木) 9:57 お礼[未読]
【68406】Re:複数のCSVファイルの総行数を集計する際... ひよっこ 11/3/3(木) 10:13 発言[未読]
【68400】Re:複数のCSVファイルの総行数を集計する際... kanabun 11/3/2(水) 21:25 発言[未読]
【68404】Re:複数のCSVファイルの総行数を集計する際... ひよっこ 11/3/3(木) 10:02 お礼[未読]
【68408】Re:複数のCSVファイルの総行数を集計する際... kanabun 11/3/3(木) 11:33 発言[未読]
【68411】Re:複数のCSVファイルの総行数を集計する際... ひよっこ 11/3/3(木) 13:17 お礼[未読]
【68413】Re:複数のCSVファイルの総行数を集計する際... Yuki 11/3/3(木) 14:12 発言[未読]
【68420】Re:複数のCSVファイルの総行数を集計する際... ひよっこ 11/3/3(木) 17:32 お礼[未読]
【68403】Re:複数のCSVファイルの総行数を集計する際... Jaka 11/3/3(木) 9:57 発言[未読]
【68405】Re:複数のCSVファイルの総行数を集計する際... ひよっこ 11/3/3(木) 10:11 お礼[未読]

【68395】複数のCSVファイルの総行数を集計する際...
質問  ひよっこ  - 11/3/2(水) 17:32 -

引用なし
パスワード
   お世話になります。
社会人1年目のひよっこです。
PGとして入社しましたが現在は別の職種で勤務しております。

現在VBAでCSVファイルを読み込んで検索するツールを作成中です。
中でもプログレスバーを作成していることについて質問です。

ネットで検索し、CSVファイルを書き込みモードで読み込み、.Lineを取得することにより
素早くファイルの行数を取得できるロジックを参考にさせていただきながらコードを書いています。
処理自体はエラー無く走るのですが、どうしてもプログレスバーが表示されるまでに時間がかかってしまうのです。
デバックで処理を1行ずつ進めて確認した所、以下のコードの★マーク箇所で時間がかかるようです。


  'プログレスバー進捗用処理
  'ファイルの総行数格納用変数
  Dim gCnt As Long
  
  '複数ファイルの場合には、ファイルの数分ループさせ、全ファイルの行数を取得する
  For fcount = 1 To UBound(UserForm1.FileName)
    
    Dim FSO As Object, TargetFile As String
    TargetFile = UserForm1.FileName(fcount)
      
      'ファイルの存在確認(存在しなければ処理を中断する)
      If Dir(UserForm1.FileName(fcount)) = "" Or TargetFile = "False" Then
      
        MsgBox TargetFile & vbCrLf & "を取得できませんでした。" _
        & vbCrLf & "ファイルを確認して下さい", vbCritical, "ファイル取得失敗"
        Unload Me
        Exit Sub
      End If
      
      'ファイルを書き込みモードで読み込む
      Set FSO = CreateObject("Scripting.FileSystemObject")
        With FSO.OpenTextFile(TargetFile, 8)
          '複数ファイルがある場合、ファイルの総行数を集計する
          gCnt = gCnt + Line ★
          .Close
        End With

      Set FSO = Nothing
  
  Next
  
  '総行数をプログレスバーのMaxに格納
  ProgressBar.Max = gCnt

読み込むファイルのサイズは平均的に5・6Mと考えていただいて構いません。
ファイル要因でしょうか?それともコードの書き方がおかしいのでしょうか?
くだらない質問で申し訳ないのですが、よろしくお願い致します。

【68396】Re:複数のCSVファイルの総行数を集計する...
発言  SK63  - 11/3/2(水) 19:06 -

引用なし
パスワード
   ▼ひよっこ さん:

下の部分を動作させても Line 'にはNothingですが、、??
う〜ん  難しいですね。


 'ファイルを書き込みモードで読み込む
      Set FSO = CreateObject("Scripting.FileSystemObject")
        With FSO.OpenTextFile(TargetFile, 8)
          '複数ファイルがある場合、ファイルの総行数を集計する
          gCnt = gCnt + Line ★
          .Close
        End With

      Set FSO = Nothing

【68400】Re:複数のCSVファイルの総行数を集計する...
発言  kanabun  - 11/3/2(水) 21:25 -

引用なし
パスワード
   ▼ひよっこ さん:

よこからスミマセンm(_ _)m

>        With FSO.OpenTextFile(TargetFile, 8)
>          '複数ファイルがある場合、ファイルの総行数を集計する
>          gCnt = gCnt + Line ★
>          .Close
>        End With
ここのところは
        With FSO.OpenTextFile(TargetFile, 8)
          '複数ファイルがある場合、ファイルの総行数を集計する
          gCnt = gCnt + .Line - 1 ★
          .Close
        End With
ではないでしょうか?


>読み込むファイルのサイズは平均的に5・6Mと
5・6Mものファイルだったら時間はそれ相応にかかると思いますよ。

あと、
For〜Nextループの中で 何度も
>  Set FSO = CreateObject("Scripting.FileSystemObject")
     … … …
>  Set FSO = Nothing

やっていますが、その必要はないので、
Loopの外に出せば 若干効率よくなると思います。

【68402】Re:複数のCSVファイルの総行数を集計する...
お礼  ひよっこ  - 11/3/3(木) 9:57 -

引用なし
パスワード
   ▼SK63 さん:
>▼ひよっこ さん:
>
>下の部分を動作させても Line 'にはNothingですが、、??
>う〜ん  難しいですね。
>
>
> 'ファイルを書き込みモードで読み込む
>      Set FSO = CreateObject("Scripting.FileSystemObject")
>        With FSO.OpenTextFile(TargetFile, 8)
>          '複数ファイルがある場合、ファイルの総行数を集計する
>          gCnt = gCnt + Line ★
>          .Close
>        End With
>
>      Set FSO = Nothing

Lineではなく、.Lineだとファイルの総行数を取得できるかと思います。
With使ってるので><
やはり処理速度にはファイルの容量がかかわっているようです;
.Lineで取得するのは早いのですが、集計する際に時間がかかってしまうので
どうしようもないのでしょうね;
ご回答ありがとうございました!わざわざ動かして頂いたことでとても親身になっていただいたようでうれしかったです!

【68403】Re:複数のCSVファイルの総行数を集計する...
発言  Jaka  - 11/3/3(木) 9:57 -

引用なし
パスワード
   おまけ

ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=79;id=FAQ

【68404】Re:複数のCSVファイルの総行数を集計する...
お礼  ひよっこ  - 11/3/3(木) 10:02 -

引用なし
パスワード
   ▼kanabun さん:
>▼ひよっこ さん:
>
>よこからスミマセンm(_ _)m
>
>>        With FSO.OpenTextFile(TargetFile, 8)
>>          '複数ファイルがある場合、ファイルの総行数を集計する
>>          gCnt = gCnt + Line ★
>>          .Close
>>        End With
>ここのところは
>        With FSO.OpenTextFile(TargetFile, 8)
>          '複数ファイルがある場合、ファイルの総行数を集計する
>          gCnt = gCnt + .Line - 1 ★
>          .Close
>        End With
>ではないでしょうか?

ああ・・・CSVは-1するのでした。最後の行の改行を忘れていました。
ご指摘ありがとうございます><


>>読み込むファイルのサイズは平均的に5・6Mと
>5・6Mものファイルだったら時間はそれ相応にかかると思いますよ。

やはりそうですよね・・・1Mのときもあれば9M以上のときもあります。
5〜6Mを複数ファイル分集計しているので我慢ということですね:

>あと、
>For〜Nextループの中で 何度も
>>  Set FSO = CreateObject("Scripting.FileSystemObject")
>     … … …
>>  Set FSO = Nothing
>
>やっていますが、その必要はないので、
>Loopの外に出せば 若干効率よくなると思います。

こちらもご指摘ありがとうございます。
ループの外に出しまして以下のコードとしました。

'プログレスバー進捗用処理
  '行数格納用変数
  Dim gCnt As Long
  Dim FSO As Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Dim TargetFile As String
  
  '複数ファイルの場合には、ファイル数分ループさせ、全ファイルの行数を取得する
  For fcount = 1 To UBound(UserForm1.FileName)

    TargetFile = UserForm1.FileName(fcount)
      
      'ファイルの存在確認(存在しなければ処理を中断する)
      If Dir(UserForm1.FileName(fcount)) = "" Or TargetFile = "False" Then
      
        MsgBox TargetFile & vbCrLf & "を取得できませんでした。" _
        & vbCrLf & "ファイルを確認して下さい", vbCritical, "ファイル取得失敗"
        Unload Me
        Unload UserForm1
        Exit Sub
      End If
      
      'ファイルを書き込みモードで読み込む
        With FSO.OpenTextFile(TargetFile, 8)
          gCnt = gCnt + .Line - 1
          .Close
        End With
  Next
  
  ProgressBar1.Max = gCnt
  Set FSO = Nothing

しばらくはこのコードでいこうと思います。アドバイスありがとうございました!

【68405】Re:複数のCSVファイルの総行数を集計する...
お礼  ひよっこ  - 11/3/3(木) 10:11 -

引用なし
パスワード
   ▼Jaka さん:
>おまけ
>
>ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=79;id=FAQ

ありがとうございます!参考にさせていただきます^^!

【68406】Re:複数のCSVファイルの総行数を集計する...
発言  ひよっこ  - 11/3/3(木) 10:13 -

引用なし
パスワード
   ▼ひよっこ さん:
>▼SK63 さん:
>>▼ひよっこ さん:
>>
>>下の部分を動作させても Line 'にはNothingですが、、??
>>う〜ん  難しいですね。
>>
>>
>> 'ファイルを書き込みモードで読み込む
>>      Set FSO = CreateObject("Scripting.FileSystemObject")
>>        With FSO.OpenTextFile(TargetFile, 8)
>>          '複数ファイルがある場合、ファイルの総行数を集計する
>>          gCnt = gCnt + Line ★
>>          .Close
>>        End With
>>
>>      Set FSO = Nothing
>
>Lineではなく、.Lineだとファイルの総行数を取得できるかと思います。
>With使ってるので><
>やはり処理速度にはファイルの容量がかかわっているようです;
>.Lineで取得するのは早いのですが、集計する際に時間がかかってしまうので
>どうしようもないのでしょうね;
>ご回答ありがとうございました!わざわざ動かして頂いたことでとても親身になっていただいたようでうれしかったです!

今確認すると、質問文がLineになってました・・・.どこいったんだろう・・・
すみません、Line→.Lineに読み替えてください;

【68408】Re:複数のCSVファイルの総行数を集計する...
発言  kanabun  - 11/3/3(木) 11:33 -

引用なし
パスワード
   ▼ひよっこ さん:

>▼kanabun さん:
>>ここのところは
>>        With FSO.OpenTextFile(TargetFile, 8)
>>          '複数ファイルがある場合、ファイルの総行数を集計する
>>          gCnt = gCnt + .Line - 1 ★
>>          .Close
>>        End With
>>ではないでしょうか?
>
>ああ・・・CSVは-1するのでした。最後の行の改行を忘れていました。
>ご指摘ありがとうございます><

ちょっとちがいます
追加モード Append Modeでテキストファイルを開いたので、
.Line で、【これから書き込む行番号】を取得しているわけです。
ですから、「すでに書き込まれている行数」は (.Line - 1) と
なるわけです。

【68411】Re:複数のCSVファイルの総行数を集計する...
お礼  ひよっこ  - 11/3/3(木) 13:17 -

引用なし
パスワード
   >ちょっとちがいます
>追加モード Append Modeでテキストファイルを開いたので、
>.Line で、【これから書き込む行番号】を取得しているわけです。
>ですから、「すでに書き込まれている行数」は (.Line - 1) と
>なるわけです。

CSVは-1すると記述してあったので他のファイルの場合はそのまま
だと思っていました・・・
丁寧な説明ありがとうございます!

【68413】Re:複数のCSVファイルの総行数を集計する...
発言  Yuki  - 11/3/3(木) 14:12 -

引用なし
パスワード
   ▼ひよっこ さん:
横から失礼します。
FSOを使っていらしゃいますので
折角ですから

If Dir(UserForm1.FileName(fcount)) = "" Or TargetFile = "False" Then

If Not (FSO.FileExists(TargetFile)) Then
でされても良いですね。
余分なことを申し上げて失礼しました。

【68420】Re:複数のCSVファイルの総行数を集計する...
お礼  ひよっこ  - 11/3/3(木) 17:32 -

引用なし
パスワード
   ▼Yuki さん:
>▼ひよっこ さん:
>横から失礼します。
>FSOを使っていらしゃいますので
>折角ですから
>
>If Dir(UserForm1.FileName(fcount)) = "" Or TargetFile = "False" Then
>を
>If Not (FSO.FileExists(TargetFile)) Then
>でされても良いですね。
>余分なことを申し上げて失礼しました。

コードにつけたしを行ってばかりだったのでぐだぐだだったのですが
これでコードがすっきりしました!
ありがとうございます^^!

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