大家好我是VBA编程的新手,但我已经使用Excel 2年了,我想构建一个程序,可以从每一行(pos 15)的特定位置提取一个String(30个pos长)并且将它放入我的工作表中的单元格中,听起来很简单,但我需要从包含22,157,838条记录的DAT存档中提取每一行的每一个字符串,我必须在列上放置1,048,575条记录,并将偏移量放到下一列的开头,I非常感谢任何帮助,这是我的代码:
<table>
谢谢:)
答案 0 :(得分:0)
...测试
Sub FirstMACR_ATV()
Const RECS_PER_COL As Long = 1000000
Dim myFile As String, arr(), i As Long
Dim textline As String, c As Range
ReDim arr(1 To RECS_PER_COL, 1 To 1)
Set c = ThisWorkbook.Sheets("destination").Range("A1")
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
i = i + 1
arr(i, 1) = Mid(textline, 15, 30)
'hit row limit?
If i = RECS_PER_COL Then
c.Resize(RECS_PER_COL, 1).Value = arr 'Dump data
ReDim arr(1 To RECS_PER_COL, 1 To 1)
i = 0
Set c = c.Offset(0, 1) 'move over one column
End If
Loop
Close #1
If i > 0 Then c.Resize(i, 1).Value = arr
End Sub
答案 1 :(得分:0)
我的答案就像蒂姆威廉姆斯的唯一不同(伟大的思想像我一样)。我添加了一条Application.StatusBar
消息,以缓解那些将要等待处理的穷人的想法。我也一次写下所有数据。
您可能想要试用MAX_ROWS_PER_COLUMN
。 100K可能表现优于1000k(对于日常使用,处理时间将大致相同)。无论如何,316 MB的Excel文件并不理想。我建议使用数据库。
Sub FirstMACR_ATV()
Dim t As Long: t = Timer
Const MAX_ROWS_PER_COLUMN AS Long = 1000000
Dim r As Long, c As Long
Dim myFile As String, textline As String
Dim results() As Variant
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
r = r + 1
If r > MAX_ROWS_PER_COLUMN Or c = 0 Then
c = c + 1
r = 1
ReDim Preserve results(1 To MAX_ROWS_PER_COLUMN, 1 To c)
End If
If r = 50000 Then Application.StatusBar = "Processing record #" & (r * c) & " " & Round(Timer - t, 2) & " Seconds"
results(r, c) = Mid(textline, 15, 30)
Loop
Close #1
Worksheets("Sheet1").Range("A1").Resize(UBound(results), UBound(results, 2)).Value = results
Debug.Print Round(Timer - t, 2)
End Sub