Страницы: 1
RSS
[ Закрыто ] Помогите грамотно доделать код для переноса содержимых ячеек в пустые с других листов
 
Здравствуйте, уважаемы формучане и знатоки 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
Изменено: Mimicry - 06.02.2025 19:21:27
 
Если на первом листе "ОТЧ(1)" ячейка L12 пустая, то вставить туда значение из ячейки L10 со следующего листа "ОТЧ(3). Итак проверить все строки.

Затем повторить для всех следующих листов аналогично. Если на листе "ОТЧ(3)" ячейка L12 пустая, то вставить туда значение из ячейки L10 со следующего листа "ОТЧ(2)". Итак все строки.

Если правильно понял, что нужно сделать, то макрос как раз это и делает со всем листами. Результат на листах "ОТЧ(3)", "ОТЧ(2)" и т. д. не виден, т. к.  строки заужены. Нужно увеличить высоту строк и можно будет увидеть результат.
 
Цитата
fromridder написал: Нужно увеличить высоту строк...
Все немного сложнее :D
Согласие есть продукт при полном непротивлении сторон
 
Mimicry, Тема закрыта. Это уже даже не дубль, а трибль темы
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх