Vba Do循环类型不匹配中的“If”语句
我在网上搜索了一下,试图找出为什么我的If语句中出现了类型不匹配错误,但似乎无法理解。任何帮助都将不胜感激,并提前表示感谢。顺便说一下,i整数是在前面的代码部分中声明的Vba Do循环类型不匹配中的“If”语句,vba,excel,Vba,Excel,我在网上搜索了一下,试图找出为什么我的If语句中出现了类型不匹配错误,但似乎无法理解。任何帮助都将不胜感激,并提前表示感谢。顺便说一下,i整数是在前面的代码部分中声明的 Do While i < 25000 j = 4 Range("AV4:AV550").Select Selection.Copy Range("AU4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
Do While i < 25000
j = 4
Range("AV4:AV550").Select
Selection.Copy
Range("AU4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Check for a new high value
Do Until j = 551
If Range("AX" & j).Value < Range("AS" & j).Value Then
Range("AX" & j) = Range("AS" & j)
End If
j = j + 1
Loop
Range("AL4:AR550").Calculate
i = i + 1
Loop
更新If语句以仅比较值: 如果ValRangeAX&j.值
在错误恢复时,下一步就是这样做的。我假设j也被声明为和整数。您可能需要显式地将j转换为字符串,例如AX和CStrj。只是猜测一下,发生此错误是因为单元格中的一些比较值不是数字。您需要检查这些单元格,或者如果您想忽略这些情况,您可以使用@A.S.H提到的最有可能的错误恢复。一种解决方法是从每个单元格中提取Val。我会提供一个更详细的答案好主意@paul,但是当单元格类型为date时,我有一些奇怪的行为。似乎比较测试总是返回false我还没有使用Val技巧,只要ASj和AXj中的一个或两个是日期…顺便说一句,在我自己的测试中,由于单元格的类型,从来没有运行时错误。看起来VBA只是将任何东西与任何东西进行比较,只是比较的结果没有定义。@A.S.H-很好;我仍在试图找到处理意外数据类型的最通用的方法;为了比较数字,它可能会起作用。我还没有尝试日期yetThanks的帮助,但是,我仍然在If语句中得到一个类型不匹配的错误。如果有帮助的话,列AS&AX中的数据都是数字,格式为记帐编号。关于可能导致错误的原因还有其他想法吗?再次感谢。请小心错误恢复下一步,或者至少要注意,它只是隐藏了错误并移动到下一个值,这意味着您将丢失一些您可能不想错过的值,但是,通常这些错误通常由Null触发-检查它们的最佳方法:IsNullRangeAX&j.value,或隐藏字符,如换行符\回车符,或其他特殊字符;我将更新我的答案,以包括检查空值
Option Explicit
Public Sub doStuff()
Dim i As Long, j As Long
For i = 0 To 25000
Range("AV4:AV550").Copy
Range("AU4").PasteSpecial Paste:=xlPasteValues
'Check for a new high value
For j = 4 To 551
'check for NULL
If IsNull(Range("AX" & j).Value) Then Range("AX" & j).Value = vbNullString
If IsNull(Range("AS" & j).Value) Then Range("AS" & j).Value = vbNullString
'remove special characters
Range("AX" & j).Value = WorksheetFunction.Clean(Trim(Range("AX" & j).Value))
Range("AS" & j).Value = WorksheetFunction.Clean(Trim(Range("AS" & j).Value))
If Val(Range("AX" & j).Value) < Val(Range("AS" & j).Value) Then
Range("AX" & j) = Range("AS" & j)
End If
Next
Range("AL4:AR550").Calculate
Next
End Sub
'Val() extracts any numbers it finds at the start of a string and it stops at first alpha
Public Sub testVal()
Debug.Print "test" '---> "test"
Debug.Print Val("test") '---> 0
Debug.Print Val("123test") '---> 123
Debug.Print Val("test456") '---> 0
End Sub