使用ActiveCell.Offset()

时间:2015-07-20 14:24:56

标签: excel vba excel-vba filter

我正在运行一个宏,它要求一个工作表名称和一个参考单元格,然后选择一系列单元格,围绕我们选择的单元格。 将过滤器应用于我的数据后,某些行会被隐藏,因为它们不是必需的。 问题是,宏不考虑这一点并计算隐藏的行。 这是我在宏的原始版本中使用的代码:

.....应用一些InputBox并搜索用户的值后,执行以下行:

Range(ActiveCell.Offset(90, 0), ActiveCell.Offset(-252, 2)).Select
Selection.Copy

这样,隐藏行包含在选择中。 我尝试了以下修改

Range(ActiveCell.Offset(90, 0), ActiveCell.Offset(-252, 2)).SpecialCells(xlCellTypeVisible).Select
Selection.Copy

然而没有成功。

我想知道,是否有人可以建议使用ActiveCell.OffsetSpecialCells(xlCellTypeVisible)结合使用,从而导致宏的上述功能 - 选择一系列单元格,避免过滤后隐藏的行?

1 个答案:

答案 0 :(得分:4)

要从一系列选定单元格中仅选择可见单元格,可以使用以下代码行:

Selection.SpecialCells(xlCellTypeVisible).Select

就像在这个例子中一样:

Range(ActiveCell.Offset(90, 0), ActiveCell.Offset(-252, 2)).Select
Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy

下面的代码是一个关于如何计算行数的示例。 所以,但是你需要考虑一个问题。

如果将选择粘贴到原始工作表,则可能会在复制选区的区域中存在隐藏的行。 如果是这样,那么您在那里复制的文本也将被隐藏。

因此,您必须将数据复制到新工作表以避免该问题,或者您必须复制工作表1底部的数据。

Option Explicit
'Define a Constant for the Amount of Rows you Need
Private Const ConstAmountRows As Integer = 40
Sub Test()
    Dim intCountedRows As Integer
    Dim idx As Integer
    Dim intDifference As Integer

    idx = 0
    Do
        If Not (intCountedRows = ConstAmountRows) Then
            intCountedRows = ConstAmountRows
            idx = idx + 1
        End If
        Sheets("Sheet1").Select
        'Select the Range with the Amount of Rows you need ideally
        Range("A1:A" & intCountedRows + idx).Select

        'Select only the Visible Cells
        Selection.SpecialCells(xlCellTypeVisible).Select
        Selection.Copy

        Sheets("Sheet2").Select 'Select another Sheet
        '***-> Her you can select the Place you want to Paste the Text<-***
        Range("B1").Select
        ActiveSheet.Paste

        '*** Count the Rows that you Paste
        intCountedRows = Selection.Rows.Count
    'if the Counted Rows are not equal to the Amount. Repeat
    Loop While Not (intCountedRows >= ConstAmountRows)
End Sub