【问题标题】:Circle Invalid-data Macro圈无效数据宏
【发布时间】:2012-11-02 12:10:35
【问题描述】:

我有一个包含许多相关下拉列表的工作表,如果初始下拉列表被更改,这些下拉列表可能会出现无效数据。我想要一个简单的自动宏,它会在每次检测到指定范围(D8:T800)内的单元格更改时自动运行“圈出无效数据”命令。

这听起来很简单,但我不知道该怎么做。

问题 - 因为这个宏会在每次修改单元格时运行,这个宏会减慢工作表的速度吗?

编辑: 另外:由于这可能很慢,有没有办法可以在选定范围内运行此命令?

谢谢你的想法。

【问题讨论】:

  • 听起来一点也不简单。我不明白你的布局是什么样的,以及你到底想要实现什么。看看stackoverflow.com/questions/how-to-ask,尤其是“做你的功课”和“具体一点”。
  • 您不能在工作表的子区域上运行 Circle Invalid Data 例程。如果您希望仅对特定子范围执行验证,最好指定并实现您自己的验证格式,这可以通过 VBA 应用,或者将数据分离到不同的工作表中。您可以使用 Range 的 .Validation 属性来应用/删除格式
  • 另外,您的问题仍然非常不具体和模糊。请包括数据示例和您正在使用的数据集大小的指示。还发布您到目前为止的代码示例
  • 好问题。不确定自 ExternalUse 的评论以来是否已更新,但这对我来说非常有意义,我发现这个问题正是搜索您要问的内容。

标签: vba excel


【解决方案1】:

试试这个

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("D8:T800")) Is Nothing Then
        Me.CircleInvalid
    End If
End Sub

请注意,CircleInvalid 适用于整个工作表,因此虽然此代码仅在 D8:T800 内的单元格更改时触发,但所有工作表上的无效单元格将被圈出

【讨论】:

  • 是的,这是我们使用的版本!效果很好!
【解决方案2】:

尝试将此代码放在您的工作表中:

Private Sub Worksheet_Change(ByVal Target As Range)

' Check target range has changed
If (Not Intersect(Target, Range("D8:T800")) Is Nothing) Then
    ' Prevent recusrive looping
    Application.EnableEvents = False

    ' Refresh validation circles
    Target.Worksheet.CircleInvalid

    Application.EnableEvents = True
End If

End Sub

请注意,如果这些单元格中的值由于超出指定范围的计算而发生更改,则此方法将不起作用。

此外,CircleInvalid 方法适用于整个工作表。

如果 Target 得到验证,您可以尝试编辑条件中的代码以“做某事” - 这将导致您更改无效单元格的格式,而不是在它们周围显示红色圆圈。

**PSEUDO-CODE**
For each cell in Target.Range
    cell.colour = bright red
Next cell

【讨论】:

  • 我明白了,谢谢,请记住这一点。录制宏似乎意味着:ActiveSheet.CircleInvalid 是命令
  • 我正在努力研究如何立即触发 Circle Invalid Data 例程...好问题:)
  • 它对你有用吗?它适用于问题的相当松散的规范。如果此答案被证明是您问题的答案,请接受。
  • 这大大减慢了工作表的速度,哈哈。有没有办法我们可以将其限制为仅在供应商列中包含“SupplierConfig”的行?即动态范围稍微大一点?
  • 我通常会将此移至聊天,但您没有足够的声誉。您能否更新您的初始问题以更清楚地说明问题。我添加了一些文本来解释为什么 CircleInvalid 方法只能在整个工作表上工作。
猜你喜欢
  • 1970-01-01
  • 2018-09-05
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多