[/vba] а если активным будет другой лист, то возникнет ошибка времени выполнения - ибо Cells(2, 1) и Cells(Rows.Count, "A") берутся для активного листа, а диапазон - совсем на другом листе.
если Вас интересует нужный диапазон листа Лист2 вне зависимости от того, какой лист активной книги активен - то "дописывать" лист нужно перед каждым объектом/свойством: [vba]
[/vba] а если активным будет другой лист, то возникнет ошибка времени выполнения - ибо Cells(2, 1) и Cells(Rows.Count, "A") берутся для активного листа, а диапазон - совсем на другом листе.
если Вас интересует нужный диапазон листа Лист2 вне зависимости от того, какой лист активной книги активен - то "дописывать" лист нужно перед каждым объектом/свойством: [vba]
[/vba] Прелесть в том, что к листу обращаемся один раз.
Вместо Sheets("Лист2") можно Sheets(2) или Лист2 (если, конечно, свойства у этого листа: Нэйм = Лист2, Индекс = 2 и КодНэйм = Лист2)
По этому поводу вот ссылочка http://www.excelworld.ru/forum/7-4482-1 а там есть еще ссылка от Сергея (SkyPro) на пост Александра (ikki), в котором все вообще прекрасно описано.
wild_pig и ikki, вам тоже спасибо за подробную информацию. "Вот где была собака зарыта!",а я данные перебросила на активный лист, т.к. на другом листе выдавало ошибку.
wild_pig и ikki, вам тоже спасибо за подробную информацию. "Вот где была собака зарыта!",а я данные перебросила на активный лист, т.к. на другом листе выдавало ошибку. karmen185
Александр, если можно вас так называть, я бы удивилась, если вы бы не предложили какое-нибудь решение. Вам тоже спасибо за ответ и ссылку. Завтра, нет, уже сегодня прочитаю. Всё, пишу и сплю. Спокойной ночи.
Александр, если можно вас так называть, я бы удивилась, если вы бы не предложили какое-нибудь решение. Вам тоже спасибо за ответ и ссылку. Завтра, нет, уже сегодня прочитаю. Всё, пишу и сплю. Спокойной ночи. karmen185
или arr = Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value но нежелательно.
Я бы написал: "крайне не желательно" (не зная тонкостей), и вообще лучше всегда явно указывать родителей, в т.ч. и для объектов Rows и Sheets. Например, одна и та же форма обращения (с неявными родителями для Range, Rows и Sheets), вызванная из разных модулей, даст разные результаты. [vba]
[/vba] (1) - вызов из модуля листа "Лист2" (CodeName = Лист2) - если активна текущая книга, то произойдет корректное обращение к указанному диапазону, но если активна другая книга, то возникнет Run-time error 1004 (т.к. родителем объектов Range и Rows будет ThisWorkbook.Лист2, а родителем Sheets будет ActiveWorkbook), либо Run-time error 9 (если в активной книге нет листа с именем "Лист2" или у активной книги строк на листе больше (формат 2007 и выше), чем у текущей (формат 2003 и ниже)) (2) - вызов из модуля другого листа той же книги - те же ошибки, что и в (1), даже если будет активной текущая книга (т.к. родителем объектов Range и Rows будет ThisWorkbook.другой лист, а в параметрах Range ссылки на ячейки ThisWorkbook.Лист2) (3) - вызов из модуля книги, модуля класса, модуля формы или глобального модуля - здесь даже у объектов Range и Rows родителем будет уже ActiveWorkbook.ActiveSheet
т.е., если требуется учесть все вышеперечисленные нюансы, то обращаться нужно с явным указанием родителей, вплоть до Application (в вашем случае так:) [vba]
Код
' к Лист2 текущей книги With ThisWorkbook.Worksheets("Лист2") arr = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value End With
' к Лист2 активной книги With ActiveWorkbook.Worksheets("Лист2") arr = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value End With
или arr = Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value но нежелательно.
Я бы написал: "крайне не желательно" (не зная тонкостей), и вообще лучше всегда явно указывать родителей, в т.ч. и для объектов Rows и Sheets. Например, одна и та же форма обращения (с неявными родителями для Range, Rows и Sheets), вызванная из разных модулей, даст разные результаты. [vba]
[/vba] (1) - вызов из модуля листа "Лист2" (CodeName = Лист2) - если активна текущая книга, то произойдет корректное обращение к указанному диапазону, но если активна другая книга, то возникнет Run-time error 1004 (т.к. родителем объектов Range и Rows будет ThisWorkbook.Лист2, а родителем Sheets будет ActiveWorkbook), либо Run-time error 9 (если в активной книге нет листа с именем "Лист2" или у активной книги строк на листе больше (формат 2007 и выше), чем у текущей (формат 2003 и ниже)) (2) - вызов из модуля другого листа той же книги - те же ошибки, что и в (1), даже если будет активной текущая книга (т.к. родителем объектов Range и Rows будет ThisWorkbook.другой лист, а в параметрах Range ссылки на ячейки ThisWorkbook.Лист2) (3) - вызов из модуля книги, модуля класса, модуля формы или глобального модуля - здесь даже у объектов Range и Rows родителем будет уже ActiveWorkbook.ActiveSheet
т.е., если требуется учесть все вышеперечисленные нюансы, то обращаться нужно с явным указанием родителей, вплоть до Application (в вашем случае так:) [vba]
Код
' к Лист2 текущей книги With ThisWorkbook.Worksheets("Лист2") arr = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value End With
' к Лист2 активной книги With ActiveWorkbook.Worksheets("Лист2") arr = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value End With