从单元格中删除内容,如果 IsNumber = False
Delete contents from cell, IFIsNumeric = False
所以我有这个程序;从远程系统扫描值。有时,如果网络中断,它可能会超时,并且会出现 #nan 错误或类似的错误。
当我尝试将该错误消息写入数据库时;它会出错 "Data Type Mismatch" 因为它正在寻找一个数值。
为了解决这个问题,我决定尝试清理结果。所以我有下面的代码。它大部分时间都有效;我看到它失败的地方是,如果中途有一个数字,然后它再次出错。一旦达到数字,它似乎就会停止循环并且不会清除其他任何东西。
有人能给我的任何帮助都会很棒;也许我这样做很糟糕。我试图举例说明我想在下面看到的内容。如果您有任何建议或问题,请告诉我。
Private Sub Clean()
'Select Current Row For where to start cleaning. LoopIndex is a global variable.
'Just giving the line of where to read from so I do not need to read the whole sheet.
Range("B" & LoopIndex).Select
'Start the loop, to go through the entire row.
Do Until IsEmpty(ActiveCell)
'Checks if it is a number value; if it is not it will clear out the data.
If IsNumeric(ActiveCell.Value) = False Then
ActiveCell.Value = ""
End If
ActiveCell.Offset(0, 1).Select
Loop
End Sub
它看起来像什么。
|A |B |C |D |
|#error|#Error|3 |#Error|
我想要的样子。
|A |B |C |D |
| | |3 | |
它在做什么。
|A |B |C |D |
| | |3 |#Error|
试试这个
Sub RemoveErrors(TheRange As Range)
Dim c
For Each c In TheRange
If IsError(c) Then c.Value = ""
Next c
End Sub
编辑:没有循环的版本如果是公式错误可能会加快速度
Sub RemoveErrors(TheRange As Range)
On Error Resume Next
TheRange.SpecialCells(xlCellTypeFormulas, xlErrors).Value = vbNullString
On Error GoTo 0
End Sub
这样使用:
Sub Test()
RemoveErrors Range("A1:D21")
End Sub
如果您更喜欢使用 IsNumeric
函数,则使用此函数:
Sub RemoveNAN(TheRange As Range)
Dim c
For Each c In TheRange
If IsNumeric(c) = False Then c.Value = ""
Next c
End Sub
这就是我最终的做法,因为不同工作表上的变量范围。我发布这个只是为了将来给其他人一个解决方案。
感谢大家对此的帮助。
Private Sub Clean()
Dim StartRow As String
Dim LastCol As Long
Dim EndRow As String
Dim StartCol As String
Dim MyCol As String
StartCol = "B"
With ActiveSheet
LastCol = .Cells(LoopIndex, .Columns.Count).End(xlToLeft).Column
End With
MyCol = GetColumnLetter(LastCol)
RemoveErrors Range(StartCol & LoopIndex & ":" & MyCol & LoopIndex)
End Sub
'Does the replacing
Sub RemoveErrors(TheRange As Range)
Dim c
For Each c In TheRange
If IsError(c) Then c.Value = ""
Next c
End Sub
'Gets the Column Letter
Function GetColumnLetter(colNum As Long) As String
Dim vArr
vArr = Split(Cells(1, colNum).Address(True, False), "$")
GetColumnLetter = vArr(0)
End Function
所以我有这个程序;从远程系统扫描值。有时,如果网络中断,它可能会超时,并且会出现 #nan 错误或类似的错误。
当我尝试将该错误消息写入数据库时;它会出错 "Data Type Mismatch" 因为它正在寻找一个数值。
为了解决这个问题,我决定尝试清理结果。所以我有下面的代码。它大部分时间都有效;我看到它失败的地方是,如果中途有一个数字,然后它再次出错。一旦达到数字,它似乎就会停止循环并且不会清除其他任何东西。
有人能给我的任何帮助都会很棒;也许我这样做很糟糕。我试图举例说明我想在下面看到的内容。如果您有任何建议或问题,请告诉我。
Private Sub Clean()
'Select Current Row For where to start cleaning. LoopIndex is a global variable.
'Just giving the line of where to read from so I do not need to read the whole sheet.
Range("B" & LoopIndex).Select
'Start the loop, to go through the entire row.
Do Until IsEmpty(ActiveCell)
'Checks if it is a number value; if it is not it will clear out the data.
If IsNumeric(ActiveCell.Value) = False Then
ActiveCell.Value = ""
End If
ActiveCell.Offset(0, 1).Select
Loop
End Sub
它看起来像什么。
|A |B |C |D |
|#error|#Error|3 |#Error|
我想要的样子。
|A |B |C |D |
| | |3 | |
它在做什么。
|A |B |C |D |
| | |3 |#Error|
试试这个
Sub RemoveErrors(TheRange As Range)
Dim c
For Each c In TheRange
If IsError(c) Then c.Value = ""
Next c
End Sub
编辑:没有循环的版本如果是公式错误可能会加快速度
Sub RemoveErrors(TheRange As Range)
On Error Resume Next
TheRange.SpecialCells(xlCellTypeFormulas, xlErrors).Value = vbNullString
On Error GoTo 0
End Sub
这样使用:
Sub Test()
RemoveErrors Range("A1:D21")
End Sub
如果您更喜欢使用 IsNumeric
函数,则使用此函数:
Sub RemoveNAN(TheRange As Range)
Dim c
For Each c In TheRange
If IsNumeric(c) = False Then c.Value = ""
Next c
End Sub
这就是我最终的做法,因为不同工作表上的变量范围。我发布这个只是为了将来给其他人一个解决方案。
感谢大家对此的帮助。
Private Sub Clean()
Dim StartRow As String
Dim LastCol As Long
Dim EndRow As String
Dim StartCol As String
Dim MyCol As String
StartCol = "B"
With ActiveSheet
LastCol = .Cells(LoopIndex, .Columns.Count).End(xlToLeft).Column
End With
MyCol = GetColumnLetter(LastCol)
RemoveErrors Range(StartCol & LoopIndex & ":" & MyCol & LoopIndex)
End Sub
'Does the replacing
Sub RemoveErrors(TheRange As Range)
Dim c
For Each c In TheRange
If IsError(c) Then c.Value = ""
Next c
End Sub
'Gets the Column Letter
Function GetColumnLetter(colNum As Long) As String
Dim vArr
vArr = Split(Cells(1, colNum).Address(True, False), "$")
GetColumnLetter = vArr(0)
End Function