2015-08-10 6 views
1

Я использую следующий код в проекте, я работаю над:Ошибка выполнения «13»: Несоответствие типа на VBA код

Sub test() 
    Application.ScreenUpdating = False 
    Worksheets("Technician Report Summary").Range("G2:I8561").ClearContents 
    Dim Source As Range, Target As Range 
    Dim n As Long, i As Long 
    n = Range("C:C").Cells.Count 
    i = Cells(n, "C").End(xlUp).Row 
    Set Source = Range(Cells(1, "C"), Cells(n, "E")) 
    Set Target = Range("G2:I2") 

    For i = 2 To n 
     If Source.Cells(i, 1).Value <> "Not Used" And Not Application.WorksheetFunction.IsNA(Source.Cells(i, 3).Value) Then 
      Source.Rows(i).Copy 
      Target.PasteSpecial xlPasteValues 
      Set Target = Target.Offset(1) 
     End If 
    Next i 

    Application.CutCopyMode = False 
    Application.ScreenUpdating = True 
End Sub 

Когда я запускаю код оказывается работать надлежащим образом , он копирует список отфильтрованных значений, следующих критериям, установленным в коде, в другое место на том же рабочем листе. Проблема в том, что я также получаю следующую ошибку:

Run-time error '13': Type mismatch

Что я получил? Я думаю, что я сделал какую-то ошибку в объявлении переменных или что-то в этом роде, но я недостаточно знаком с VBA, чтобы точно определить, в чем проблема.

Любая помощь будет оценена по достоинству.

EDIT:

Извините, что не ясны.

У меня есть набор значений на листе «Краткое описание отчета о техническом обслуживании», который занимает диапазон C2: E8561. Есть некоторые ошибочные значения, которые я хочу отфильтровать и скопировать, это ошибки «Не используется» и «# N/A». Приведенный выше код копирует значения и затем вставляет их рядом с исходным, нефильтрованным набором значений с экземплярами «Не используется» и «# N/A», удаленным в столбцах G, H и I.

Нет строки выделяется как проблема, когда я запускаю его, появляется диалоговое окно с ошибкой, и когда я нажимаю «ОК», ничего не подсвечивается.

EDIT 2:

Я сделал изменения, которые @KFitchter предложить и теперь, кажется, карцер. Я ударил ключ побег и следующая строка была выделена:

If Source.Cells(i, 1).Text <> "Not Used" And Not Application.WorksheetFunction.IsNA(Source.Cells(i, 3).Value) Then 

EDIT 3:

Просто подумал о чем-то еще, что можно было бы возиться с ним. Значения в столбцах C, D и E на самом деле являются функциями вытягивания значений из других мест в книге. Вот пример одной из этих функций.

=INDEX('RAW DATA'!$A:$A,$B2)

+0

На какой строке возникает ошибка? – KFichter

+0

сторона примечания: 'Set Source = Range (Ячейки (1,« C »),« Ячейки »(n,« E »))' не определяет, из какого листа извлекаются «диапазон» или «ячейки». Вам нужно уточнить, что для этого нужно работать/работать без неожиданных будущих ошибок. – Brad

+0

Ваш вопрос очень неясен. Для одного (как упоминает @KFichter) вы не сказали нам строку ошибки. Во-вторых, вы не сказали нам, что код должен делать для правильной оценки. – Chrismas007

ответ

1

Так что я не совсем уверен, в чем проблема.

Я изменил ваш код только крошечный бит (используя мое первоначальное предположение) для:

Sub test() 
    Application.ScreenUpdating = False 
    Worksheets("Technician Report Summary").Range("G2:I8561").ClearContents 
    Dim Source As Range, Target As Range 
    Dim n As Long, i As Long 
    n = Range("C:C").Cells.Count 
    i = Cells(n, "C").End(xlUp).Row 
    Set Source = Range(Cells(1, "C"), Cells(n, "E")) 
    Set Target = Range("G2:I2") 

    For i = 2 To n 
     If Source.Cells(i, 1).Text <> "Not Used" And Not Application.WorksheetFunction.IsNA(Source.Cells(i, 3).Value) Then 
      Source.Rows(i).Copy 
      Target.PasteSpecial xlPasteValues 
      Set Target = Target.Offset(1) 
     End If 
    Next i 

    Application.CutCopyMode = False 
    Application.ScreenUpdating = True 
