无法修复类型不匹配错误

时间:2015-07-03 17:09:59

标签: vba excel-vba error-handling excel

我的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

2 个答案:

答案 0 :(得分:0)

尝试确保VBA将单元格的内容识别为数字,方法是按照大小将它们显式地转换为整数或长整数。要做到这一点,将使用:

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

对于更长的数字,请用clng替换cint。如果它们是浮点数,请使用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 :(得分:0)

我有一些建议可以让你更容易解决问题。

  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. ,这可能会很危险
  4. 如果您发现在代码中多次使用相同的工作表,那么使用工作表变量通常会使代码更易于阅读。例如,

  5.   

    如果是工作表(“IPA”)。单元格(A,4).Value - 工作表(“主表”)。范围(“I8”)。值>工作表(“主表”)。范围(“I6”)。值然后

    可以改为:

    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. 将值存储在变量中还可以通过将鼠标悬停在变量上或使用“局部”窗口来检查IDE窗口中的值。如果您的数据存在问题(例如,有文字,但它应该是数字),那么在将值存储到变量中时也应该选择此项。

    3. 将所有这些点放在一起并将它们应用到您的代码块中,它变为:

      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单步执行此代码,则应该很容易在每个阶段检查变量的值。