Перейти к следующей пустой ячейке, если выполняется условие - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть лист с именами предметов в первом ряду.

enter image description here

Я использую петлю For для прохождения через ячейки в строке 1 - i.Я использую содержимое значения каждой ячейки, чтобы импортировать столбец из файла .CSV в соответствующей ячейке под ним в строке 2, используя для этого j.Тем не менее, у меня есть некоторые файлы .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 голосов
/ 27 сентября 2018

Решение 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
0 голосов
/ 24 сентября 2018

Я бы не стал использовать 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
0 голосов
/ 27 сентября 2018

Решение 2: Вложенный Do Loop

Избегание команды «Продолжить», так как она не является командой 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.

Два условия также могут быть представлены как:

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 Оператор

0 голосов
/ 24 сентября 2018

Я понял это.Это то, что я сейчас использую.

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

Continue:

Next

И вот результат:

Result

Пожалуйста, не стесняйтесьлюбые другие предложения.

...