我在第一行中有一张表,上面有物品名称。
我正在使用For
循环通过第1行中的单元格-i
。
通过使用j
,我使用每个单元格的值内容从.CSV文件的第二行下方相应单元格中导入一列。
但是,我缺少一些.CSV文件,我需要移至第2行的下一个单元格,同时移至第1行的下一个单元格。基本上跳过一列。
到目前为止,我有:
Dim FSO As Object
Dim Folder As Object
Dim File As String
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder("C:\Users\Betty\AppData\Roaming\MetaQuotes\Terminal\B4D9BCD10BE9B5248AFCB2BE2411BA10\MQL4\Files")
For i = 2 To HCP.Cells(1, HCP.Columns.Count).End(xlToLeft).Column
Item = HCP.Cells(1, i).Value
FilePath = Folder & "\" & Item & "1440.CSV"
If Item = "" Or Dir(FilePath) = "" Then GoTo Continue
j = HCP.Cells(2, HCP.Columns.Count).End(xlToLeft).Column
With HCP.QueryTables.Add(Connection:="TEXT;" & FilePath, Destination:=HCP.Cells(2, j + 1))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(9, 9, 9, 9, 9, 1, 9, 9, 9, 9)
.Refresh BackgroundQuery:=False
End With
Continue:
Next
我需要j
的列索引始终与i
的列索引相对应。
答案 0 :(得分:1)
我会避免使用GoTo Continue
。进入循环之前,只需检查语句的否定项即可。您在问题和解决方案中都还缺少一些End If
语句。
我留下了注释,显示了如果Item
或Dir
为空,代码将跳至何处。结果相同,只是代码更简洁。
For i = 2 To HCP.Cells(1, HCP.Columns.Count).End(xlToLeft).Column
Item = HCP.Cells(1, i).Value
FilePath = Folder & "\" & Item & "1440.CSV"
If Item <> "" Or Dir(FilePath) <> "" Then 'Test Here
j = HCP.Cells(2, HCP.Columns.Count).End(xlToLeft).Column
If j <> i Then j = i
With HCP.QueryTables.Add(Connection:="TEXT;" & FilePath, Destination:=HCP.Cells(2, j))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(9, 9, 9, 9, 9, 1, 9, 9, 9, 9)
.Refresh BackgroundQuery:=False
End With
End If 'Skips to here if either are blank.
Next i
答案 1 :(得分:0)
答案 2 :(得分:0)
解决方案2:嵌套Do
循环
避免使用“ Continue”命令,因为它不是VBA命令。
For i = 2 To BS.Cells(1, BS.Columns.Count).End(xlToLeft).Column: Do
Item = BS.Cells(1, i).Value
FilePath = Folder & "\" & Item & "1440.CSV"
If Item = "" Or Dir(FilePath) = "" Then Exit Do
j = BS.Cells(2, BS.Columns.Count).End(xlToLeft).Column
If j <> i Then j = i
With BS.QueryTables.Add(Connection:="TEXT;" & FilePath, Destination:=BS.Cells(2, j))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(9, 9, 9, 9, 9, 1, 9, 9, 9, 9)
.Refresh BackgroundQuery:=False
End With
Loop While False: Next i
请注意: Do
末尾的For i
。
如果以下条件之一,即Item = ""
或Dir(FilePath) = ""
为False
,则退出Do
循环。如果声明了Loop While False: Next i
循环的Do
条件,则为true。
这两个条件也可以表示为:
For i = 2 To BS.Cells(1, BS.Columns.Count).End(xlToLeft).Column: Do
If Item <> "" Or Dir(FilePath) <> "" Then
'Do something...
Else: Exit Do
End If
Loop While True: Next i
由于Or
可能是If Item = "" Or Dir(FilePath) = "" Then Exit Do
,因此i
中必须有Value <> " "
条件,但是文件中的FilePath
可能不存在,即Dir(FilePath) = " "
,它会吐出我以前遇到的错误。
在这种情况下,If j <> i Then j = i
是强制性的,因为For i
被表示为=2 To
,这意味着循环从第2列开始。
可以通过将For i
循环声明为For i = 1 To
来避免这种情况。但是,这是完成工作的初始循环。
另外j
可以表示为j = BS.Cells(2, i)
,从而获得列索引的i
值。
不过,建议If j <> i Then j = i
语句是为了进一步保证目的。
在进一步的搜索中,出现了更多的解决方案。
请参见解决方案3:带有嵌套For
语句的嵌套If
循环
答案 3 :(得分:0)
解决方案3:嵌套For
语句的嵌套If
循环
For i = 1 To BS.Cells(1, BS.Columns.Count).End(xlToLeft).Column
For j = 1 To BS.Cells(2, BS.Columns.Count - 1).End(xlToLeft).Column
Item = BS.Cells(1, i).Value
FilePath = Folder & "\" & Item & "1440.CSV"
If ((Item <> "") Or (Dir(FilePath) <> "") And (i = j)) Then
With BS.QueryTables.Add(Connection:="TEXT;" & FilePath, Destination:=BS.Cells(2, j + 1))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(9, 9, 9, 9, 9, 1, 9, 9, 9, 9)
.Refresh BackgroundQuery:=False
End With
End If
Next j
Next i