Arrays 为什么不能存储我的数组?
我在vba中有这段代码,试图用从文本文件提取的数据填充动态数组,但给我显示了一个错误 “下标超出范围” 我确实尝试使用非零基数组来实现这一点,但我收到了相同的错误 模块VBAArrays 为什么不能存储我的数组?,arrays,excel,vba,udf,Arrays,Excel,Vba,Udf,我在vba中有这段代码,试图用从文本文件提取的数据填充动态数组,但给我显示了一个错误 “下标超出范围” 我确实尝试使用非零基数组来实现这一点,但我收到了相同的错误 模块VBA option explicit Sub FromFileToExcel() Dim Delimiter As String Dim TextFile As Integer Dim validRow As Integer validRow = 0 Dim x As Integer Dim i As Integer Dim F
option explicit
Sub FromFileToExcel()
Dim Delimiter As String
Dim TextFile As Integer
Dim validRow As Integer
validRow = 0
Dim x As Integer
Dim i As Integer
Dim FilePath As String
Dim FileContent As String
Dim LineArray() As String
Dim DataArray() As String
FilePath = "C:\Users\Jlopez25\Desktop\bertha\INVPLANT.prn"
TextFile = FreeFile
Open FilePath For Input As TextFile
FileContent = Input(LOF(TextFile), TextFile)
Close TextFile
LineArray() = Split(FileContent, vbCrLf)
For x = LBound(LineArray) To UBound(LineArray)
If validateData(LineArray(x)) Then
ReDim Preserve DataArray(validRow, 3) 'here occours the mistake
DataArray(validRow, 1) = Left(LineArray(i), 8)
DataArray(validRow, 2) = Mid(LineArray(i), 9, 7)
DataArray(validRow, 3) = Mid(LineArray(i), 18, 2)
validRow = validRow + 1
End If
Next x
Range("a1").Resize(UBound(DataArray, 1), UBound(DataArray, 2)).Value = DataArray()
End Sub
UDF
Public Function validateData(Data As String) As Boolean
If InStr(1, Left(Data, 8), ":", vbTextCompare) = 0 And _
Len(Replace(Left(Data, 8), " ", "", , , vbTextCompare)) > 7 And _
Left(Data, 1) <> "_" Then
validateData = True
Else
validateData = False
End If
End Function
ReDim-Preserve-DataArray(validRow,3)”这里有个错误
这是因为您不能通过更改数组的第一个维度而仅更改最后一个维度来保留数组。您可能需要编写自己的自定义函数来实现此特殊的Redim
但是从您的代码中,我可以看出,可以在第一个循环中计算数组的大小,然后在另一个循环中进行工作。虽然速度很慢(取决于validateData
函数的复杂性),但很容易实现。考虑这一点:
Dim arSize as Integer
For x = LBound(LineArray) To UBound(LineArray)
If validateData(LineArray(x)) Then arsize = arSize + 1
Next
ReDim DataArray(arSize, 1 to 3) 'dimension the array
'And now do the calculation loop
For x = LBound(LineArray) To UBound(LineArray)
If validateData(LineArray(x)) Then
DataArray(validRow, 1) = Left(LineArray(i), 8)
DataArray(validRow, 2) = Mid(LineArray(i), 9, 7)
DataArray(validRow, 3) = Mid(LineArray(i), 18, 2)
validRow = validRow + 1
End If
如果您调整DataArray的大小以匹配输入文件的大小,那么您实际上不需要一直调整它的大小。它的一部分是空的可能并不重要
Option Explicit
Sub FromFileToExcel()
Dim Delimiter As String
Dim validRow As Integer
validRow = 0
Dim x As Integer
Dim i As Integer
Dim FilePath As String
Dim LineArray() As String
Dim DataArray() As String
FilePath = "C:\Users\Jlopez25\Desktop\bertha\INVPLANT.prn"
LineArray() = Split(FileContent(FilePath), vbCrLf)
ReDim DataArray(1 To UBound(LineArray) + 1, 1 To 3)
For x = LBound(LineArray) To UBound(LineArray)
If validateData(LineArray(x)) Then
validRow = validRow + 1
DataArray(validRow, 1) = Left(LineArray(i), 8)
DataArray(validRow, 2) = Mid(LineArray(i), 9, 7)
DataArray(validRow, 3) = Mid(LineArray(i), 18, 2)
End If
Next x
Range("a1").Resize(UBound(DataArray, 1), UBound(DataArray, 2)).Value = DataArray()
End Sub
Public Function validateData(Data As String) As Boolean
If InStr(1, Left(Data, 8), ":", vbTextCompare) = 0 And _
Len(Replace(Left(Data, 8), " ", "", , , vbTextCompare)) > 7 And _
Left(Data, 1) <> "_" Then
validateData = True
Else
validateData = False
End If
End Function
Function FileContent(sPath As String) As String
Dim TextFile As Integer
TextFile = FreeFile
Open FilePath For Input As TextFile
FileContent = Input(LOF(TextFile), TextFile)
Close TextFile
End Function
选项显式
Sub-FromFileToExcel()
作为字符串的分隔符
Dim validRow作为整数
validRow=0
作为整数的Dim x
作为整数的Dim i
将文件路径设置为字符串
Dim LineArray()作为字符串
Dim DataArray()作为字符串
FilePath=“C:\Users\Jlopez25\Desktop\bertha\INVPLANT.prn”
LineArray()=拆分(文件内容(文件路径),vbCrLf)
ReDim数据阵列(1到UBound(线性阵列)+1,1到3)
对于x=LBound(LineArray)到UBound(LineArray)
如果验证数据(线性阵列(x)),则
validRow=validRow+1
数据数组(validRow,1)=左(LineArray(i),8)
数据数组(validRow,2)=中间(LineArray(i),9,7)
数据数组(validRow,3)=中间(LineArray(i),18,2)
如果结束
下一个x
范围(“a1”)。调整大小(UBound(DataArray,1),UBound(DataArray,2))。值=DataArray()
端接头
公共函数validateData(数据为字符串)为布尔值
如果InStr(1,左(数据,8),“:”,vbTextCompare)=0和_
Len(替换(左侧(数据,8),“”,“”,“”,vbTextCompare))>7和_
左(数据,1)“u”然后
validateData=True
其他的
validateData=False
如果结束
端函数
函数FileContent(sPath作为字符串)作为字符串
将文本文件设置为整数
TextFile=FreeFile
以文本文件的形式打开输入的文件路径
FileContent=输入(LOF(TextFile),TextFile)
关闭文本文件
端函数
只能使用Redim Preserve更改数组的最后一个维度。A.S.H:/“使用Preserve调整大小是正确的。如果使用Preserve,则只能调整数组的最后一个维度的大小。对于其他每个维度,必须指定现有数组的边界。”根据MSDN,。不管怎样,你的回答是对的,jeje,谢谢你,我将在UDF工作一年this@JoeJoe您可以设想先计算数组的维数,然后立即重新计算它,然后再进行计算。如果您的应用程序不是时间关键型的,尽管这很慢,但它应该可以工作,而且是一个简单而快速的解决方案。在我编辑的答案中尝试;)
Option Explicit
Sub FromFileToExcel()
Dim Delimiter As String
Dim validRow As Integer
validRow = 0
Dim x As Integer
Dim i As Integer
Dim FilePath As String
Dim LineArray() As String
Dim DataArray() As String
FilePath = "C:\Users\Jlopez25\Desktop\bertha\INVPLANT.prn"
LineArray() = Split(FileContent(FilePath), vbCrLf)
ReDim DataArray(1 To UBound(LineArray) + 1, 1 To 3)
For x = LBound(LineArray) To UBound(LineArray)
If validateData(LineArray(x)) Then
validRow = validRow + 1
DataArray(validRow, 1) = Left(LineArray(i), 8)
DataArray(validRow, 2) = Mid(LineArray(i), 9, 7)
DataArray(validRow, 3) = Mid(LineArray(i), 18, 2)
End If
Next x
Range("a1").Resize(UBound(DataArray, 1), UBound(DataArray, 2)).Value = DataArray()
End Sub
Public Function validateData(Data As String) As Boolean
If InStr(1, Left(Data, 8), ":", vbTextCompare) = 0 And _
Len(Replace(Left(Data, 8), " ", "", , , vbTextCompare)) > 7 And _
Left(Data, 1) <> "_" Then
validateData = True
Else
validateData = False
End If
End Function
Function FileContent(sPath As String) As String
Dim TextFile As Integer
TextFile = FreeFile
Open FilePath For Input As TextFile
FileContent = Input(LOF(TextFile), TextFile)
Close TextFile
End Function