2017-01-12 2 views
1

Привет У меня есть приведенный ниже код для перемещения данных. Это отлично работает при использовании имен листов по умолчанию. Однако, когда я использую другое имя для листов (вместо sheet1, sheet2), я получаю ошибку «Object required».Ошибка объекта в VBA при объявлении имени листа custome

Здесь «Латентность» - это лист1, а «TP» - лист2.

Может ли кто-нибудь направить меня на то, как это исправить?

Sub sbMoveData() 
Dim lRow As Integer, i As Integer, j As Integer 
'Find last roe in Sheet1 
lRow = Latency.Cells.SpecialCells(xlLastCell).Row 
j = 1 
For i = 1 To lRow 
If UCase(Latency.Range("E" & i)) = "COMPATIBLE" And UCase(Latency.Range("O" & i)) = "Pass" Then 
Sheets("Latency").Range("M" & i).Copy Destination:=Sheets("TP").Range("A" & j) 
j = j + 1 
End If 
Next 

End Sub

+2

* Задержка *, очевидно, является листом, но не был ** Dimmed ** или ** Set ** в области этого под. –

+0

Я постараюсь сказать, что написал ученик Gary's выше, где в этом 'Sub' у вас есть' Dim Latency As Worksheet', а позже 'Set Latency = Worksheets (« Yoursheetname »)'? Хотя позже вы правильно используете его с помощью «Таблиц» («Latency») ' –

ответ

1

вы сделали это прямо на линии

Worksheets("Latency").Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j) 

, но прежде, вы использовали Latency, как если бы это был объект, в то время как это просто имя. Для того, чтобы получить объект листа по его имени, всегда используйте sheets("name") или Worksheets("name")

Sub sbMoveData() 
    Dim lRow As Integer, i As Integer, j As Integer 
    'Find last roe in Sheet1 
    With Worksheets("Latency") 
     lRow = .Cells.SpecialCells(xlLastCell).Row 
     j = 1 
     For i = 1 To lRow 
      If UCase(.Range("E" & i)) = "COMPATIBLE" And UCase(.Range("O" & i)) = "Pass" Then 
       .Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j) 
       j = j + 1 
      End If 
     Next 
    End With 
End Sub 
+0

Я пробовал это, и при его запуске не было ошибок. Но результата тоже не было. Код не работал –

+0

@walterwhile Тогда есть еще одна ошибка, возможно, в данных рабочего листа ... может быть, нет совпадения. перейдите в код и посмотрите, найдете ли вы какие-либо совпадения. FWIW, проблема этого вопроса решена. –

0

попробовать это:

If UCase(Latency.Range("E" & i)) = "COMPATIBLE" And UCase(Latency.Range("O" & i)) = "Pass" Then 
Worksheets("Latency").Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j) 
j = j + 1 
End If 
+0

То же самое: ошибка lpoint = latency.Cells.SpecialCells (xlLastCell) .Row' –

+0

Возможно, вы просто измените отображаемое имя листа, а не («Задержка»). range() –

4

Когда вы Sheet1.Range, вы ссылки на объект глобального сфера Worksheet, что VBA автоматически объявляет для вас. Этот «свободный» объект указывает на ThisWorkbook.Worksheets("Sheet1") по умолчанию, и использование его вместо получения точной ссылки на объект из коллекции Worksheets - очень хорошая идея.

Теперь, если вы маркированы, что Sheet1 лист «Задержка», вы установите его Name, но не его CodeName - и это CodeName, что VBA использует для создания глобального идентификатора можно использовать в коде. Вы можете изменить это в Свойства ToolWindow (F4):

Properties

Обратите внимание на (первый) недвижимость (Name) еще говорит "Лист1"? Изменить что Latency и теперь этот код становится действительным:

lRow = Latency.Cells.SpecialCells(xlLastCell).Row 

Properties

Теперь, когда вы начинаете использовать Latency глобальный идентификатор, использовать его везде - не идут и начать выборку точно такой же рабочий лист от коллекций ActiveWorkbook.Worksheets или ActiveWorkbook.Sheets!

Вместо этого:

Sheets("Latency").Range("M" & i).Copy 

Вы что:

Latency.Range("M" & i).Copy 

Сделайте то же самое для другого листа тоже. Обратите внимание, что коллекция Sheets может содержать диаграммы, а не только рабочие листы - когда вы делаете do, вы можете получить ссылку на объект из коллекции (например, из рабочего листа, который вы создали во время выполнения), для этого вы должны использовать коллекцию Worksheets.

Вы также должны правильно изучить indenting (отказ от ответственности: эта ссылка указывает на сайт моего любимого проекта) и ваш код.

+0

FWIW Я бы выбрал 'LatencySheet' и' TpSheet' вместо 'Latency' и' TP'. –

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