VBA-仅需循环可见的单元格

时间:2018-10-27 12:24:12

标签: excel vba excel-vba

仅尝试从过滤的行中复制特定的单元格,但是这部分代码将保留所有数据的复制,甚至是从隐藏的单元格中复制。

Sheets(Wss).Range("A1").AutoFilter _
     Field:=8, _
      Criteria1:="Vesztesg", _
       VisibleDropDown:=False
 For j = 2 To Sheets(Wss).Range("A2").End(xlDown).End(xlDown).End(xlUp).Row - 1
     Sheets("EBS Posting template").Range("C" & i) = Sheets(Wss).Range("E" & j)
     Sheets("EBS Posting template").Range("O" & i + 1) = Sheets(Wss).Range("F" & j)
     Sheets("EBS Posting template").Range("G" & i + 2) = Sheets(Wss).Range("J" & j)
          i = i + 3
      Next j

2 个答案:

答案 0 :(得分:1)

如果您要使用行计数器,即使该行是隐藏的,它仍将为您提供该行的值。 您将需要其他行以确保该行未被隐藏。

可能只是循环遍历可见的单元格即可。

顺便说一句:我不确定您的值在哪里结束,您将不得不在代码中对其进行编辑。 enter image description here

该代码将循环遍历E列中的可见单元格,同时还要检查代码中的工作表名称,我也不确定。

Sub Button2_Click()
    Dim wss As Worksheet, sh As Worksheet, LstRw As Long, rng As Range, c As Range, Lr As Long

    Set wss = Sheets("Sheets(Wss)")
    Set sh = Sheets("EBS Posting template")

    With wss
        LstRw = .Cells(.Rows.Count, 8).End(xlUp).Row
        .Range("A1").AutoFilter Field:=8, Criteria1:="Vesztesg"
        Set rng = .Range("E2:E" & LstRw).SpecialCells(xlCellTypeVisible)

        For Each c In rng.Cells
            With sh
                Lr = .Cells(.Rows.Count, "C").End(xlUp).Row + 1
                .Cells(Lr, "C").Value = c
                .Cells(Lr, "O").Value = c.Offset(, 1)
                .Cells(Lr, "G").Value = c.Offset(, 5)
            End With
        Next c
        .AutoFilterMode = False
    End With

End Sub

答案 1 :(得分:1)

要仅遍历可见单元格,您需要遍历一个范围。 因此,我们使用For i代替For Each循环,让您做到这一点。我们将.SpecialCells(xlCellTypeVisible)添加到该范围。

对于范围内的每个元素,我们声明一个变量cl。我们可以用来从中提取数据。

Sheets(Wss).Range("A1").AutoFilter _
     Field:=8, _
      Criteria1:="Vesztesg", _
       VisibleDropDown:=False

Dim cl As Range
For Each cl In Range(Cells(2, 1), Cells(Sheets(Wss).Range("A2").End(xlDown).End(xlDown).End(xlUp).Row - 1, 1)).SpecialCells(xlCellTypeVisible) 'Apply visible cells only
     j = cl.Row 'row number of current cl value.
     Sheets("EBS Posting template").Range("C" & i) = Sheets(Wss).Range("E" & j)
     Sheets("EBS Posting template").Range("O" & i + 1) = Sheets(Wss).Range("F" & j)
     Sheets("EBS Posting template").Range("G" & i + 2) = Sheets(Wss).Range("J" & j)
          i = i + 3
Next cl 'loop to next cl