Выбрать метод класса Range не удалось с помощью VBA

Это код, с которым я сейчас работаю, и я получаю эту проблему. Я новичок в 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

Я полагаю, что это то, что вы подразумеваете, делая его активным? Тем не менее, я все еще получаю метод "Диапазон" объекта "Рабочий стол", ошибка 1004

Ответ 1

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

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

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

Или

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

то же самое.

Ответ 2

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

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

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

Ошибка, метод 'Range' объекта '_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. Это может стать важным, поскольку ваш код растет или находится в другой ситуации.

Ответ 3

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

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

Ответ 4

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