Выбрать метод класса 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