Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Возможно ли обращение из макроса к конкретной ячейке именованного диапазона?

Автор Олег*, 08.10.2011, 19:39

« назад - далее »

Олег*

Добрый вечер!
Подскажите, пожалуйста, можно ли обращаться из макроса к конкретной ячейке из именованного диапазона ячеек?
Например, у меня имеется на Листе1 именованный диапазон ячеек  [Диап] (A1:A10). Если я его хочу обнулить целиком, то поступаю вот так:
Private Sub CommandButton1_Click()
[Диап] = 0
End Sub

(Пример прилагается).

А как бы я мог предпринимать определенные действия с отдельными членами этого "массива"? Можно ли как-нибудь обращаться к ним по адресу или ещё как-нибудь?

И тот же самый вопрос применительно к встроенным в листы экселя функциям. Можно ли использовать в них в качестве аргументов отдельные члены именованного диапазона ячеек и если можно то как?

И наконец, самый глупый вопрос дилетанта: именованный диапазон ячеек и массив ячеек - это одно и то же или нет? :)  
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

_Boroda_

Олег, а объясните пожалуйста смысл всего этого?
Цитироватьименованный диапазон ячеек и массив ячеек - это одно и то же или нет?
Это смотя что Вы имеете в виду. По сути, если проименовать диапазон, то одно и то же.
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Олег*

Цитата: _Boroda_ от 08.10.2011, 19:46
Цитироватьименованный диапазон ячеек и массив ячеек - это одно и то же или нет?
Это смотя что Вы имеете в виду. По сути, если проименовать диапазон, то одно и то же.
А Вы в приложенном примере посмотрите, что я имею в виду :)
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

Олег*

Цитата: _Boroda_ от 08.10.2011, 19:46
Олег, а объясните пожалуйста смысл всего этого?

Смысл такой: у меня сейчас в эксельном макросе используются статические массивы и одновремено с этим у меня на листе экселя отображаются значения этих массивов в ячейках (одна под другой). Получается двойная работа.
И ещё смысл такой: сейчас большую часть работы своего эксельного макроса хочу переложить "на плечи" встроенных в листы функций. Ну вот и зондирую почву относительно взможностей, которые имеются. В том числе и возможностей по использованию именованных массивов ячеек как обычные (макросные) массивы данных.
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

_Boroda_

ЦитироватьСмысл такой: у меня сейчас в эксельном макросе используются статические массивы и одновремено с этим у меня на листе экселя отображаются значения этих массивов в ячейках (одна под другой). Получается двойная работа.
Как-то не совсем понятно без примера. Вернее, может быть несколько вариантов того, что Вы сказать хотите.
Касательно именованных диапазонов - я использую исключительно динамические. Статические делать не вижу смысла. Прощу заметить, что это только мое мнение и вполне возможно, что многие со мной не согласятся.
ЦитироватьА Вы в приложенном примере посмотрите, что я имею в виду
То, что обнулить - это я понял. Я спрашивал про задачу в целом.
ЦитироватьНу вот и зондирую почву относительно взможностей, которые имеются. В том числе и возможностей по использованию именованных массивов ячеек как обычные (макросные) массивы данных.
В общем - что В напишете [Диап], что А1:А10 (в формуле), что Range("A1:A10") (в макросе) - большой разницы нет
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

exceleved

> А как бы я мог предпринимать определенные действия с отдельными членами этого "массива"? Можно ли как-нибудь обращаться к ним по адресу или ещё как-нибудь?

Почитайте про методы .Cells, .Offset, .Range объекта Range (да, Range.Range это не ошибка).

Пример посмотреть не могу (xlsm).

Serge 007

Цитата: Олег* от 08.10.2011, 19:391. Можно ли обращаться из макроса к конкретной ячейке из именованного диапазона ячеек?
2. А как бы я мог предпринимать определенные действия с отдельными членами этого "массива"? Можно ли как-нибудь обращаться к ним по адресу или ещё как-нибудь?
3. И тот же самый вопрос применительно к встроенным в листы экселя функциям. Можно ли использовать в них в качестве аргументов отдельные члены именованного диапазона ячеек и если можно то как?
4. Именованный диапазон ячеек и массив ячеек - это одно и то же или нет? :)  
1. Можно. Ячейка в именованом диапазоне ничем не отличается от обычной
2. Да, можно обращаться по адресу
3. Можно. Способ зависит от исходных данных и задачи
4. Это смотря как посмотреть :) Массив и именованый диапазон могут быть одним и тем же, а могут и не быть.
По определению массив - это пронумерованный список значений, где каждый элемент этого списка имеет свой уникальный номер. Уникальный номер - это неповторяющийся номер (индекс) каждого элемента массива. И независимо от того одномерный массив или нет это определение верно. А вот именованый диапазон может и не быть списком. Нажмите Ctrl и ткните в несколько разных (несмежных) ячеек на листе. Потом присвойте им имя. Именованый диапазон получился. Но будет ли он массивом?..

