无法修复类型不匹配错误



我的if语句中出现了一个非常烦人的类型不匹配错误,我似乎无法修复。如果有人帮忙,我们将不胜感激。

    lrIPA = Sheets("IPA").Range("A65000").End(xlUp).Row
    A = 2
    Do
        'this is where my error is happening!****
        If Worksheets("IPA").Cells(A, 4).Value - Worksheets("Master Sheet").Range("I8").Value > Worksheets("Master Sheet").Range("I6").Value Then
            B = 3
            SL = False
            Do
                If Cells(B, 2).Value = Sheets("IPA").Cells(A, 2).Value Then
                    If Sheets("IPA").Cells(A, 5).Value = "" Then
                        Cells(B, 5).Value = Application.WorksheetFunction.RoundDown(Sheets("IPA").Cells(A, 4).Value - Sheets("Master Sheet").Range("I8"), -5)
                        'this just stores the unrounded CAD values
                        Cells(B, 100).Value = Sheets("IPA").Cells(A, 4).Value - Sheets("Master Sheet").Range("I8")
                    ElseIf Sheets("IPA").Cells(A, 5).Value = "USD" Then
                        Cells(B, 6).Value = Application.WorksheetFunction.RoundDown(Sheets("IPA").Cells(A, 4).Value - Sheets("Master Sheet").Range("I8"), -5)
                    End If
                    SL = True
                End If
                B = B + 1
            Loop Until SL = True Or B > lrIA
        End If
        A = A + 1
    Loop Until A > lrIPA

请确保VBA将单元格的内容识别为数字,方法是根据单元格的大小将其显式转换为整数或长字符。要做到这一点,将使用:

If cint(Worksheets("IPA").Cells("A", 4).Value) - cint(Worksheets("Master Sheet").Range("I8").Value) > cint(Worksheets("Master Sheet").Range("I6").Value) Then

对于较长的数字,请将cint替换为clng。如果它们是浮动的,则使用CDbl等

您还应该使用cells("A", 4),除非A是您在其他地方指定为字符串的变量

编辑:

好的,所以我用一种非常简单的方式尝试了一下。我分解了长的条件语句,它起了作用:

Sub tst()

Dim d2 As Currency, i8 As Currency, i6 As Currency
d2 = CCur(ThisWorkbook.Sheets("IPA").Cells(2, 4).Value)
i8 = CCur(Worksheets("Master Sheet").Range("I8").Value)
i6 = CCur(Worksheets("Master Sheet").Range("I6").Value)
If d2 - i8 > i6 Then
    Debug.Print "true"
End If
End Sub

CInt也可以处理货币类型的单元格,但要注意溢出。

我有几个建议,可以更容易地解决问题。

  1. 在这行代码Loop Until SL = True Or B > lrIA中是否有拼写错误?最后一个变量应该是lrIPA吗?在写这种行时使用括号是个好主意,因为它更容易阅读。Loop Until (SL = True) Or (B > lrIPA)

  2. 多次使用Cells方法(例如If Cells(B, 2).Value = ...(,但未指定工作表。如果您最终更改了ActiveSheet,这可能是危险的。

  3. 如果您发现在代码中多次使用相同的工作表,那么使用工作表变量通常会使代码更容易阅读。例如,

如果工作表("IPA"(。单元格(A,4(。值-工作表

可以更改为:

Dim ipaSheet As Worksheet
Dim masterSheet As Worksheet
Set ipaSheet = Worksheets("IPA")
Set masterSheet = Worksheets("Master Sheet")
If ipaSheet.Cells(A, 4).Value - masterSheet.Range("I8").Value > masterSheet.Range("I6").Value Then
  1. 您经常使用Worksheets("Master Sheet").Range("I6").ValueWorksheets("Master Sheet").Range("I8").Value中的值。将这些值存储在变量中,然后只使用该变量会更容易。如果单元格中的内容可能在宏期间发生更改,请改用范围变量。

  2. 将值存储在变量中还可以通过将鼠标悬停在变量上或使用Locals窗口来检查IDE窗口中的值。如果您的数据有问题(例如,有文本,但它应该是一个数字(,在将值存储到变量中时也应该注意这一点。

把所有这些点放在一起,并将它们应用到代码块中,它就变成了:

Dim lrIPA As Long
Dim A As Long
Dim B As Long
Dim SL As Boolean
Dim i8Value As Currency ' Use a more meaningful name
Dim i6Value As Currency ' Use a more meaningful name
Dim ipaValue As Currency ' Use a more meaningful name
Dim roundedValue As Currency ' Use a more meaningful name
Dim masterSheet As Worksheet
Dim ipaSheet As Worksheet
Set ipaSheet = Worksheets("IPA")
Set masterSheet = Worksheets("Master Sheet")
lrIPA = ipaSheet.Range("A65000").End(xlUp).Row
i8Value = CCur(masterSheet.Range("I8").Value)
i6Value = CCur(masterSheet.Range("I6").Value)
A = 2
Do
    ipaValue = CCur(ipaSheet.Cells(RowIndex:=A, ColumnIndex:=4).Value)
    'this is where my error is happening!****
    If (ipaValue - i8Value) > i6Value Then
        B = 3
        SL = False
        Do
            If masterSheet.Cells(B, 2).Value = ipaSheet.Cells(A, 2).Value Then
                roundedValue = Application.WorksheetFunction.RoundDown(ipaValue - i8Value, -5)
                If ipaSheet.Cells(A, 5).Value = "" Then
                    masterSheet.Cells(B, 5).Value = roundedValue
                    'this just stores the unrounded CAD values
                    masterSheet.Cells(B, 100).Value = ipaValue - i8Value
                ElseIf ipaSheet.Cells(A, 5).Value = "USD" Then
                    masterSheet.Cells(B, 6).Value = roundedValue
                End If
                SL = True ' Maybe use "Exit Do" instead to quit the loop?
            End If
            B = B + 1
        Loop Until (SL = True) Or (B > lrIPA)
    Else
    End If
    A = A + 1
Loop Until A > lrIPA

如果您使用F8逐步完成此代码,那么在每个阶段检查变量的值应该很容易。

最新更新