Не удалось выбрать метод класса Range через VBA - PullRequest
14 голосов
/ 11 октября 2010

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

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. Есть идеи?

Спасибо.

Редактировать:

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

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

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

Ответы [ 4 ]

27 голосов
/ 11 октября 2010

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

Кроме того, не опускайте квалификатор имени листа:

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

Или,

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

то же самое.

15 голосов
/ 16 апреля 2012

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

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

Вероятно, вам необходимо выполнить рефакторинг и подумать о том, чтобы не выбирать.

Ошибка метода «Диапазон» объекта «_Worksheet», ошибка 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.Это может стать важным по мере роста вашего кода или в другой ситуации.

2 голосов
/ 16 марта 2015

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

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
0 голосов
/ 04 февраля 2018

Так легко и просто можно обойти это.
Вместо использования sheet(x).range используйте Activesheet.range("range").select

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...