Произошла исключительная ситуация microsoft excel метод select из класса range завершен неверно
This is the code that I'm currently working with, and I'm getting this problem. I'm novice at Excel and I can't figure out what's wrong.
The error is Select method of Range class failed via VBA, Error 1004 . Any ideas?
ETA:
So I just changed the code to
I believe this is what you mean by making it active?
However I'm still getting Method 'Range' of object '_Worksheet' failed, error 1004 .
5 Answers 5
I believe you are having the same problem here.
The sheet must be active before you can select a range on it.
Also, don't omit the sheet name qualifier:
which is the same.
Had the same problem. Thanks for the answer. It seems that if you pick another workbook you don't have to specify it.
The correct answer to this particular questions is "don't select". Sometimes you have to select or activate, but 99% of the time you don't. If your code looks like
You probably need to refactor and consider not selecting.
The error, Method 'Range' of object '_Worksheet' failed, error 1004, that you're getting is because the sheet with the button on it doesn't have a range named "Result". Most (maybe all) properties that return an object have a default Parent object. In this case, you're using the Range property to return a Range object. Because you don't qualify the Range property, Excel uses the default.
The default Parent object can be different based on the circumstances. If your code were in a standard module, then the ActiveSheet would be the default Parent and Excel would try to resolve ActiveSheet.Range("Result"). Your code is in a sheet's class module (the sheet with the button on it). When the unqualified reference is used there, the default Parent is the sheet that's attached to that module. In this case they're the same because the sheet has to be active to click the button, but that isn't always the case.
When Excel gives the error that includes text like '_Object' (yours said '_Worksheet') it's always referring to the default Parent object - the underscore gives that away. Generally the way to fix that is to qualify the reference by being explicit about the parent. But in the case of selecting and activating when you don't need to, it's better to just refactor the code.
Here's one way to write your code without any selecting or activating.
When I'm in a class module, like the sheet's class module that you're working in, I always try to do things in terms of that class. So I use Me.Parent instead of ActiveWorkbook. It makes the code more portable and prevents unexpected problems when things change.
I'm sure the code you have now runs in milliseconds, so you may not care, but avoiding selecting will definitely speed up your code and you don't have to set ScreenUpdating. That may become important as your code grows or in a different situation.
у меня несколько страниц в книге и мне надо выделить диапазон ячеек, допустим B2:E2 для каких-то действий. делаю Range("B2:E2").Select, он мне пишет что я или за пределы диапазона вышел или неправильно использую select. перед range писал и к кокой книги.рабочимуЛисту отностится, короче ничего не помогает.
код проги:
' Sheets(nnPage).Range("B2:E2").Select
' With Selection
' .HorizontalAlignment = xlCenter
' .VerticalAlignment = xlBottom
' .WrapText = False
' .Orientation = 0
' .AddIndent = False
' .IndentLevel = 0
' .ShrinkToFit = False
' .ReadingOrder = xlContext
' .MergeCells = False
' End With
' Selection.Merge
Ошибка: "метод Select из класса Range завершен неверно"
P.S. Можь че не так делаю. Весьма признателен всем кто поможет. Заранее спасибо.
1 ответ
Выделение (Select) и активация (Activate) в большинстве случаев (и данный не является исключением) есть операция совершенно ненужная. К примеру, для того, чтобы изменить параметры форматирования диапазона ячеек неактивного рабочего листа, можно просто указать родителей (хотя справедливости ради следует заменить, что попытка изменить параметры форматирования в защищённом рабочем листе неизменно приведёт к ошибке, причём ошибка возникнет даже в том случае, если ячейки, параметры форматирования которых необходимо изменить, будут не защищены. впрочем, подобное безобразие продолжалось только до появления MS Excel XP)
'Выделение содержит несколько значений данных.
'Об'единение ячеек приведёт к потере всех значений,
'кроме левого верхнего.
With ThisWorkbook.Worksheets(1).Range("B2:E2")
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True '.Merge
End With
Что касается об'екта Range и его методов Select/Activate, то здесь всё просто … для того, чтобы выделить некий диапазон необходимо сначала активировать нужную рабочую книгу (если книга уже является активной, этот шаг можно пропустить), затем активировать нужный рабочий лист (если лист уже является активным, то этот шаг также можно пропустить) и только затем выделять диапазон. Однако повторюсь, выделение диапазона не есть необходимость, но если очень хочется, то и в этом случае можно обойтись без вышеупомянутых методов, ибо :
Application.Goto Reference:= _
Workbooks("Книга1.xls").Worksheets("Лист1").Range("B2:E2") ', Scroll:=True
Вместо имени книги и листа можно использовать их индекс(номер)
'Application.Goto Application.Range("[Книга1.xls]Лист1!B2:E2") ', True
Естественно, что в момент выполнения этой инструкции рабочая книга с именем "Книга1.xls" обязательно должна быть открыта и в ней должен наличествовать рабочий лист с именем "Лист1"
Подскажите пожалуйста что не так?
Курсор находится на Листе 1 (то есть активен Лист 1) , я запускаю макрос ниже, чтобы выделить ячейки на неактивном Листе 2.
? Почему ругань: Run Time Error 1004 Метод Select из класса Range завершен неверно
В коде вроде указал явно , что выделять надо ячейки именно из Листа 2.
Конечно, если активировать Лист 2 и потом запустить код, то он сработает правильно , но мне нужно именно запускать код , когда Лист 2 неактивен.
Или так нельзя делать?
Public Sub Example()
Worksheets("Лист2").Range("A2:A" & Worksheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row).Select
End Sub
Подскажите пожалуйста что не так?
Курсор находится на Листе 1 (то есть активен Лист 1) , я запускаю макрос ниже, чтобы выделить ячейки на неактивном Листе 2.
? Почему ругань: Run Time Error 1004 Метод Select из класса Range завершен неверно
В коде вроде указал явно , что выделять надо ячейки именно из Листа 2.
Конечно, если активировать Лист 2 и потом запустить код, то он сработает правильно , но мне нужно именно запускать код , когда Лист 2 неактивен.
Или так нельзя делать?
Public Sub Example()
Worksheets("Лист2").Range("A2:A" & Worksheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row).Select
End Sub
Подскажите пожалуйста что не так?
Курсор находится на Листе 1 (то есть активен Лист 1) , я запускаю макрос ниже, чтобы выделить ячейки на неактивном Листе 2.
? Почему ругань: Run Time Error 1004 Метод Select из класса Range завершен неверно
В коде вроде указал явно , что выделять надо ячейки именно из Листа 2.
Конечно, если активировать Лист 2 и потом запустить код, то он сработает правильно , но мне нужно именно запускать код , когда Лист 2 неактивен.
Или так нельзя делать?
Public Sub Example()
Worksheets("Лист2").Range("A2:A" & Worksheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row).Select
End Sub
Здравствуйте, не срабатывает макрос по переносу данных из одной книги в другую
В первой книге в ячейках значения полученные путем использования формул и переноса из листа в лист
а вторая книга пустая
выдает ошибку:
Run-time error 1004
метод Select из класса Range завершен неверно
Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:\Users\книга1.xlsm"
'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("книга1.xlsm").Worksheets("Лист4").Range("A1:G9").Copy
'Активируем нужную нам книгу
Workbooks("книга2.xlsm").Activate
'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste
'Закрываем книгу откуда мы скопировали данные
Workbooks("книга1.xlsm").Close
End Sub
Здравствуйте, не срабатывает макрос по переносу данных из одной книги в другую
В первой книге в ячейках значения полученные путем использования формул и переноса из листа в лист
а вторая книга пустая
выдает ошибку:
Run-time error 1004
метод Select из класса Range завершен неверно
Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:\Users\книга1.xlsm"
'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("книга1.xlsm").Worksheets("Лист4").Range("A1:G9").Copy
'Активируем нужную нам книгу
Workbooks("книга2.xlsm").Activate
'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste
'Закрываем книгу откуда мы скопировали данные
Workbooks("книга1.xlsm").Close
End Sub
выдает ошибку:
Run-time error 1004
метод Select из класса Range завершен неверно
Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:\Users\книга1.xlsm"
'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("книга1.xlsm").Worksheets("Лист4").Range("A1:G9").Copy
'Активируем нужную нам книгу
Workbooks("книга2.xlsm").Activate
'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste
'Закрываем книгу откуда мы скопировали данные
Workbooks("книга1.xlsm").Close
End Sub
Помогите пожалуйста!
Есть код макроса, который находится на листе, а не в модуле.
Требуется определенные ячейки защитить от редактирования.
[vba]
ActiveWorkbook.Activate
Sheets("Entrance").Activate
Columns("A:L").Select
Selection.Locked = True
Sheets("Entrance").Activate
Получаю ошибку "Run-time error '1004' Метод Select из класса Range завершен неверно" и выделяется строка:
[vba]
Помогите пожалуйста!
Есть код макроса, который находится на листе, а не в модуле.
Требуется определенные ячейки защитить от редактирования.
[vba]
ActiveWorkbook.Activate
Sheets("Entrance").Activate
Columns("A:L").Select
Selection.Locked = True
Sheets("Entrance").Activate
Получаю ошибку "Run-time error '1004' Метод Select из класса Range завершен неверно" и выделяется строка:
[vba]
Помогите пожалуйста!
Есть код макроса, который находится на листе, а не в модуле.
Требуется определенные ячейки защитить от редактирования.
[vba]
ActiveWorkbook.Activate
Sheets("Entrance").Activate
Columns("A:L").Select
Selection.Locked = True
Sheets("Entrance").Activate
Получаю ошибку "Run-time error '1004' Метод Select из класса Range завершен неверно" и выделяется строка:
[vba]
KuklP,
Все равно не работает.
"Run-time error '1004' Нельзя установить свойство Locked класса Range" Red_Sloth
У меня работает. Может для начала снять защиту листа, заблокировать ячейки, а потом уж защищать лист? Так обычно принято Попробуйте:
[vba]
Public Sub www()
With Sheets("Entrance")
.Unprotect
.Range("A:L").Locked = True
.Protect UserInterfaceOnly:=True
End With
End Sub
У меня работает. Может для начала снять защиту листа, заблокировать ячейки, а потом уж защищать лист? Так обычно принято Попробуйте:
[vba]
Public Sub www()
With Sheets("Entrance")
.Unprotect
.Range("A:L").Locked = True
.Protect UserInterfaceOnly:=True
End With
End Sub
Public Sub www()
With Sheets("Entrance")
.Unprotect
.Range("A:L").Locked = True
.Protect UserInterfaceOnly:=True
End With
End Sub
KuklP,
О, так заработало, спасибо большое!
А если мне при этом надо еще и первые четыре строки защитить?
Как будет корректнее написать Range?
KuklP,
О, так заработало, спасибо большое!
А если мне при этом надо еще и первые четыре строки защитить?
Как будет корректнее написать Range? Red_Sloth
Читайте также: