Прекратить выполнение цикла при обнаружении первой пустой ячейки

У нас есть рабочая книга, в которой данные из завершенных счетов-фактур копируются в столбец C листа 1 каждый период.

Столбец A относится к году, а столбец B — к финансовому периоду (мы проводим 13 периодов в год).

Эта формула находится в столбце B листа 1. Он проверяет, есть ли что-нибудь в столбце C, и если да, отображает текущий период из ячейки на листе Sheet2.

=IF(C93<>"",Sheet2!$L$3,"")

Для этого необходимо, чтобы в ячейках была скопирована и повторно вставлена ​​информация о периоде как значения, прежде чем период сменится на следующий.

В этой последней версии на Листе 2 у нас есть таблица с 13 периодами в столбце Q, а столбец P указывает, закрыт ли этот период.

Я нашел код в Интернете и адаптировал его. Он находит первую пустую ячейку в столбце B листа 1, затем проверяет лист 2 и вставляет значение ячейки в столбце Q, рядом с которой есть пустая ячейка в столбце P.

Sub GetPeriod()
    Dim LastRow As Long, srcWS As Worksheet, desWS As Worksheet, x As Long
    x = Range("A2:A" & Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row
    Set srcWS = Sheets("Sheet2")
    Set desWS = Sheets("Sheet1")
    x = srcWS.Range("P2:P" & srcWS.Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row
    With desWS
        .Cells(.Rows.Count, "B").End(xlUp).Offset(1) = srcWS.Range("Q" & x)
    End With
End Sub

Это работает, однако я хочу, чтобы он зациклился, а затем остановился, когда он достигнет последних вставленных данных в столбце C листа 1.

Я попробовал Do While в строке 6, он не остановился на пустой ячейке в столбце C, а побежал вниз по листу, добавляя номер периода.

Sub GetPeriod()
    Dim LastRow As Long, srcWS As Worksheet, desWS As Worksheet, x As Long
    x = Range("A2:A" & Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row
    Set srcWS = Sheets("Sheet2")
    Set desWS = Sheets("Sheet1")
    Do While desWS.Range("C" & x) <> ""
    x = srcWS.Range("P2:P" & srcWS.Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row
    With desWS
        .Cells(.Rows.Count, "B").End(xlUp).Offset(1) = srcWS.Range("Q" & x)
    End With
    
    Loop
End Sub
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Код проверяет ячейки в столбце B, начиная с START_ROW. Если он находит непустую ячейку, он копирует соответствующую ячейку из столбца Q на лист1.

  • Если это не тот результат, который вы ожидали, отредактируйте свое сообщение, включив в него примеры данных и предоставив более подробную информацию о желаемом результате.

Sub GetPeriod()
    Dim LastRow As Long, srcWS As Worksheet, desWS As Worksheet, x As Long
    Const START_ROW = 2 ' the first data row# on Sheet2, modify as needed
    Set srcWS = Sheets("Sheet2")
    Set desWS = Sheets("Sheet1")
    x = START_ROW
    Do While Len(desWS.Range("C" & x)) > 0
        With desWS
            .Cells(.Rows.Count, "B").End(xlUp).Offset(1) = srcWS.Range("Q" & x)
        End With
        x = x + 1
    Loop
End Sub

Спасибо @taller, ты точно понял, что я хотел сказать, что мне нужно было сделать. К сожалению, код повторил эту ошибку. Ошибка времени выполнения «1004»: сбой метода «Range» объекта «_worksheet». При отладке выделена эта строка «Do While Len(desWS.Range("C" & x)) > 0"

Scott 20.06.2024 09:31

Я обновил код.

taller 20.06.2024 15:29

Еще раз спасибо @taller, он помещает правильную информацию в столбец B Листа 1, но она все еще выходит за пределы последней строки данных в столбце C. Тем не менее, это все равно здорово, потому что вы научили меня направлению, в котором мне нужно изучить и изучить. на «Делай пока». Я очень благодарен вам за ваше терпение с новым учеником, и особенно за ваше время - Скотт.

Scott 20.06.2024 16:34

Другие вопросы по теме