2016-08-04 20 views
0

vba 1048576行の制限(1つの独立したシートに1048576行ごとに)で大きなサイズのtxtファイル(約300mbと1000万行)を分割しようとしています。私は、コードのこの部分を使用しています:オブジェクト 'ITextStream'のメソッド 'ReadAll'でエラーが発生しました。

Mytext= CreateObject("Scripting.FileSystemObject").OpenTextFile(filepath).ReadAll 

問題は一部のコンピュータでは、私はこのエラーを取得していますということです。

Run-Time error '-2147417848 (80010108)': 
Method 'ReadAll' of object 'ITextStream' failed 

私はこの問題を解決する方法を知りません。 アイデア

+0

内部エラーはRPC_E_DISCONNECTEDです - 呼び出されたオブジェクトはクライアントから切断されています。私はそれがファイルのサイズと関係があると推測しています。なぜ地球上で一度に1000万行を読む必要がありますか?残りのコードでは何をしていますか? – Comintern

+0

エクセルはこの種の義務を果たしていません。各シートに2^20の行数があっても、それらのすべてを実際に使用することはできません。より良い方法は、ファイルをAccessテーブルに読み込むことです。 – Rosetta

+1

テキストファイルの文字セットとは何ですか? 'Scripting.FileSystemObject'が' TextStream'として正しく処理できない文字シーケンスがいくつかあります。 'ADODB.Stream'、' SAPI.spFileStream'、または 'MSXML2.XMLHttp'を使って、ファイルの内容を' Scripting.FileSystemObject'ではなくバイナリデータとして読み込みます。注意 'spFileStream'は、コンテンツをチャンク単位でロードし、メモリ使用量を減らすことを可能にします。 – omegastripes

答えて

0

注意すべき点がいくつかあり: -

  • シングル回で300メガバイトのファイルを読んでいる大きな、私はそれは私の経験では
  • を失敗驚いそれが今まで働いていた場合驚いているといない、頼みます80-90 MBを超えるExcelファイルは、絶対に必要な場合を除き、結果をワークブック(Excelファイル)に分割し、シート(単一のワークブック内のワークシート)に分割することをお勧めします。

これは煩雑ですが、一度に1行ずつ行う必要があります。以下は、テキストファイルを開き、X個の行を別のワークブックに読み込む例です。

Public Sub Sample() 
Dim ObjFSO  As Object 
Dim ObjTS  As Object 
Dim AryData() As String 
Dim LngDataRow As Long 
Dim LngWkbkNo As Long 
Dim WkBk  As Workbook 
Dim WkSht  As Worksheet 

'This dictates how many rows should be in each workbook 
ReDim AryData(100000) 


'Open then file 
Set ObjFSO = CreateObject("Scripting.FileSystemObject") 
    Set ObjTS = ObjFSO.OpenTextFile(ThisWorkbook.Path & "\SampleFile.txt") 

     'Process each line 
     Do Until ObjTS.AtEndOfStream 

      'If we have filled up our array then we need to output it 
      If LngDataRow > UBound(AryData, 1) Then 
       LngWkbkNo = LngWkbkNo + 1 
       Set WkBk = Application.Workbooks.Add 
        Set WkSht = WkBk.Worksheets(1) 
         WkSht.Range("A1:A" & UBound(AryData, 1) + 1) = AryData 
        Set WkSht = Nothing 
        WkBk.SaveAs ThisWorkbook.Path & "\" & Right("000" & CStr(LngWkbkNo), 3) & ".xlsx" 
        WkBk.Close 0 
       Set WkBk = Nothing 

       'Reset the array and go back to the start 
       ReDim AryData(UBound(AryData, 1)) 
       LngDataRow = 0 
      End If 

      'Add a line from the file into the array 
      AryData(LngDataRow) = ObjTS.ReadLine 
      LngDataRow = LngDataRow + 1 
      DoEvents 
     Loop 
    Set ObjTS = Nothing 
Set ObjFSO = Nothing 

'Put the final lines into a file 
If AryData(0) <> "" Then 
    LngWkbkNo = LngWkbkNo + 1 
    Set WkBk = Application.Workbooks.Add 
     Set WkSht = WkBk.Worksheets(1) 
      WkSht.Range("A1:A" & UBound(AryData, 1) + 1) = AryData 
     Set WkSht = Nothing 
     WkBk.SaveAs ThisWorkbook.Path & "\" & Right("000" & CStr(LngWkbkNo), 3) & ".xlsx" 
     WkBk.Close 0 
    Set WkBk = Nothing 
End If 

MsgBox "Done" 

End Sub 
+1

私はGaryに同意しますが、代わりに[バッチファイルを使ってテキストファイルを分割する](http://stackoverflow.com/questions/23593556/batch-split-a-text-file)を使用します。 VBAを使用してファイルを処理するよりもはるかに高速ですが、必要に応じて[Wscript.Shellオブジェクト](http://stackoverflow.com/questions/37822050/cant-run-dir-from)からバッチファイルを呼び出すことができます。 -wscript-shell-in-vba)を実行し、出力を処理します。 – Tim

+0

またはあなたはそれに*中世の*を実際に得ることができ、[メモリマップとしてファイルを開く](http://stackoverflow.com/a/30249386/4088852)。 – Comintern

関連する問題