Я работаю над другим проектом Excel и на этот раз впервые погрузился в макросы VBA. У меня были базовые знания по VB, но прошло уже более десяти лет с тех пор, как я использовал этот язык, поэтому я довольно растерялся.

В любом случае, у меня есть следующая функция, которую я использую для добавления строки в другую таблицу. Это работает безупречно, но меня не устраивает то, как не элегантно это выглядит:

Sub setRecord()
    If [K2].Value <> "" Then
        appendToRecord "RecordsTable", [E2:K2].Value
    End If
    If [K3].Value <> "" Then
        appendToRecord "RecordsTable", [E3:K3].Value
    End If
    If [K4].Value <> "" Then
        appendToRecord "RecordsTable", [E4:K4].Value
    End If
    If [K5].Value <> "" Then
        appendToRecord "RecordsTable", [E5:K5].Value
    End If
    If [K6].Value <> "" Then
        appendToRecord "RecordsTable", [E6:K6].Value
    End If
End Sub

Я уверен, что я не единственный, кто чувствует то же самое ...

У меня есть фиксированное количество строк прямо сейчас. Однако это может измениться в будущем, и я хотел бы, чтобы мой код был готов к этому без необходимости добавлять или удалять оператор IF.

По сути, я проверяю определенную ячейку в строке, если она пуста, и, если это не так, я запускаю другую функцию, чтобы добавить значения в этой строке в новую строку в таблице.

Итак, мой вопрос заключается в том, есть ли способ циклически проходить через ряд строк, например цикл For или ForEach, при этом проверяя значение в определенном столбце, чтобы я мог сделать этот фрагмент кода более коротким / более эффективным в VBA? Любые указатели будут высоко оценены. Я использую Office 365, кстати.

2 ответа2

1

Конструкция VBA FOR выглядит следующим образом:

FOR counter = start TO end [Step increment]
 {...statements...}
NEXT [counter];

пример использования:

Dim myCount As Integer
For myCount = 1 to 5
  MsgBox (myCount)
Next myCount

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

а) проверьте активную ячейку, затем

б) используйте функцию VBA OFFSET, чтобы перейти к следующей ячейке в диапазоне.

0

Вот решение, которое я придумал:

Dim RecordRange As ListObject
Set RecordRange = Worksheets("Set Record").ListObjects("NewRecord")

For i = 1 To RecordRange.DataBodyRange.Rows.Count
    If RecordRange.DataBodyRange.Cells(i, RecordRange.ListColumns("N").Index) <> "" Then
        appendToRecord "RecordsTable", RecordRange.DataBodyRange.Rows(i)
    End If
Next i

Я попытался использовать ресурсы в ответе, который дал @mcalex, но я не смог заставить его работать - хотя это в основном из-за моего недостатка опыта. К счастью, я нашел несколько статей о VBA и таблицах, которые помогли мне найти ответ для себя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .