Страница: 1 |
Страница: 1 |
Вопрос: Range и Rows, вопрос по использованию.
Добавлено: 17.11.08 13:24
Автор вопроса: Somes
Добрые сутки, уважаемые. Подскажите начинающему, почему, к примеру, работает:
Dim sStr
Dim oRange
Set oRange = Range(Cells(1, 1), Cells(1, 5))
For Each sStr In oRange
MsgBox sStr.Cells.Value
Next
End Sub
Но не работает:
Dim sStr
Dim oRange
Set oRange = Application.Rows(1)
For Each sStr In oRange
MsgBox sStr.Cells.Value
Next
End Sub
В документации сказанно, что Application.Rows(1) возвращает экземпляр Range, почему же тогда вторая конструкция не работает?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 17.11.08 13:48
У меня не работает также - сам проверял.
Это.. а скажи тогда ты мне: зачем тебе объявлять переменные и не указывать тип?
Почему ты забываешь в конце процедуры ставить
Номер ответа: 2
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #2
Добавлено: 17.11.08 13:51
Да, забыл ответить на твой вопрос: потому что в выражении
является oRange не перечислением, а объектом Range
Номер ответа: 3
Автор ответа:
Somes
Вопросов: 3
Ответов: 7
Профиль | | #3
Добавлено: 17.11.08 14:25
Да я как бы просто предоставляю vba самостоятельно выбрать тип. Если я правильно понимаю суть.
Я дико извиняюсь, Sub Cells() следует читать как Sub Что-угодно().
Номер ответа: 4
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #4
Добавлено: 17.11.08 15:50
Somes:
Если тип не указан явно, то независимо от содержимого переменной, она получает тип Variant.
Как вариант неработающей процедуры:
sStr.Cells писать излишне, ибо это возвращает то же самое, что и aStr: они оба ссылаются на один и тот же объект Range.
mc-black:
Жизнь локальных переменных заканчивается после окончания процедуры, не так ли?
Номер ответа: 5
Автор ответа:
Somes
Вопросов: 3
Ответов: 7
Профиль | | #5
Добавлено: 17.11.08 16:46
Nytrogen Большое спасибо за разъяснение.
И, извиняюсь, небольшой вопрос в догонку так сказать:
С чем это связано? .Address возращает значение типа string, что мешает работать второй конструкции?
Номер ответа: 6
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #6
Добавлено: 17.11.08 18:11
Вы сами не понимаете, что пишите. Вы объявляете переменную sStr типа String, а потом присваиваете ей ссылку на диапазон. Что туда по-вашему будет записано? Неизвестно.
Далее, строка sStr = ActiveSheet.Cells(1, 1) по сути означает, что Вы в переменную sStr пытаетесь записать объект ячейки. Это неправильно хотя бы потому, что это не позволит Вам сделать сам интерпретатор VBA, не говоря о трудоёмкости данного процесса. Ссылкам на объекты, так называемым объектным переменным, присваивать значение можно только используя оператор Set, т.е. правильной записью является следующая:
Тип объектных переменных должен быть естественно объектным (никаких стрингов), в Вашем случае - это Range (более общим вариантом является Object и на худой конец - Variant). Помните, что чем точнее Вы укажете тип, тем меньше ресурсов будет пожирать Ваш макрос. Таким образом, правильный код выглядит следующим образом:
Номер ответа: 7
Автор ответа:
Somes
Вопросов: 3
Ответов: 7
Профиль | | #7
Добавлено: 17.11.08 19:08
Nytrogen Большое спасибо Вам за разъяснения.
Номер ответа: 8
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #8
Добавлено: 18.11.08 10:42
Жизнь локальных переменных заканчивается после окончания процедуры, не так ли?
Сам экземпляр объекта - это не переменная. Объектная переменная VBA - это что-то вроде указателя или дескриптора (точно не знаю) на экземпляр объекта в памяти. При корректном завершении процедуры стек локальных переменных разрушается. VB при этом автоматически освобождает память, занятую под экземпляры объектов. Но сборщик мусора не всегда может отработать как положено (например при возниконовении ошибки в коде процедуры с вылетом из нее с ошибкой), поэтому рекомендуется всегда явным образом освобождать объекты. Описанное мной, пусть может и не абсолютно точно, называется утечкой памяти.
Номер ответа: 9
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #9
Добавлено: 18.11.08 12:55
mc-black #8:
Означает ли это, что создаваемые объекты так же надо удалять Delete'ом?
Номер ответа: 10
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #10
Добавлено: 19.11.08 09:55