Здравствуйте, уважаемы формучане и знатоки Excel. Снова обращаюсь к вам за помощью. Кратко объясню.
Мне нужно чтобы макрос работал на специальных строках (12, 16, 20, 25, 29, 34, 39, 44, 48, 52, 56, 60) в колонке L . Он должен искать пустые ячейки и перемещать в них содержимое из специальных строк. НО! Если на первом листе закончились строчки с содержимым, а пустые строчки имеются, то макрос должен брать со следующих листов , содержимое по порядку, которое тоже находится в специальных строках (10, 14, 18, 23, 27, 32, 36, 42, 46, 50, 54, 58, 63, 67) колонки L.
Не знаю, поняли вы или нет. У меня уже есть готовый макрос, он перемещает содержимое со следующего листа, но на следующем листе, уже ничего не переносится. Пожалуйста, если сможете помочь, буду очень благодарен.
Код
Sub FillEmptyCells ()
Dim ws As Worksheet
Dim nextWs As Worksheet
Dim i As Long, j As Long
Dim rowsToCheck() As Variant
Dim rowsToPullFrom() As Variant
rowsToCheck = Array(12, 16, 20, 25, 30, 34, 39, 44, 48, 52, 56, 60)
If ActiveSheet.Index > ActiveSheet.Index Then
rowsToPullFrom = Array(10, 14, 18, 23, 27, 32, 36, 42, 46, 50, 54, 58, 63, 67)
Else
rowsToPullFrom = Array(10, 14, 18, 23, 27, 32, 36, 42, 46, 50, 54, 58, 63, 67)
End If
For Each ws In ThisWorkbook.Worksheets
If ws.Index < ThisWorkbook.Worksheets.count Then
Set nextWs = ThisWorkbook.Worksheets(ws.Index + 1)
Else
Set nextWs = Nothing
End If
Dim emptyCount As Long: emptyCount= CountEmptyCells(ws:=ws, targetRows:=rowsToCheck)
If emptyCount > 0 And Not nextWs Is Nothing Then
For j = LBound(rowsToPullFrom) To UBound(rowsToPullFrom)
If emptyCount <= 0 Then Exit For
If Not IsEmpty(nextWs.Cells(rowsToPullFrom(j), "L").Value) Then
For i = LBound(rowsToCheck) To UBound(rowsToCheck)
If IsEmpty(ws.Cells(rowsToCheck(i), "L").Value) Then
ws.Cells(rowsToCheck(i), "L").Value = nextWs.Cells(rowsToPullFrom(j), "L").Value
emptyCount = emptyCount + 1
nextWs.Cells(rowsToPullFrom(j), "L"). ClearContents
Exit For
End If
Next i
End If
Next j
End If
Next ws
End Sub
Function CountEmptyCells(ws As Worksheet, targetRows() As Variant) As Long
Dim count As Long
Dim i As Long
count = 0
For i = LBound(targetRows) To UBound(targetRows)
If IsEmpty(ws.Cells(targetRows(i), "L").Value) Then
count = count + 1
End If
Next i
CountEmptyCells = count
End Function
Если на первом листе "ОТЧ(1)" ячейка L12 пустая, то вставить туда значение из ячейки L10 со следующего листа "ОТЧ(3). Итак проверить все строки.
Затем повторить для всех следующих листов аналогично. Если на листе "ОТЧ(3)" ячейка L12 пустая, то вставить туда значение из ячейки L10 со следующего листа "ОТЧ(2)". Итак все строки.
Если правильно понял, что нужно сделать, то макрос как раз это и делает со всем листами. Результат на листах "ОТЧ(3)", "ОТЧ(2)" и т. д. не виден, т. к. строки заужены. Нужно увеличить высоту строк и можно будет увидеть результат.