我的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
答案 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)
我有一些建议可以让你更容易解决问题。
在这行代码Loop Until SL = True Or B > lrIA
中是否有拼写错误?最后一个变量应该是lrIPA
吗?在编写这种行时使用括号是个好主意,因为它更容易阅读。 Loop Until (SL = True) Or (B > lrIPA)
您多次使用Cells
方法(例如If Cells(B, 2).Value = ...
),但未指定工作表。如果您最终更改ActiveSheet
。
如果您发现在代码中多次使用相同的工作表,那么使用工作表变量通常会使代码更易于阅读。例如,
如果是工作表(“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
您经常使用Worksheets("Master Sheet").Range("I6").Value
和Worksheets("Master Sheet").Range("I8").Value
中的值。将这些值存储在变量中然后只使用变量会更容易。如果单元格中的内容可能在宏期间发生变化,则改为使用范围变量。
将值存储在变量中还可以通过将鼠标悬停在变量上或使用“局部”窗口来检查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单步执行此代码,则应该很容易在每个阶段检查变量的值。