End Sub 

Где единственное реальное различие является «Value» в «Текст». Я не получаю никаких ошибок. Единственное, что нужно сделать, чтобы сделать то, что он должен делать, потому что существует так много строк.

Теперь ... Я предлагаю, возможно, делать то, что вы делаете немного по-другому.

Sub test() 
    Application.ScreenUpdating = False 

    Worksheets("Technician Report Summary").Range("G2:I8561").ClearContents 

    Dim Source As Range, Target As Range 
    Dim n As Long 

    ActiveSheet.Range("C:E").AutoFilter Field:=1, Criteria1:= _ 
     Array("<>#N/A", "<>Not Used"), Operator:=xlAnd 
    ActiveSheet.Range("C:E").AutoFilter Field:=3, Criteria1:= _ 
     "<>#N/A", Operator:=xlAnd 

    n = ActiveSheet.Cells(Rows.Count, "C").End(xlUp).Row 

    Set Source = Range("C2:E" & n).SpecialCells(xlCellTypeVisible) 
    Set Target = Range("G2") 

    Source.Copy 
    Target.PasteSpecial (xlPasteValues) 

    Application.CutCopyMode = False 
    Application.ScreenUpdating = True 

    Range("C:E").AutoFilter 
End Sub 

Это в основном делает то, что вы пытались сделать, но с автофильтром. Это намного быстрее, чем цикл через каждую отдельную ячейку и делает то же самое в конце. Я надеюсь, что это поможет ...

+0

То же самое происходит, оно блокируется и когда я нажимаю клавишу escape, чтобы выйти из нее, выделяется первая строка If. – nickelcap

+0

Не могли бы вы собрать несколько выборочных (нечувствительных) данных, которые вызывают ошибку, чтобы я мог играть с VBA? Я сделал кое-что на основе описания, которое вы дали, но он работает. – KFichter

+0

Хорошо, я сделал то, что вы предложили. Вот ссылка на него в Google Диске: [Технический отчет - Устранение неполадок] (https://drive.google.com/open?id=0B_fZnVjXU9YAUlVQOTdNSHRrdG8). – nickelcap

0

Начните с указания родителя всех ваших диапазонов и ссылок на ячейки.

Не сочетайте проверку ошибок с другими сравнениями строк или булевыми проверками. Сначала проверьте ошибку, а затем обработайте другие логические проверки в новой строке кода.

Линия n = .Range("C:C").Cells.Count помещает 1,048,576 в n. Вы действительно хотите Set src = .Range("C1:E1048576) и For i = 2 To 1048576?

Прямые текстовые сравнения обычно чувствительны к регистру.

Использовать прямую передачу значений по копии, вставить специальные, значения, когда это возможно.

Put все те точки вместе:

Sub test() 
    Dim src As Range, trgt As Range, nas As Range 
    Dim n As Long, i As Long, bERR As Boolean 

    Application.ScreenUpdating = False 

    With Worksheets("Technician Report Summary") 
     .Range("G2:I8561").ClearContents 
     n = .Cells(Rows.Count, "C").End(xlUp).Row 
     Set src = .Range(.Cells(1, "C"), .Cells(n, "E")) 
     Set trgt = .Range("G2:I2") 
    End With 

    For i = 2 To n 
     If Not IsError(src.Cells(i, 3)) Then 
      Debug.Print src.Cells(i, 3).Text 
      If LCase(src.Cells(i, 1).Value2) <> "not used" Then 
       trgt = src.Rows(i).Value 
       Set trgt = trgt.Offset(1) 
      End If 
     End If 
    Next i 

    Application.ScreenUpdating = True 
End Sub 

Этого должно быть достаточно, чтобы заставить вас работать.

+0

Это очень хорошо работает, спасибо! – nickelcap

+0

[Рад, что вы разобрались] (http://stackoverflow.com/help/someone-answers). – Jeeped

Смежные вопросы