Как вы можете выполнить цикл по столбцу и убедиться, что все связанные строки учтены по порядку

#excel #vba #loops

#excel #vba #циклы

Вопрос:

Я пытаюсь выполнить поиск в столбце C для конкретной строки из массива и распечатать все связанные данные в этой строке. Однако мне нужно, чтобы вся информация, содержащая соответствующие столбцы C и D, печаталась под одним и тем же заголовком. Я не могу понять, как обеспечить, чтобы все данные печатались по порядку под правильными заголовками без повторения данных. Мой код для этого конкретного раздела приведен ниже.

Пример моих входных данных выглядит так:

Пример таблицы данных

В идеале, это должно быть напечатано следующим образом:

Хорошие данные

Вместо этого это выглядит так:

Неверные данные

Имейте в виду, что это будет работать следующим образом: проверьте столбец C на наличие информации, хранящейся в массиве, когда что-то найдено, проверьте столбец D. Затем просмотрите весь лист в поисках других экземпляров данных, которые имеют одинаковые столбцы C и D, и распечатайте эти данные с заголовком. Вернитесь к началу листа и найдите соответствующий столбец C с другим столбцом D, распечатайте эти данные и продолжите для всего массива.

Я не знаю, как это сделать, не имея соответствующей информации столбца D под другим заголовком или бесконечно печатая позицию массива 0.

 'Check the array for each ICAO and begin writing unit taskings
For Each chkString In iCAOArray
    Set rng = ActiveWorkbook.Worksheets("Admin Data").Range("C5:C1000")
    rng.Find(chkString).Select
    conICAO = ActiveCell
    startAddress = ActiveCell.Address
    ActiveCell.Offset(0, -2).Select
    conCallsign = ActiveCell
    ActiveCell.Offset(0, 1).Select
    conAC = ActiveCell
    ActiveCell.Offset(0, 2).Select
    conUnit = ActiveCell
    ActiveCell.Offset(0, -1).Select
    rng.FindNext(ActiveCell).Select

        Print #1, ("SVCTASK/" amp; letterArray(arrayCheck) amp; "//")
        Print #1, ("TASKUNIT/" amp; conUnit amp; "/ICAO:" amp; conICAO amp; "//")
        arrayCheck = arrayCheck   1
    
    While ActiveCell.Address <> startAddress
    conICAOCurrent = ActiveCell
    ActiveCell.Offset(0, -2).Select
    conCallsignCurrent = ActiveCell
    ActiveCell.Offset(0, 1).Select
    conACCurrent = ActiveCell
    ActiveCell.Offset(0, 2).Select
    conUnitCurrent = ActiveCell
    ActiveCell.Offset(0, -1).Select
    
    'Moves to next unit tasking
    If conUnitCurrent = conUnit Then
        Print #1, ("Units are same")
    Else
        Print #1, ("SVCTASK/" amp; letterArray(arrayCheck) amp; "//")
        Print #1, ("TASKUNIT/" amp; conUnitCurrent amp; "/ICAO:" amp; conICAO amp; "//")
        arrayCheck = arrayCheck   1
        conUnit = conUnitCurrent
    End If
    rng.FindNext(ActiveCell).Select
    Wend
    
Next chkString
  

Комментарии:

1. В чем проблема с вашим кодом? Вы получаете сообщение об ошибке? Если да, то в чем ошибка и в какой строке? Если нет, то в чем собственно проблема? Также было бы полезно просмотреть ваш лист или образец листа

2. @Zac Мой код работает так, как написано, однако он не достигает желаемого конечного состояния. Я не могу понять, как форматировать в комментариях, поэтому смотрите Мой исходный пост для моего листа и желаемого результата.