У нас есть рабочая книга, в которой данные из завершенных счетов-фактур копируются в столбец 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


Код проверяет ячейки в столбце 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, он помещает правильную информацию в столбец B Листа 1, но она все еще выходит за пределы последней строки данных в столбце C. Тем не менее, это все равно здорово, потому что вы научили меня направлению, в котором мне нужно изучить и изучить. на «Делай пока». Я очень благодарен вам за ваше терпение с новым учеником, и особенно за ваше время - Скотт.
Спасибо @taller, ты точно понял, что я хотел сказать, что мне нужно было сделать. К сожалению, код повторил эту ошибку. Ошибка времени выполнения «1004»: сбой метода «Range» объекта «_worksheet». При отладке выделена эта строка «Do While Len(desWS.Range("C" & x)) > 0"