Как я могу ссылаться на активную ячейку в цикле по разным листам?

Я застрял там, где он правильно читает, что у меня есть две строки, которые удовлетворяют условию «Если», но он копирует строку 1 оба раза на отдельные листы, а не строки 8 и 10. Есть ли способ распознать одну ячейку за раз и скопируйте его, если он соответствует условиям.

Я попробовал следующий код

Sub RunReport()
    Dim srcSheet As Worksheet
    Dim rptSheet As Worksheet
    Dim i As Range
    Dim srcSheets As Variant
    
        Set rptSheet = ThisWorkbook.Sheets("Report")
        Set srcSheets = Worksheets(Array("SheetA", "SheetB", "SheetC", "SheetD"))
        
        For Each srcSheet In srcSheets
            For Each i In srcSheet.Range("A5:W358")
                If srcSheet.Range(i, "B").Value <> "" And srcSheet.Range(i, "O").Value = "" Then
                    srcSheet.Cells(i).EntireRow.Copy Destination = rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0)
                End If
            Next i
        Next srcSheet
        
End Sub
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
0
54
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

  • i — это объект диапазона, Cells(i) и Range(i, "B") — неправильный способ ссылки на объект диапазона. например. предполагая i=5, для ячейки B5 используйте Cells(i, "B") , Cells(i, 2) или Range("B" & i).

  • Destination:= ... Для именованного аргумента используйте := вместо =.

Документация Майкрософт:

Объект Range (Excel)

Свойство Range.Cells (Excel)

        Dim iR As Long
        For Each srcSheet In srcSheets
            For iR = 5 To 358
                If srcSheet.Cells(iR, "B").Value <> "" And srcSheet.Cells(iR, "O").Value = "" Then
                    srcSheet.Rows(iR).Copy Destination:=rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0)
                End If
            Next 
        Next srcSheet

Еще одно возможное решение.
Переменная i относится к строке копируемого диапазона.

Sub RunReport()
    Dim srcSheet As Worksheet
    Dim rptSheet As Worksheet
    Dim i As Range
    Dim srcSheets As Variant
    
        Set rptSheet = ThisWorkbook.Sheets("Report")
        Set srcSheets = Worksheets(Array("SheetA", "SheetB", "SheetC", "SheetD"))
        
        For Each srcSheet In srcSheets
            For Each i In srcSheet.Range("A5:W358").Rows
                If i.Columns("B").Value <> "" And i.Columns("O").Value = "" Then
                    i.Copy Destination:=rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0)
                End If
            Next i
        Next srcSheet
        
End Sub
Ответ принят как подходящий

Копирование совпадающих строк (2 критерия)

Быстрое решение

Sub RunReport()
     
    Dim wb As Workbook: Set wb = ThisWorkbook
    
    Dim srcSheets As Sheets: Set srcSheets = wb.Sheets(Array( _
        "SheetA", "SheetB", "SheetC", "SheetD"))
    
    Dim rptSheet As Worksheet: Set rptSheet = wb.Sheets("Report")
    Dim rptCell As Range: Set rptCell = rptSheet _
        .Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1)
    
    Dim srcSheet As Object, srcRange As Range, srcRow As Range
        
    For Each srcSheet In srcSheets
        If TypeOf srcSheet Is Worksheet Then
            Set srcRange = srcSheet.Range("A5:W358")
            For Each srcRow In srcRange.Rows
                If Len(CStr(srcRow.Columns("B").Value)) > 0 _
                        And Len(CStr(srcRow.Columns("O").Value)) = 0 Then
                    srcRow.Copy Destination:=rptCell
                    Set rptCell = rptCell.Offset(1)
                End If
            Next srcRow
        End If
    Next srcSheet
        
End Sub

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