2010-10-11 2 views
5

Это код, с которым я сейчас работаю, и у меня возникает эта проблема. Я новичок в Excel, и я не могу понять, что случилось.Выберите метод класса Range с ошибкой через VBA

Private Sub cmdRecord_Click() 
Sheets("BxWsn Simulation").Range("Result").Select //This is the line with the problem, as excel told me. 
    Selection.Copy 
    Sheets("Reslt Record").Select 
    Sheets("Reslt Record").Range("A5000").End(xlUp).Offset(1).Select 
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ 
     xlNone, SkipBlanks:=False, Transpose:=False 
    Sheets("CuCon Simulator").Select 
    Application.CutCopyMode = False 
    Range("Improvement").Select 
End Sub 

Ошибка Выберите метод класса Range не удалось с помощью VBA, ошибки 1004. Любые идеи?

Спасибо.

Edit:

Так что я просто изменил код

Sheets("BxWsn Simulation").Select 
Range("Result").Select 

Я считаю, что это то, что вы имеете в виду, делая его активным? Однако я все еще получаю метод 'Range' объекта '_Worksheet', ошибка 1004

+0

Лучше оставить комментарий к ответу, чем молча отредактировать вопрос; в последнем случае автор ответа не получит никаких уведомлений о вашей последующей деятельности. – GSerg

+0

Я обновил свой ответ. – GSerg

ответ

12

Я считаю, что у вас здесь the same problem.
Лист должен быть активным, прежде чем вы сможете выбрать диапазон на нем.

Кроме того, не опустить имя листа спецификатор:

Sheets("BxWsn Simulation").Select 
Sheets("BxWsn Simulation").Range("Result").Select 

Или

With Sheets("BxWsn Simulation") 
    .Select 
    .Range("Result").Select 
End WIth 

что то же самое.

+0

Спасибо, что сделал трюк. – guesthouse123

10

Правильный ответ на этот вопрос - «не выбирать». Иногда вам нужно выбрать или активировать, но в 99% случаев вы этого не сделаете. Если ваш код выглядит так:

Select something 
Do something to the selection 
Select something else 
Do something to the selection 

Возможно, вам придется реорганизовать и не выбирать.

Ошибка, метод «Диапазон» объекта «_Решет» не выполнен, ошибка 1004, которую вы получаете, состоит в том, что лист с кнопкой на нем не имеет диапазона с именем «Результат». Большинство (возможно, все) свойств, возвращающих объект, имеют родительский объект по умолчанию. В этом случае вы используете свойство Range для возврата объекта Range. Поскольку вы не квалифицируете свойство Range, Excel использует значение по умолчанию.

Родительский объект по умолчанию может отличаться в зависимости от обстоятельств. Если ваш код был в стандартном модуле, то ActiveSheet будет родителем по умолчанию, и Excel попытается разрешить ActiveSheet.Range («Результат»). Ваш код находится в модуле класса листа (лист с кнопкой на нем). Когда используется неквалифицированная ссылка, родитель по умолчанию - это лист, прикрепленный к этому модулю. В этом случае они одинаковы, потому что лист должен быть активным, чтобы нажимать кнопку, но это не всегда так.

Когда Excel дает ошибку, которая включает в себя текст, такой как «_Object» (ваш «_Worksheet»), он всегда ссылается на родительский объект по умолчанию - это подчеркивает это подчеркивание. Как правило, способ исправить это, чтобы квалифицировать ссылку, будучи явным о родительском. Но в случае выбора и активации, когда вам это не нужно, лучше просто реорганизовать код.

Вот один из способов написать свой код без какого-либо выбора или активации.

Private Sub cmdRecord_Click() 

    Dim shSource As Worksheet 
    Dim shDest As Worksheet 
    Dim rNext As Range 

    'Me refers to the sheet whose class module you're in 
    'Me.Parent refers to the workbook 
    Set shSource = Me.Parent.Worksheets("BxWsn Simulation") 
    Set shDest = Me.Parent.Worksheets("Reslt Record") 

    Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0) 

    shSource.Range("Result").Copy 
    rNext.PasteSpecial xlPasteFormulasAndNumberFormats 

    Application.CutCopyMode = False 

End Sub 

Когда я в модуле класса, как класса модуля листа, что вы работаете, я всегда стараюсь делать вещи с точки зрения этого класса. Поэтому я использую Me.Parent вместо ActiveWorkbook. Это делает код более портативным и предотвращает непредвиденные проблемы, когда что-то меняется.

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

+0

+1 этот ответ заслуживает одного. –

+0

@Dick Kusleika, очень информативный, спасибо. – jmaz

1

Это сработало для меня.

RowCounter = Sheets(3).UsedRange.Rows.Count + 1 

Sheets(1).Rows(rowNum).EntireRow.Copy 
Sheets(3).Activate 
Sheets(3).Cells(RowCounter, 1).Select 
Sheets(3).Paste 
Sheets(1).Activate 
-1

Вот как вы обходите это легким несложным способом.
Вместо использования sheet(x).rangeActivesheet.range("range").select

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