我需要一个文本文件,其中包含Excel中300万行的端口数据,每100万行的移植需要一个新的列表。告诉我代码有什么问题吗?
Sub ReadFile()
Dim I, J
I = 1
J = 1
File = "\\bla.bla.bla\Desktop\vsr.txt"
Open File For Input As #1
Do While Not EOF(1)
Line Input #1, MyString
Sheets("LIST" & J).Cells(I, 1) = MyString
If I = 1000000 Then
I = 1
J = J + 1
Else
I = I + 1
End If
Loop
Close #1
End Sub
答案 0 :(得分:2)
也许这样会更好。我无法测试它,因为您没有包含相同的数据,而且我不知道port data
是什么,但是它应该可以工作。
如果存在问题(或任何时候遇到代码问题),请尝试使用 F8 逐步遍历代码,以准确查明每一行的情况。 (有关Chip Pearson here的更多信息。)
Option Explicit
Sub ReadFile()
Const fName = "\\bla.bla.bla\Desktop\vsr.txt"
Dim rowNum As Long, shtNum As Long, myString As String
Open fName For Input As #1
shtNum = 1
Do While Not EOF(1)
rowNum = rowNum + 1
Line Input #1, myString
Sheets("LIST" & shtNum).Cells(rowNum, 1) = myString
If rowNum = 1000000 Then
shtNum = shtNum + 1
rowNum = 0
End If
Loop
Close #1
End Sub
'Option Explicit
来帮助查找未正确声明或处理的变量。 (即MyString
未声明)File
之类的常用词,因为它可能是也可能不是“保留词”(即Excel内置的常量或函数名)I
和J
(尤其是在发布代码以寻求他人帮助时)。几个额外的字符使代码更易于理解,以后可以修改/调试。shtNum
(或您的示例中的J
)的替代方法是使用Int(rowNum/1000000)+1
获取工作表编号。此公式返回1
代表0到999999,2
代表1000000到1999999,等等。答案 1 :(得分:1)
@ashleedawg已经编写了大多数重要内容,将鼠标悬停在代码上再进行更正。
现在,处理数据的方式意味着您在vsr.txt文件中查找行,然后将其复制到字符串中,最后将其写入单元格中。这会占用很多处理能力,并且会很慢(尤其是您访问单元格的那部分。将所有文本复制到数组中然后一次粘贴所有文本会更加有效。
WorksheetFunction.Transpose()
是必需的,因为excel中的数组使用Columns作为第一个维度。
每1万行插入代码可防止移调功能遇到问题。我假设由于它是WorksheetFunction代码的一部分,因此它可以在一些旧代码上进行中继,甚至可以通过特定方式以这种方式运行滞后代码(返回值的长度必须是长度为Integer的数组或其他内容)。
使用myWb
可以使Range修饰符完全合格,虽然不是必须的,但是可以为您省去很多麻烦。
使用GROUPSIZE,您可以一次调整要导入的Array-Block的大小,更大的数字可能会加快处理速度。
Option Explicit
Sub ReadFile()
Const GROUPSIZE As Long = 10000 'ENTRIESPERPAGE must be divisible by this without rest to fit exactly
Const ENTRIESPERPAGE As Long = 1000000
Const fName As String = "\\bla.bla.bla\Desktop\vsr.txt"
Dim rowNum As Long
Dim rowOffset As Long
Dim shtNum As Long
Dim myString(1 To GROUPSIZE) As String
Dim myWB As Workbook
Dim Range2Fill As String
Set myWB = ThisWorkbook
Open fName For Input As #1
shtNum = 1
rowNum = 0
rowOffset = 0
Do While Not EOF(1)
rowNum = rowNum + 1
Line Input #1, myString(rowNum)
If rowNum = GROUPSIZE Then
Range2Fill = "A" & rowOffset + 1 & ":A" & rowOffset + rowNum
myWB.Worksheets(shtNum).Range(Range2Fill) = WorksheetFunction.Transpose(myString)
Debug.Print "Sheet: " & shtNum, "Offset: " & rowOffset
If rowOffset >= ENTRIESPERPAGE - rowNum Then
rowOffset = 0
shtNum = shtNum + 1
Else
rowOffset = rowOffset + GROUPSIZE
End If
rowNum = 0
End If
Loop
'writes the last set of data in case there are not an exact multiple of 1M values
Range2Fill = "A" & rowOffset + 1 & ":A" & rowOffset + rowNum
myWB.Worksheets(shtNum).Range(Range2Fill) = WorksheetFunction.Transpose(myString)
Close #1
End Sub
其他说明: