2017-06-08 29 views
0

テキストファイルからExcelにデータを読み込む際に問題があります。 テキストファイルには約23万行あり、各行は正確に130文字です。私の目標は、ファイルをExcelに読み込み、必要なデータを取得しようとしている特定のデータを各行から取得することです。VBAはテキストファイルからExcelに大きなデータを読み込みます

まず、次のコードを使用しましたが、約7分かかります。時間がかかりすぎるので、私は他の方法を探して、私は次のようなものを見た

Sub leerTXT() 
Dim strArchivo As String 'ruta del archivo 
Dim intResultado As Integer 'resultado del dialogo 


'---------- RUTA DEL ARCHIVO ---------- 
'Abrir dialog y preparar 
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False 
intResultado = Application.FileDialog(msoFileDialogOpen).Show 

'sólo si hay resultado positivo abrir fichero y leer 
If intResultado <> 0 Then 
    strArchivo = Application.FileDialog(msoFileDialogOpen).SelectedItems(1) 
    On Error GoTo lblError: 

Dim strFila As String 'filas que se van a leer 
Dim iFila As Long 'numero de fila en la que se esta en el fichero 
Dim jFila As Long 'numero de fila en el excel 
'posicionarse en la fila 1 
iFila = 1 
jFila = 1 

    'abrir el archivo 
    Open strArchivo For Input As #1 
    'loop mientras no se ha llegado al final del archivo 
    Do Until EOF(1) 

     If iFila Mod 70 > 17 Then 
      'leer la fila actual 
      Line Input #1, strFila 

      'leer la linea y copiar a celda 
      Cells(jFila, 1) = strFila 

      jFila = jFila + 1 
     End If 

     'incrementar iFila en uno y pasar a la siguiente fila 
     iFila = iFila + 1 

    'loopear mientras condicion 
    Loop 

End If 

'cerrar el archivo 
Close #1 

lblError: 
If Err.Number <> 0 Then 
MsgBox (Err.Number) 
MsgBox (Err.Description) 
Err.Clear 
'cerrar el archivo 
Close #1 
End If 

End Sub 

しかし、私が言ったように、:

Dim FSO As Object, MyFile As Object 
Dim FileName As String, Arr As Variant 
Dim f As Long 

FileName = textfilename 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set MyFile = FSO.OpenTextFile(FileName, 1) 
Arr = Split(MyFile.ReadAll, vbNewLine) ' Arr is zero-based array 

Dim BigGuy(0 To UBound(Arr, 1), 1 To 1) As Long 

Dim I As Long 
For I = 0 To UBound(Arr) 
    BigGuy(I, 1) = I 
Next 
'For test 
'Fill column A from this Array Arr 
    'UBound(Arr) + 1 Application.Transpose(
Range("A1:A500") = BigGuy 

手がかりはそれを配列して貼り付け範囲を使用することであるようですより速くすることができますが、ファイルが転置するには長すぎるため、手動で転位する必要がありますが、UBound(Arr)が機能せず、データのインポート方法がわかりません。

そして、すべての行の長さがまったく同じであるため、ファイルから特定の文字を(正確な位置に)検索する方法はありますか?

+0

だけリマインダーにテキストの一部を抽出します。 –

+0

管理者注:まだコメントを残すことはできません。正直なところ、VBAとExcelを使って大きなテキストファイルを処理することには大したことはありません。私は経験から話す。 Visual Studio Community 2017(無料)をダウンロードし、VBAと非常に似た構文を持つVB.NETで大きなテキストファイルを処理する方法を学ぶことをお勧めします。あなたは弦楽器メーカーや他の多くのものを使っていくらかの深刻なスピードを得ることができます。 –

答えて

0

何か等:

Dim BigGuy() 
Dim numLines As Long 
Arr = Split(MyFile.ReadAll, vbNewLine) ' Arr is zero-based array 

numLines = UBound(Arr) + 1 

ReDim BigGuy(1 To numLines, 1 To 1) 


Dim I As Long 
For I = 0 To numLines-1 
    BigGuy(I+1, 1) = Arr(I) 
Next 

Range("A1").Resize(numLines, 1) = BigGuy 
+0

ありがとう、それはまだ動作しません。それは、 "定数式が必要です"というメッセージとともに、 "Dim BigGuy(1 to numLines、1 To 1)"行で停止します。 –

+0

テストしないと悪いです - 上記の編集済みのバージョンを参照してください –

+0

私は何かが分かっていることを知った。ありがとう。約6秒かかり、完璧に仕上げます。 –

0

アレイサイズは65個の536の要素(整数、16ビットの数である)に制限されます。実際には符号付きの数値なので32767にしかなりません。

第1の方法と32767要素のチャンクでファイルを読み取る第2の方法を組み合わせて、配列で入力することができます。このような

何か:

Option Explicit 
Public Sub test() 
Dim strFila As String 
Dim i As Integer, j As Long 
Dim rng As String 

    Dim BigGuy(1 To 32767, 1 To 1) 
    i = 1 
    j = 1 
    Open "c:\temp\data.txt" For Input As #1 
    Do Until EOF(1) 
     Line Input #1, strFila 
     BigGuy(i, 1) = strFila 
     i = i + 1 
     If i = 32767 Then 
      rng = "A" & j & ":A" & j + i - 1 
      Range(rng) = BigGuy 
      j = j + 32766 
      i = 1 
     End If 
    Loop 

    If i > 1 Then 
     rng = "A" & j & ":A" & j + i - 2 
     Range(rng) = BigGuy 
    End If 
    Close #1 

End Sub 

パフォーマンス - 私の駅の周りに3秒。冒頭で `Application.ScreenUpdating = false`をを追加すると、時には大幅にマクロをスピードアップすることができます。

はよく知られている位置利用 mid$()

関連する問題