Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Изменение части кода макроса - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Изменение части кода макроса (Макросы/Sub)
Изменение части кода макроса
karmen185 Дата: Четверг, 18.06.2015, 00:08 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 41
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Доброй ночи. Перед сном возник вопрос. Будет ли правильно дописать в коде макроса нрмер листа:
[vba]
Код
arr = Sheets("Лист2").Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
Спасибо и всем спокойной ночи


Сообщение отредактировал Serge_007 - Четверг, 18.06.2015, 20:01
 
Ответить
СообщениеДоброй ночи. Перед сном возник вопрос. Будет ли правильно дописать в коде макроса нрмер листа:
[vba]
Код
arr = Sheets("Лист2").Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
Спасибо и всем спокойной ночи

Автор - karmen185
Дата добавления - 18.06.2015 в 00:08
Manyasha Дата: Четверг, 18.06.2015, 00:29 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
karmen185, здравствуйте, а почему нет?[vba]
Код
arr = Sheets(2).Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
а еще можно так[vba]
Код
arr = Лист2.Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
'или
arr = Sheet2.Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
где Лист2/Sheet2 - имя листа, то что перед скобками в редакторе VBA.


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеkarmen185, здравствуйте, а почему нет?[vba]
Код
arr = Sheets(2).Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
а еще можно так[vba]
Код
arr = Лист2.Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
'или
arr = Sheet2.Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
где Лист2/Sheet2 - имя листа, то что перед скобками в редакторе VBA.

Автор - Manyasha
Дата добавления - 18.06.2015 в 00:29
karmen185 Дата: Четверг, 18.06.2015, 00:35 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 41
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, спасибо за консультацию. :)
 
Ответить
СообщениеManyasha, спасибо за консультацию. :)

Автор - karmen185
Дата добавления - 18.06.2015 в 00:35
wild_pig Дата: Четверг, 18.06.2015, 00:38 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 517
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
Может так?
[vba]
Код
arr = Sheets("Лист1").Range(Sheets("Лист1").Cells(1, 1), Sheets("Лист1").Cells(Rows.Count, 2).End(xlUp)).Value
'или
With Sheets("Лист1")
        arr = .Range(.Cells(1, 1), .Cells(Rows.Count, 2).End(xlUp)).Value
End With
[/vba]
Иначе значения Range или Cells будут браться из активного листа


Сообщение отредактировал wild_pig - Четверг, 18.06.2015, 00:40
 
Ответить
СообщениеМожет так?
[vba]
Код
arr = Sheets("Лист1").Range(Sheets("Лист1").Cells(1, 1), Sheets("Лист1").Cells(Rows.Count, 2).End(xlUp)).Value
'или
With Sheets("Лист1")
        arr = .Range(.Cells(1, 1), .Cells(Rows.Count, 2).End(xlUp)).Value
End With
[/vba]
Иначе значения Range или Cells будут браться из активного листа

Автор - wild_pig
Дата добавления - 18.06.2015 в 00:38
ikki Дата: Четверг, 18.06.2015, 00:38 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
нет.
если эта команда будет вызвана, когда Лист2 является активным, то она эквивалента команде
[vba]
Код
arr = Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
а если активным будет другой лист, то возникнет ошибка времени выполнения - ибо Cells(2, 1) и Cells(Rows.Count, "A") берутся для активного листа, а диапазон - совсем на другом листе.

если Вас интересует нужный диапазон листа Лист2 вне зависимости от того, какой лист активной книги активен - то "дописывать" лист нужно перед каждым объектом/свойством:
[vba]
Код
arr = Sheets("Лист2").Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
или так:[vba]
Код
With Sheets("Лист2")
     arr = .Range(.Cells(2, 1), .Cells(Rows.Count, "A").End(xlUp)).Value
End With
[/vba]
в принципе - перед свойством Range в этом случае можно и не указывать лист:[vba]
Код
arr = Sheets("Лист2").Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
или так:[vba]
Код
With Sheets("Лист2")
     arr = Range(.Cells(2, 1), .Cells(Rows.Count, "A").End(xlUp)).Value
End With
[/vba]или[vba]
Код
arr = Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]но нежелательно.

пс. об этом можно прочитать в любом учебнике/справочнике по VBA.
и даже в справочной системе.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениенет.
если эта команда будет вызвана, когда Лист2 является активным, то она эквивалента команде
[vba]
Код
arr = Range(Cells(2, 1), Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
а если активным будет другой лист, то возникнет ошибка времени выполнения - ибо Cells(2, 1) и Cells(Rows.Count, "A") берутся для активного листа, а диапазон - совсем на другом листе.

если Вас интересует нужный диапазон листа Лист2 вне зависимости от того, какой лист активной книги активен - то "дописывать" лист нужно перед каждым объектом/свойством:
[vba]
Код
arr = Sheets("Лист2").Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
или так:[vba]
Код
With Sheets("Лист2")
     arr = .Range(.Cells(2, 1), .Cells(Rows.Count, "A").End(xlUp)).Value
End With
[/vba]
в принципе - перед свойством Range в этом случае можно и не указывать лист:[vba]
Код
arr = Sheets("Лист2").Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]
или так:[vba]
Код
With Sheets("Лист2")
     arr = Range(.Cells(2, 1), .Cells(Rows.Count, "A").End(xlUp)).Value
