如何在不逐个单元循环的情况下使用VBA忽略范围内的绿色三角形误差?

时间:2015-04-17 19:57:20

标签: excel vba error-checking

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

     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如何在不逐个单元循环的情况下停止检查整个范围吗?

任何有效而快速的方法都会非常有用。提前谢谢!!

5 个答案:

答案 0 :(得分:5)

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

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

在没有记录的情况下使用宏录制器进行此实验,这通常表明Microsoft实现此功能的程序员不称职。

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

Related

答案 1 :(得分:3)

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

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

例如:

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

这将更改显示以再次显示前导零。如果您以任何方式导出此数据,您可能需要采取措施确保将此特定列导出为文本而不是数字,但如果没有具体细节,我将无法提供更多帮助。

答案 2 :(得分:3)

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

在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

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

添加一些将其设置回原始值的错误处理也是明智之举,这样你就不会在不太可能发生的代码错误的情况下将其置于错误的状态。

答案 3 :(得分:1)

我创建了一个漂亮的程序,将错误放入'忽略'列表: 玩得开心

git rebase

答案 4 :(得分:0)

原始海报共享的代码似乎有错误。为了使这个工作起作用,我添加了添加错误的 .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