使用Selection.SpecialCells(xlCellTypeVisible)时,未选择的单元格会受到影响

时间:2016-08-09 11:11:12

标签: excel vba excel-vba selection

我创建了一个为当前选择添加前缀的宏。你可以看到它非常简单 - 它在选择中循环通过可见细胞。我添加了.SpecialCells(xlCellTypeVisible),因为它在使用过滤器时会影响非预期的单元格。

Sub Prefix()

Dim rng As Range
Dim Prefix As String
Prefix = "P"

For Each rng In Selection.SpecialCells(xlCellTypeVisible)
    rng = Prefix & rng
Next rng

End Sub

例如,假设我的数据Cells A1:A4填写如下:

Title
1
2
1

当我执行以下操作时,会出现问题:

  1. 在范围上加Autofilter,并隐藏A3
  2. 中的'2'
  3. 选择A2(第一个'1')
  4. 运行我的宏
  5. 问题是,它不是只影响Cell A2(所选单元格),而是开始将前缀应用于第一行(A1:Z1等),直到我取消宏。如果让它继续运行,它将继续对数千个单元格执行此操作。

    当我的选择是多个单元格,或者我使用Selection而不是Selection.SpecialCells(xlCellTypeVisible)时,或者当我没有过滤任何内容时将宏应用于一个单元格时,不会发生此问题(隐藏)。

    当我只选择了一个单元格时,有没有人有任何想法为什么选择默认为整个电子表格? 或者,任何人都可以建议使用VBA添加这样的前缀的方法吗?

    我知道使用excel公式可以缓解这个问题,但这对我来说并不实用,也不会像点击宏一样快。

2 个答案:

答案 0 :(得分:0)

您可以使用'Application.intersect'来确保获得所需的结果:

For each rng in Application.Intersect(Selection,ActiveSheet.Cells.SpecialCells(xlCellTypeVisible))

答案 1 :(得分:0)

如果您希望手动选择一系列单元格时动态工作,并且您的意图是将输入框中的国家/地区代码添加到单元格的当前值,则将下面发布的更改事件添加到代码中工作表的一部分,并将例程添加到工作簿中的代码模块。

不确定为什么要更换减号,但如果需要,可以将其添加到此代码中。

工作表代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call AddPrefix(Target)
End Sub

添加模块并将此代码放入其中。

Sub AddPrefix(rangeToPrefix)
    Dim cCell As Range
    Dim prefix As String
    prefix = InputBox("Enter your country code", "Set Country Code", +33)

    For Each cCell In rangeToPrefix.SpecialCells(xlCellTypeVisible)
        If Not IsEmpty(cCell) Then cCell.Value = prefix & cCell.Value
    Next cCell
End Sub