ЗЫ Не увлекайтесь именованием.  Имена только тормозят работу формул.
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

Олег*

Цитата: Serge 007 от 08.10.2011, 21:38
ЗЫ Не увлекайтесь именованием.  Имена только тормозят работу формул.
Спасибо за совет! На самом деле, я в последнее время действительно "увлекся" именованием. Но если это тормозит работу... Может и правда не стоит? Но очень, очень удобно. Например, на листе имеется ячейка, в которой отображается значение какой-нибудь переменной. При другом раскладе надо при каждом действии с этой переменной "вручную" вносить в эту ячейку ее новое значение. А если эта переменная "приписана" к именованной ячейке, тогда она сама там отображается без лишних хлопот со стороны программиста :) По сути, это ячейка памяти, значение которой всегда перед глазами.

Serge 007 и _Boroda_, большое спасибо вам за исреннее желание помочь, но мы сейчас толкуем о разных вещах. Наверно, всему виной то, что я не совсем точно сформулировал изначальную задачу.
Наверно мне надо было бы говорить не об обращении к ячейкам именованного диапазона по адресу, а об обращении к ним по индексу по аналогии с обычными макросными массивами, например вот так:
MyArray(15) = 100

А то что можно обращаться по адресу к отдельным членам именованного диапазона - это мне понятно. 
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

Олег*

Цитата: exceleved от 08.10.2011, 21:30
> А как бы я мог предпринимать определенные действия с отдельными членами этого "массива"? Можно ли как-нибудь обращаться к ним по адресу или ещё как-нибудь?

Почитайте про методы .Cells, .Offset, .Range объекта Range (да, Range.Range это не ошибка).

Пример посмотреть не могу (xlsm).

exceleved, спасибо за помощь!
Выкладываю пример в формате 2003.
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

Serge 007

Цитата: Олег* от 08.10.2011, 22:29
1. Например, на листе имеется ячейка, в которой отображается значение какой-нибудь переменной. При другом раскладе надо при каждом действии с этой переменной "вручную" вносить в эту ячейку ее новое значение. А если эта переменная "приписана" к именованной ячейке, тогда она сама там отображается без лишних хлопот со стороны программиста :) По сути, это ячейка памяти, значение которой всегда перед глазами.
2. Наверно мне надо было бы говорить не об обращении к ячейкам именованного диапазона по адресу, а об обращении к ним по индексу по аналогии с обычными макросными массивами...
1. А зачем при этом использовать имя?! Чем просто Range не угодил?
2. По этому поводу _Boroda_ уже спрашивал:
ЦитироватьОлег, а объясните пожалуйста смысл всего этого?
Я, пока, смысла так и не увидел...
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

Олег*

Цитата: Serge 007 от 08.10.2011, 22:40
Цитата: Олег* от 08.10.2011, 22:29
1. Например, на листе имеется ячейка, в которой отображается значение какой-нибудь переменной. При другом раскладе надо при каждом действии с этой переменной "вручную" вносить в эту ячейку ее новое значение. А если эта переменная "приписана" к именованной ячейке, тогда она сама там отображается без лишних хлопот со стороны программиста :) По сути, это ячейка памяти, значение которой всегда перед глазами.
1. А зачем при этом использовать имя?! Чем просто Range не угодил?
Да тем и не угодил, что надо делать двойную работу :)
Например, у нас имеется простая (не именованная ячейка А3, в которой мы отображаем значение переменной Х. Для этого мы поступаем вот так:
X=A+B
Range("A3") =X


А если у нас "A3" - именованная ячейка, пусть это будет [SomeName], тогда для выполнения этой задачи достаточно всего одной строки кода:
[SomeName]=A+B
И эта переменная уже посчиталась и отобразилась (для наглядности и контроля) в соотетствующей ячейке. И так поступаем с каждой переменой по всей программе :) Поступаем, в смысле, ликвидируем их за ненадобностью :)  Но вот когда очередь доходит до массивов, вот тогда-то и возникает вопрос, вынесенный в заголовок этой ветки.


