2015-06-02 5 views
1

У меня есть код ниже, который дает мне ошибку времени выполнения 13, Тип Несоответствие по строке «Если ws1.cells (i, 13) =« Да »Затем« В этой колонке (Столбец M) содержится либо пустые ячейки или «Да». Я пробовал переопределить «i» как String, и это ничего не изменило. Цель состоит в том, что для каждой строки с «Да» в столбце M эта целая строка копируется во второй лист с именем «Вывод». Любая помощь с этой ошибкой была бы высоко оценена, также открыта для других идей, которые могут соответствовать моей цели. Спасибо!Ошибка несоответствия типа

Sub Sadface() 
    Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Trades") 
    Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Output") 

    For i = 2 To ws1.Range("M65536").End(xlUp).Row 
    If ws1.Cells(i, 13) = "Yes" Then 
    ws1.Rows(i).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row + 1) 
    End If 
    Next i 

    End Sub 
+0

Имеет ли 'ws1.Cells (i, 13)' формулу? –

+0

Попробуйте использовать 'ws1.Cells (i, 13) .Value', чтобы сделать VBA идеальным для вас значение в этой ячейке. – Degustaf

+0

Нет, он либо пуст (ничего), либо содержит «Да» – user3761404

ответ

-1

Попробуйте с этим, надеюсь, что это помогает

Sub justforyou() 
x = 2 
y = 2 'this will start the pasting process in the row 2, if you need to change it, you can change it 
Sheets("Output").Select 
Do While x <= 65536 
    If Sheets("Trades").Cells(x, 13).Value = "Yes" Then 
     Sheets("Trades").Rows(x).Copy 
     Cells(y, 1).Select 
     ActiveSheet.Paste 
     y = y + 1 
    End If 
    x = x + 1 
Loop 

End Sub

+0

Я не думаю, что это поможет. [ Bas (http://stackoverflow.com/questions/30604461/type-mismatch-error#comment49278442_30604461), у OP были ячейки с ошибками в них. Сравнение ошибки с «YES» приводит к несоответствию типов, которое также произойдет в этом коде. Кроме того, объяснение того, почему вы думаете, что это будет работать, более полезно, чем только код. –

+0

Это может быть улучшено, если вы оценили 'If IsError (Листы (« Торги »). Ячейки (x, 13))' * перед * оценкой 'If Sheets (« Торги »). Ячейки (x, 13) .Value =" Да "'. См. [Функция IsError] (https://msdn.microsoft.com/en-us/library/office/gg278547.aspx). – Jeeped

1

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

Sub Happyface() 
    Dim i As Long 
    Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Trades") 
    Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Output") 

    With ws1.Columns(13) 
     On Error Resume Next 
     .SpecialCells(xlCellTypeConstants, xlErrors).ClearContents 
     .SpecialCells(xlCellTypeFormulas, xlErrors).ClearContents 
     Err.Clear 
     On Error GoTo 0 
    End With 

    With ws1 
     For i = 2 To .Cells(Rows.Count, "M").End(xlUp).Row 
      If .Cells(i, 13) = "Yes" Then 
       .Rows(i).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row + 1) 
      End If 
     Next i 
    End With 

End Sub 

Насколько я стараюсь избегать использования On Error Resume Next ¹, это наиболее целесообразный способ борьбы с Range.SpecialCells method, когда вы не уверены в том, существуют ли они или нет.

¹ Концепция взлома чего-то только для того, чтобы увидеть, существует ли она, всегда казалась мне просто неправильной.

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