Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Do循环类型不匹配中的“If”语句_Vba_Excel - Fatal编程技术网

Vba Do循环类型不匹配中的“If”语句

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 _

我在网上搜索了一下,试图找出为什么我的If语句中出现了类型不匹配错误,但似乎无法理解。任何帮助都将不胜感激,并提前表示感谢。顺便说一下,i整数是在前面的代码部分中声明的

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