End With
[/vba]или[vba]
Код
arr = Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
[/vba]но нежелательно.

пс. об этом можно прочитать в любом учебнике/справочнике по VBA.
и даже в справочной системе.

Автор - ikki
Дата добавления - 18.06.2015 в 00:38
_Boroda_ Дата: Четверг, 18.06.2015, 01:03 | Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А я обычно пишу вот так:
[vba]
Код
arr = Sheets("Лист2").Range("A2:A" & Rows.Count).End(xlUp).Value
[/vba]
Прелесть в том, что к листу обращаемся один раз.

Вместо Sheets("Лист2") можно Sheets(2) или Лист2 (если, конечно, свойства у этого листа: Нэйм = Лист2, Индекс = 2 и КодНэйм = Лист2)

По этому поводу вот ссылочка
http://www.excelworld.ru/forum/7-4482-1
а там есть еще ссылка от Сергея (SkyPro) на пост Александра (ikki), в котором все вообще прекрасно описано.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА я обычно пишу вот так:
[vba]
Код
arr = Sheets("Лист2").Range("A2:A" & Rows.Count).End(xlUp).Value
[/vba]
Прелесть в том, что к листу обращаемся один раз.

Вместо Sheets("Лист2") можно Sheets(2) или Лист2 (если, конечно, свойства у этого листа: Нэйм = Лист2, Индекс = 2 и КодНэйм = Лист2)

По этому поводу вот ссылочка
http://www.excelworld.ru/forum/7-4482-1
а там есть еще ссылка от Сергея (SkyPro) на пост Александра (ikki), в котором все вообще прекрасно описано.

Автор - _Boroda_
Дата добавления - 18.06.2015 в 01:03
karmen185 Дата: Четверг, 18.06.2015, 01:10 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 41
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
wild_pig и ikki, вам тоже спасибо за подробную информацию. "Вот где была собака зарыта!",а я данные перебросила на активный лист, т.к. на другом листе выдавало ошибку. :D
 
Ответить
Сообщениеwild_pig и ikki, вам тоже спасибо за подробную информацию. "Вот где была собака зарыта!",а я данные перебросила на активный лист, т.к. на другом листе выдавало ошибку. :D

Автор - karmen185
Дата добавления - 18.06.2015 в 01:10
karmen185 Дата: Четверг, 18.06.2015, 01:24 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 41
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Александр, если можно вас так называть, я бы удивилась, если вы бы не предложили какое-нибудь решение. Вам тоже спасибо за ответ и ссылку. Завтра, нет, уже сегодня прочитаю. Всё, пишу и сплю. Спокойной ночи. :D
 
Ответить
СообщениеАлександр, если можно вас так называть, я бы удивилась, если вы бы не предложили какое-нибудь решение. Вам тоже спасибо за ответ и ссылку. Завтра, нет, уже сегодня прочитаю. Всё, пишу и сплю. Спокойной ночи. :D

Автор - karmen185
Дата добавления - 18.06.2015 в 01:24
KSV Дата: Четверг, 18.06.2015, 04:59 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Хочу уточнить некоторые моменты...
или
arr = Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
но нежелательно.

Я бы написал: "крайне не желательно" (не зная тонкостей), и вообще лучше всегда явно указывать родителей, в т.ч. и для объектов Rows и Sheets.
Например, одна и та же форма обращения (с неявными родителями для Range, Rows и Sheets), вызванная из разных модулей, даст разные результаты.
[vba]
Код
Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, 1).End(xlUp))
[/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
[/vba]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333


Сообщение отредактировал KSV - Четверг, 18.06.2015, 05:01
 
Ответить
СообщениеХочу уточнить некоторые моменты...
или
arr = Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, "A").End(xlUp)).Value
но нежелательно.

Я бы написал: "крайне не желательно" (не зная тонкостей), и вообще лучше всегда явно указывать родителей, в т.ч. и для объектов Rows и Sheets.
Например, одна и та же форма обращения (с неявными родителями для Range, Rows и Sheets), вызванная из разных модулей, даст разные результаты.
[vba]
Код
Range(Sheets("Лист2").Cells(2, 1), Sheets("Лист2").Cells(Rows.Count, 1).End(xlUp))
[/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
[/vba]

Автор - KSV
Дата добавления - 18.06.2015 в 04:59
karmen185 Дата: Четверг, 18.06.2015, 18:57 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 41
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
KSV, спасибо за дополнительную информацию. yes
 
Ответить
СообщениеKSV, спасибо за дополнительную информацию. yes

Автор - karmen185
Дата добавления - 18.06.2015 в 18:57
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Изменение части кода макроса (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!