如果满足条件,则继续到下一个空单元格

时间:2018-09-23 23:52:56

标签: vba for-loop if-statement conditional-statements

我在第一行中有一张表,上面有物品名称。

enter image description here

我正在使用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的列索引相对应。

4 个答案:

答案 0 :(得分:1)

我会避免使用GoTo Continue。进入循环之前,只需检查语句的否定项即可。您在问题和解决方案中都还缺少一些End If语句。

我留下了注释,显示了如果ItemDir为空,代码将跳至何处。结果相同,只是代码更简洁。

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)

我知道了。这就是我现在正在使用的。

MyNode

这是结果:

Result

请随时提出其他建议。

答案 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