【问题标题】:How can I use VBA to ignore green triangle error in range without looping cell by cell?如何使用 VBA 忽略范围内的绿色三角形错误而不逐个单元格地循环?
【发布时间】:2015-04-17 19:57:20
【问题描述】:

我有一些我正在自动化和分发的大型数据集。我想消除警告用户存储为文本的数字的绿色小三角形。我使用了以下代码,但在大量工作表上非常慢。

     Range(Cells(1, 1), Cells(lastrow, lColumn)).Select
     'kill those dang green cell triagles
     Dim rngCell As Range, bError As Byte
         For Each rngCell In Selection.Cells

             For bError = 3 To 3 Step 1

                 With rngCell
                     If .Errors(bError).Value Then
                         .Errors(bError).Ignore = True
                     End If
                 End With
             Next bError
         Next rngCell

如您所见,我已经将它减少到 1/7 的时间,方法是不循环遍历我试图阻止的每个错误,但它仍然非常慢。

我也已经知道了

     Application.ErrorCheckingOptions.NumberAsText = False

但我不想使用它,因为我不想更改用户的系​​统设置。我想要循环的效果而不遍历所有单元格。我可以告诉 Excel 在不逐个单元格循环的情况下停止检查整个范围吗?

任何有效且快速的方法都会非常有帮助。提前谢谢你!

【问题讨论】:

  • 在您知道它们不是相关警告的特定单元格中隐藏特定警告是完全合理的,同时仍然保持用户在其他单元格中出现其他警告的意图。

标签: excel vba error-checking


【解决方案1】:

当 Range 大于单个单元格时,显而易见的答案 (Range(...).Errors(3).Ignore = True) 似乎不起作用。

经过一番实验,我发现你可以手动选择单元格范围,然后点击出现的小弹出菜单并告诉它忽略范围内的所有错误,但这似乎没有VBA 等效。

用宏记录器做这个实验什么都没有记录,这通常表明实现这个功能的微软程序员不称职。

可悲的是,我认为这意味着除了循环之外没有其他解决方案。

Related

【讨论】:

  • “实现此功能的 Microsoft 程序员不称职。”这可能是事实:(感谢您为我调查此问题
【解决方案2】:

您可以使用工作簿事件来打开和关闭用户的系统设置,并在完成后将设置恢复为原始值。

在 ThisWorkbook 对象中,放置一个记录其初始设置的 Open 事件,然后将其关闭。

Dim MyErrorCheckValue as Boolean

Private Sub Workbook_Open()
    MyErrorCheckValue = Application.ErrorCheckingOptions.NumberAsText
    Application.ErrorCheckingOptions.NumberAsText = False
End Sub

添加一个 BeforeClose 事件以在关闭文件时将其设置回原始值。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.ErrorCheckingOptions.NumberAsText = MyErrorCheckValue
End Sub

然后添加激活和停用事件,以便在用户打开或查看其他电子表格时切换。

Private Sub Workbook_Activate()
    Application.ErrorCheckingOptions.NumberAsText = False
End Sub

Private Sub Workbook_Deactivate()
    Application.ErrorCheckingOptions.NumberAsText = MyErrorCheckValue
End Sub

您可以在工作表级别添加类似的事件,以便在工作簿中切换工作表时将其打开和关闭。

添加一些错误处理以将其设置回原始值也是明智之举,这样您就不会意外将其置于错误状态,以防万一您的代码在某个地方出错。

【讨论】:

  • 未经测试就无法确定,但它似乎是正确的,所以我给出了+1——这确实应该是公认的答案。如果有什么安慰的话,这就是我正在寻找的确切答案。
【解决方案3】:

首选的解决方案是将字符串转换为数字在您将它带入 Excel。例如,当我使用 SQL 并且在数据库中存储了一些数值为 NVARCHAR 时,我将在 SQL 语句中使用 CONVERT(int, colName) 将其导入 Excel。这会将它作为一个数字带入,我不再收到该消息。

现在,如果您无法使用此类选项,您可以通过其他方式修复该错误。只需将值的范围设置为存储为文本错误的数字等于自身。

例如:

Sub Test()

    Sheets("Sheet1").Range("A1:A3").Value = Sheets("Sheet1").Range("A1:A3").Value

End Sub

在此示例中,A1:A3 是您希望不再存储为文本的值范围。

由于您的数字有前导零,您可以更改这些单元格的格式以添加这些零:

Sub Test()

    Sheets("Sheet1").Range("A1:A3").Value = Sheets("Sheet1").Range("A1:A3").Value
    'This assumes your numbers are 11 digits long
    'Thus 11132 would display as 00000011132
    Sheets("Sheet1").Range("A1:A3").NumberFormat = "00000000000"

End Sub

这将更改显示以再次显示前导零。如果您以任何方式导出此数据,您可能必须采取措施确保此特定列导出为文本而不是数字,但如果没有具体说明,我无能为力。

【讨论】:

  • 谢谢,但我不希望将其存储为数字。有前导零不能脱落,因此它必须保留为文本。我需要的是让 Excel 停止警告我。它被故意存储为文本。你能帮我吗?再次感谢您
  • 您可以更新范围的.NumberFormat 属性以显示前导零。我已经更新了我的答案以反映这一点。尽管最终这仍会将其存储为数字。如果此方法不适合您的需求,我将不得不进一步考虑。
  • 感谢@Soulfire,不幸的是,在 SQL 中转换不起作用,因为 Excel 将其转换为数字。很棒的解决方法!谢谢。
【解决方案4】:

我创建了一个漂亮的程序来将错误放在“忽略”列表中: 玩得开心

Sub SetInconsistentFormulaErrorsFalse(rng As Range, _
Optional arrErrortypes As Variant = Null, _
Optional bIgnoreErrors As Boolean = True)

Dim cl As Range
Dim i As Integer

If IsNull(arrErrortypes) Then
   arrErrortypes = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
End If

For i = 0 To UBound(arrErrortypes) - 1
    For Each cl In rng.Cells
        cl.Errors(arrErrortypes(i)).Ignore = bIgnoreErrors
    Next
Next i


Set cl = Nothing

End Sub

【讨论】:

    【解决方案5】:

    原发帖人分享的代码似乎有错误。为了让它工作,我已经添加到错误的 .Item 中添加:

    Dim rngCell As Range, bError As Byte
    For Each rngCell In Selection.Cells
    
        For bError = 1 To 4
    
            With rngCell
                If .Errors.Item(bError).value Then
                    .Errors.Item(bError).Ignore = True
                End If
            End With
        Next bError
    Next rngCell
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-11
      • 2018-09-12
      • 2023-03-31
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多