2015-09-10 4 views
0

Я отлично выполнял макрос, а затем внезапно макрос начал показывать ошибка времени выполнения 13 'Тип несоответствия, и я не могу понять это. Та часть, которая всегда получать выделена является:Несоответствие типов по значениям: 'runtime error 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 
+0

Что такое значение 'x', когда ошибка первого происходит? –

+0

Аналогичным образом - что такое значение 'Cells (x," E ")', когда вы видите ошибку? –

+0

@ Jeeped Я думаю, что к вам обратился комментарий - то есть вы уже есть. Не хочу, чтобы все * были, хотя и уверенно :) – pnuts

ответ

0

Вы всегда должны объявлять типы переменных. Это облегчает отладку. В настоящее время вы сравниваете диапазоны, используя численное сравнение:

Set Num1 = MatchData.Range("$I$3") 
Set Num2 = MatchData.Range("$K$3") 
... 
If Cells(x, "E") >= Num1 And Cells(x, "E") <= Num2 Then 

VBA поможет вам в том, что он будет сравнивать числа, если клетки содержат цифры - однако, это не получится, если отвратительно клетки содержат текст, потому что < = и = > для строк не определены.

Я бы предложил что-то вроде этого. Сначала вспомогательная функция:

Private Function GetInt(rng as Range) As Integer 
    On Error Resume Next 
    GetInt = CInt(rng.Value) 
End Function 

Затем измените свой код:

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, если клетки содержат текст
  • Ты клетки содержат целые числа. Если они содержат десятичные числа, вы должны изменить вспомогательную функцию для этого:
 
Private Function GetDouble(rng as Range) As Double 
    On Error Resume Next 
    GetDouble = CDbl(rng.Value) 
End Function 
0

Я хотел бы проверить, если MatchData.Range("$I$3"),MatchData.Range("$K$3") и клетки из MatchData.Range("E6") в MatchData.Range("E5000") являются числовыми. Надеюсь, это поможет вам.