Страницы: 1
RSS
Как передать значения переменных в макрос?
 
Ситуация такая: книга из 5 листов. На основном листе таблица из 2х столбцов: город (4 шт.) и ФИО участника из данного города.  
На остальных 4х листах - соответствующие каждому городу списки ФИО участников (именованные диапазоны).  
ФИО выбираются из выпадающих списков, организованных с помощью "Данные -> Проверка -> Список -> =имя_соотв_диапазона"  
На основном листе хочу сделать кнопку (форма) "Добавить нового участника", макрос которой вызывает диалоговое окно с полем ввода ФИО и добавляет введённое значение в соответствующий диапазон.  
Код основного листа присваивает значения переменным, описывающим имя и местонахождение необходимого диапазона. Т.е. если активна ячейка с ФИО участника из г. Барнаул, переменной ImyaSpiska присваивается значение "barnaul" и тд.  
Не могу понять, как ПЕРЕДАТЬ ЗНАЧЕНИЯ ПЕРЕМЕННЫХ с основного листа В МАКРОС, который вызывается нажатием вышеуказанной кнопкой "Добавить..". Другими словами, как сделать так, чтобы кнопка "понимала", с какой ячейкой происходит действие и какой дипапазон значений ей соответствует.  
Помогите разобраться, пожалуйста! Свой файл прилагаю.
 
В разделе "Приёмы" смотрели? Вроде Ваш случай http://www.planetaexcel.ru/tip.php?aid=98
 
Да, смотрел. Именно на основании этого метода возникла идея сделать нечто похожее, но с использованием формы "Кнопка".  
Описанный там метод не очень удобен тем, что после ввода нового имени, для вызова диалога о добавлении его в список, нужно сперва "выйти" из этой ячейки, а затем снова её активировать.  
А если например ещё реализовывать функцию правки уже добавленных элементов списка, то тут тоже удобней была бы кнопка с макросом, моё мнение.  
 
Но вопрос не в том, что и как лучше, а в том, как макрос под кнопкой заставить пользоваться переменными, задаваемыми в основной процедуре???
 
1. В предлагаемом в "Приёмах" варианте нет необходимости "сперва "выйти" из этой ячейки, а затем снова её активировать." Всё делается за "один проход"  
2. У Вас в примере лишние проверки на диапазон: замените имена динамических диапазонов на имена, аналогичные значениям в столбца А главного листа и Вы избавитесь от этих проверок.  
3. Можно вообще обойтись без кнопки: если введённого вручную имени нет в диапазоне, оно будет добавляться туда автоматически.  
4. Честно говоря не понял основной вопрос насчёт передачи значения переменной :-) Что не получается?
 
Спасибо, обязательно воспользуюсь советом по упрощению кода по части проверок. Но охота всё-таки, чтоб по кнопочке-макросу подсказали.  
Вот, покажу на примере одной переменной (из моего кода):  
 
If Target.Address = "$B$3" Then  
 ImyaSpiska = "Красноярск"  
 
т.е. при активации ячейки B3 (с выбором ФИО участника из г. Красноярск) переменной ImyaSpiska присваивается значение "Красноярск". Допустим мы хотим добавить нового человека в этот список. Жмём кнопку Добавить, вызывающую макрос addfio:  
 
Sub addfio()  
Dim NewFIO As String  
NewFIO = InputBox("Введите ФИО участника от " & ImyaSpiska)  
...  
 
отображается диалоговое окно ввода InputBox. Но там вместо надписи  
 
"Введите ФИО участника от Красноярск"  
 
видим просто  
 
"Введите ФИО участника от "  
 
Что говорит о том, что макрос addfio не в курсе того, что есть такая переменная ImyaSpiska, которой только что в основной процедуре присвоили значение "Красноярск".  
Вот в этом-то и вопрос, как правильно сделать, чтоб при вызове макроса, он работал со значениями переменных, заданными в основной процедуре?
 
Посмотрите вариант. Кнопка сейчас не нужна. Если введёте прямо в ячейку новое имя - оно будет добавлено в соответствующий диапазон автоматически. Проверку на пцстые ячейки столбца [А] не делал. Если такой вариант не устроит - обсудим Ваш.
 
По поводу InputBox не успел - Prist уже ответил :-)
 
Кнопка "Добавить" нужна, т.к это будет не единственная кнопка. Ещё понадобятся "Изменить", "Удалить" и др. :-)  
Плюс если в ячейку вводят скопированный, например с веб-страницы, текст (методом Ctrl-C, Ctrl-V к примеру), то автоматом копируется и его формат - шрифт, цвет и пр. Неопытным пользователям приходится долго объяснять, как этого избежать. А с InputBox такой проблемы нет.  
Спасибо всем за помощь. The_Prist за то, что ответили на мой вопрос. Юрий М за более компактный метод.
Страницы: 1
Читают тему
Наверх