Vba 值的类型不匹配:“运行时错误13”

Vba 值的类型不匹配:“运行时错误13”,vba,excel,Vba,Excel,我正在完美地运行我的宏,然后突然宏开始显示运行时错误13'类型不匹配,我无法找出它。始终突出显示的部分是: If Cells(x, "E") >= Num1 And Cells(x, "E") <= Num2 Then 我认为我的编码是正确的,因为我的其他宏都是这样编码的,但由于某些原因,这不起作用 Sub PPM() Dim RawData As Worksheet Dim MatchData As Worksheet Set MatchData = Worksheet

我正在完美地运行我的宏,然后突然宏开始显示运行时错误13'类型不匹配,我无法找出它。始终突出显示的部分是:

  If Cells(x, "E") >= Num1 And Cells(x, "E") <= Num2 Then
我认为我的编码是正确的,因为我的其他宏都是这样编码的,但由于某些原因,这不起作用

Sub PPM()

Dim RawData As Worksheet
Dim MatchData As Worksheet


Set MatchData = Worksheets("MATCH")
Set Pastesheet = Worksheets("PASTE")

Pastesheet.Select
Pastesheet.Range("$A$3:$F$5000").Clear

MatchData.Select

Application.ScreenUpdating = False



Set Num1 = MatchData.Range("$I$3")
Set Num2 = MatchData.Range("$K$3")

Dim x As Long

For x = 6 To 5000

If Cells(x, "E") >= Num1 And Cells(x, "E") <= Num2 Then

 Cells(x, "A").Resize(, 6).Copy

Pastesheet.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial _
xlPasteValuesAndNumberFormats


    End If

Next x

Application.ScreenUpdating = True

Pastesheet.Select

MsgBox "Search Complete"

End Sub

我会检查MatchData.Range$I$3、MatchData.Range$K$3以及MatchData.Range6到MatchData.Range5000之间的单元格是否为数字。我希望它能帮助您。

您应该始终声明变量的类型。它使调试变得非常容易。当前,您正在使用数字比较来比较范围:

Set Num1 = MatchData.Range("$I$3")
Set Num2 = MatchData.Range("$K$3")
...
If Cells(x, "E") >= Num1 And Cells(x, "E") <= Num2 Then
然后将代码更改为:

Dim Num1 As Integer, Num2 As Integer
Num1 = GetInt(MatchData.Range("$I$3"))
Num2 = GetInt(MatchData.Range("$K$3"))
...
If GetInt(Cells(x, "E")) >= Num1 And GetInt(Cells(x, "E")) <= Num2 Then
现在,您的代码将始终不会受到单元格中意外数据的影响。请注意,我假设有两件事:

如果单元格包含文本,则代码可以假定值为0 你的单元格包含整数。如果它们包含十进制数,则应将helper函数更改为:
当错误第一次发生时,x的值是多少?类似地,当你看到错误时,Cellsx,E的值是多少?黑暗中的一个镜头:你的Cellsx,E有一个公式错误,比如N/A或类似的错误。我实际上发现了,E范围内的一些单元格中有一个N/A,必须添加一个公式来格式化,谢谢大家!
Dim Num1 As Integer, Num2 As Integer
Num1 = GetInt(MatchData.Range("$I$3"))
Num2 = GetInt(MatchData.Range("$K$3"))
...
If GetInt(Cells(x, "E")) >= Num1 And GetInt(Cells(x, "E")) <= Num2 Then
Private Function GetDouble(rng as Range) As Double On Error Resume Next GetDouble = CDbl(rng.Value) End Function