Joh*_*son 3 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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,我已经把它减少到1/7的时间,没有循环遍历我想要阻止的每个错误,但它仍然非常慢.
我也已经知道了
Application.ErrorCheckingOptions.NumberAsText = False
Run Code Online (Sandbox Code Playgroud)
但我不想使用它,因为我不想更改用户系统设置.我想要循环的效果而不循环遍历所有单元格.我可以告诉Excel如何在不逐个单元循环的情况下停止检查整个范围吗?
任何有效和快速的方法都会非常有帮助.先感谢您!!
小智 6
您可以使用工作簿事件来打开和关闭用户的系统设置,并在完成后将设置恢复为原始值。
在 ThisWorkbook 对象中,放置一个 Open 事件,记录它们的初始设置,然后将其关闭。
Dim MyErrorCheckValue as Boolean
Private Sub Workbook_Open()
MyErrorCheckValue = Application.ErrorCheckingOptions.NumberAsText
Application.ErrorCheckingOptions.NumberAsText = False
End Sub
Run Code Online (Sandbox Code Playgroud)
添加 BeforeClose 事件以在关闭文件时将其设置回原始值。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ErrorCheckingOptions.NumberAsText = MyErrorCheckValue
End Sub
Run Code Online (Sandbox Code Playgroud)
然后添加 Activate 和 Deactivate 事件,以便在用户打开或查看不同的电子表格时切换。
Private Sub Workbook_Activate()
Application.ErrorCheckingOptions.NumberAsText = False
End Sub
Private Sub Workbook_Deactivate()
Application.ErrorCheckingOptions.NumberAsText = MyErrorCheckValue
End Sub
Run Code Online (Sandbox Code Playgroud)
您可以在工作表级别添加类似的事件以在工作簿中切换工作表时将其打开和关闭。
添加一些错误处理将其设置回原始值也是明智之举,这样您就不会意外地将其置于错误状态,以防万一您的代码在某处出错。
首选解决方案是在将字符串导入 Excel之前将其转换为数字。例如,当我使用 SQL 时,我NVARCHAR
在数据库中存储了一些数值CONVERT(int, colName)
,当我将其导入 Excel 时,我将在 SQL 语句中使用 a 。这会将其作为数字引入,但我不再收到该消息。
现在,如果您无法使用此类选项,您可以通过其他方式修复该错误。只需将存储为文本错误的数字设置为等于其自身的值范围。
例如:
Sub Test()
Sheets("Sheet1").Range("A1:A3").Value = Sheets("Sheet1").Range("A1:A3").Value
End Sub
Run Code Online (Sandbox Code Playgroud)
此示例中的位置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
Run Code Online (Sandbox Code Playgroud)
这将更改显示以再次显示前导零。如果您以任何方式导出此数据,您可能必须采取措施确保此特定列导出为文本而不是数字,但如果没有具体信息,我无法提供更多帮助。