Цитата: Serge 007 от 08.10.2011, 22:40
Цитата: Олег* от 08.10.2011, 22:29
2. Наверно мне надо было бы говорить не об обращении к ячейкам именованного диапазона по адресу, а об обращении к ним по индексу по аналогии с обычными макросными массивами...
2. По этому поводу _Boroda_ уже спрашивал:
ЦитироватьОлег, а объясните пожалуйста смысл всего этого?
Я, пока, смысла так и не увидел...
Мне хочется понять, возможно это в принципе или нет? В смысле, заменить ( как я поступил почти со всеми переменными) массивы моего макроса на массивы именованных ячеек...
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

Serge 007

Цитата: Олег* от 08.10.2011, 23:20
Например, у нас имеется простая (не именованная ячейка А3, в которой мы отображаем значение переменной Х. Для этого мы поступаем вот так:
X=A+B
Range("A3") =X

А если у нас "A3" - именованная ячейка, пусть это будет [SomeName], тогда для выполнения этой задачи достаточно всего одной строки кода:
[SomeName]=A+B
И эта переменная уже посчиталась и отобразилась (для наглядности и контроля) в соотетствующей ячейке. И так поступаем с каждой переменой по всей программе :) Поступаем, в смысле, ликвидируем их за ненадобностью :) 
Олег, это заблуждение...
Длинна формулы/макроса напрямую НЕ СВЯЗАНА с быстродействием.
Формула в 50 знаков может выполняться в два раза медленнее чем формула в 500 знаков, аналогично и с макросами.

В Вашем примере [SomeName] = X=A+B, поэтому никакой экономии времени не будет. Вы же знаете закон сохранения энергии и, надеюсь, не верите в чудеса :)
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

_Boroda_

Так и напишите вместо X=A+B
Range("A3") =X

Range("A3") =A+B
Абсолютно согласен с Сергеем
ЦитироватьДлинна формулы/макроса напрямую НЕ СВЯЗАНА с быстродействием.
И даже более того, используя именованные диапазоны, мы тратим больше. Сначала обзначение этого диапазона, потом работа с ним как с диапазоном. А если напрямую с ячейками - то мы используем только один шаг. НО не нужно путать именованный диапазон и переменную в макросе. У Вас в примере Х - это переменная. Это совсем другой разговор.
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Олег*

Цитата: Serge 007 от 08.10.2011, 23:34
Цитата: Олег* от 08.10.2011, 23:20
Например, у нас имеется простая (не именованная ячейка А3, в которой мы отображаем значение переменной Х. Для этого мы поступаем вот так:
X=A+B
Range("A3") =X

А если у нас "A3" - именованная ячейка, пусть это будет [SomeName], тогда для выполнения этой задачи достаточно всего одной строки кода:
[SomeName]=A+B
И эта переменная уже посчиталась и отобразилась (для наглядности и контроля) в соотетствующей ячейке. И так поступаем с каждой переменой по всей программе :) Поступаем, в смысле, ликвидируем их за ненадобностью :) 
Олег, это заблуждение...
Длинна формулы/макроса напрямую НЕ СВЯЗАНА с быстродействием.
Формула в 50 знаков может выполняться в два раза медленнее чем формула в 500 знаков, аналогично и с макросами.

В Вашем примере [SomeName] = X=A+B, поэтому никакой экономии времени не будет. Вы же знаете закон сохранения энергии и, надеюсь, не верите в чудеса :)

Это как раз тот самый случай, когда я готов согласиться на некоторое замедление в угоду наглядности. Все переменные в одной таблице на одном листе - это же классно! Моя программа непрерывно получает данные из внешнего источника и непрерывно их обрабатывает, поэтому очень полезно иметь такую таблицу, в которую время от времени можно заглядывать для контроля, да и просто из любопытства :) Вот мне бы теперь только с массивами разобраться. В смысле, заменить бы их тоже  на именованные ячейки (точнее, на именованные диапазоны) и манипулировать с ними как с обычными массивами, но "отражающимися" в соответствующих ячейках.
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

Serge 007

Цитата: Олег* от 08.10.2011, 23:59
1. Это как раз тот самый случай, когда я готов согласиться на некоторое замедление в угоду наглядности.
2. Все переменные в одной таблице на одном листе - это же классно!
1. Ставим на машину квадратные колёса... Ездить не будет, зато выглядит стильно!...
2. Ну да, классно...
А давайте выведем список всех ячеек на листе. Это тоже классно...
Смысл-то в чём?
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390