如何使用VBA忽略范围内的绿色三angular形错误而不循环逐个单元格?

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

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如何停止检查整个范围没有循环逐个细胞?

任何有效和快速的方法来做到这一点将是非常有帮助的。 先谢谢你!!

首选的解决scheme是将该string转换为数字, 然后将其带入Excel。 例如,当我正在使用SQL,并且在数据库中有一些数值作为NVARCHAR存储时,我将在SQL语句中使用CONVERT(int, colName) 。 这带来了一个数字,我不再得到这个消息。

现在,如果这种select不适用于您,您可以通过另一种方式解决这个错误。 只需将存储为文本错误的值的范围设置为等于自己。

例如:

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

在这个例子中, A1:A3是你想不再以文本forms存储的值的范围。

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

 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 

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

显然的答案( Range(...).Errors(3).Ignore = True )似乎不工作时,范围大于单个单元格。

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

使用macroslogging器进行这个实验,logging什么都不是,这通常表明微软的程序员实现了这个function是无能的。

可悲的是,我认为这意味着除了循环之外没有任何解决scheme。

有关

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

在ThisWorkbook对象中,放置一个Open事件,logging它们的初始设置,然后closures它。

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

在closures文件时添加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 

在工作簿中切换工作表时,可以在工作表级别添加类似的事件来打开和closures它。

添加一些error handling,将其设置回原来的值也是明智的,所以在不太可能发生代码错误出现的情况下,您不会意外地将其置于错误的状态。