Страницы: 1
RSS
Появление кнопки в зависимости от значения в ячейке
 
Добрый день, Уважаемые!  
Прошу Вас помочь в решении следующей задачи.  
Необходимо чтобы в зависимости от значения ячейки на листе с данными автоматически появлялась уже существующая кнопка с определенным макросом.  
 
Вся дополнительная инфа в прикрепленннмо файле.  
Буду рад любой помощи
 
Одна кнопка. При изменении значения в ячейке изменять назначенный кнопке макрос - не вариант?
 
В модуль листа(Правый щелчок мыши на ярлыке листа-Исходный текст):  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Target.Address(0, 0) <> "D2" Then Exit Sub  
Select Case [D2]
Case "Серия_20"  
Me.Shapes("Кнопка 14").Visible = True  
Me.Shapes("Кнопка 16").Visible = False  
Me.Shapes("Кнопка 17").Visible = False  
Case "Серия_40"  
Me.Shapes("Кнопка 14").Visible = False  
Me.Shapes("Кнопка 16").Visible = True  
Me.Shapes("Кнопка 17").Visible = False  
Case "Серия_80"  
Me.Shapes("Кнопка 14").Visible = False  
Me.Shapes("Кнопка 16").Visible = False  
Me.Shapes("Кнопка 17").Visible = True  
End Select  
End Sub  
 
Можно упростить, но так Вам будет понятней.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Очень даже хороший вариант.  
Я плоховато разбираюсь в макросах, то что было создано сделано макрорекордером.  
Сможете помочь?
 
Вариант с одной кнопкой и одной строкой в макросе :)  
 
=65784= - стрит!
 
Вариант с чуть большим кол-вом строк:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Address(0, 0) <> "D2" Then Exit Sub  
   With Me.Shapes("Кнопка 14")  
       .OnAction = "Print_S" & Right$([D2], 2): .OLEFormat.Object.Text = "Распечатать Паспорт на Серия_" & Right$([D2], 2)
   End With  
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо за быстрый ответ!  
Очень помогло!
 
{quote}{login=Казанский}{date=13.09.2010 10:16}{thema=}{post}Вариант с одной кнопкой и одной строкой в макросе :){/post}{/quote}Алексей(?), на Print_S80 нужно две копии, кажется....По крайней мере так в макросе....  
Хотя эти строки:  
   ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True  
   ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True  
 
Можно заменить одной:        
ActiveWindow.SelectedSheets.PrintOut Copies:=2, Collate:=True  
 
 
А у Казанского две копии в зависимости от выбора можно сделать так:  
Sheets(Range("D2").Value).PrintOut Copies:=Abs([D2] = "Серия_80") + 1, Collate:=True
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да, Дмитрий, я заметил эти две одинаковые строки, но подумал, что это ошибка.
 
{quote}{login=Казанский}{date=13.09.2010 11:11}{thema=}{post}Да, Дмитрий, я заметил эти две одинаковые строки, но подумал, что это ошибка.{/post}{/quote}Да я смотрю автор все равно уже получил чего хотел...Притом с возможностью выбора вариантов решения :-)  
Так что вопрос с тем, ошибка у него в макросе или нет, я думаю он уже сам решит.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Здравствуйте, Экселеведы!    
Есть листы с бланками,которые заполняются автоматически. Я создала отдельный лист,поместила туда кнопки (каждому бланку своя),присвоила макрос,который копирует данные из определенного листа и диапазона как рисунок, вставляет и сохраняет в ворде. Наименование вордовского файла ДОЛЖНО формироваться из данных конкретных ячеек. У меня как раз это не получается. посмотрите,в чем я ошиблась.  
И еще, посоветуйте,может есть более изящное и мудрое решение как организовать весь этот процесс. Меня волнует то,что каждой кнопке - отдельный макрос. количество видов бланков растет.А это нагромождение. Очень жду ваших советов
 
Я в своем примере написала,что бланк должен распечатываться. Нет. просто сохраняться. Но буду признательна,если подскажите еще кодик,как этот бланк автоматически отправить по электоронке на адрес, указаный в ячейке допустим A1
 
может просто обрабатывать текущий лист?  
 
 
кнопку вывести на панель инструментов, выбрать лист, нажать кнопку, 1 макрос напечатает имеено выбранный бланк..
Живи и дай жить..
 
Сейчас так и есть, но бланков много, и скакать по книге в поисках нужного-неудобно. Да,и система такая,что на одну операцию может заполняться несколько разных бланков. Да,и не хотелось бы,чтобы пользователь залезал в листы с бланками,я их скрыть хочу. Т.к. очень много любителей самодеятельностью заниматься,да и книга так будет более комфортна для работы.
 
У Вас разница между двумя модулями только в одном символе:  
 
 Sheets("Бланк1").Range("A1:CB50").CopyPicture Appearance:=xlScreen, Format:=xlPicture  
 Sheets("Бланк2").Range("A1:CB50").CopyPicture Appearance:=xlScreen, Format:=xlPicture  
 
Можно как-нибудь придумать, как в код передавать соотв. значение переменной n:  
 Sheets("Бланк" & n).Range("A1:CB50").CopyPicture Appearance:=xlScreen, Format:=xlPicture  
 
Насчёт имён - тут нет указания, с какого листа брать значения:  
 objWord.ActiveDocument.SaveAs ThisWorkbook.Path & "/" & Range("A5") & "_" & Range("A6")  
т.е. будет браться с активного листа.
 
А может быть такое возможно?  
прописать в макросе такое:  
ищем по листам в ячейке A5 значение,которое совпадает с названием кнопки и при нахождении такового совершает вышеописаные действия. может я бред пишу?) Но тогда была бы одна кнопочка на все и создавай бланков сколько хочешь.
 
тогда выпадающий список бланков и отдельная кнопка для инициации действия( можно и вообще без кнопки - можно после выбора и подтверждения нажатием интер)  
 
а диапазоны надо указывать с принадлежностью к листу...  
 
не просто range("a5") - так оно к текущему листу относится, а  
 
thisworkbook.sheets("бланк1").range("a5")  
 
 
или еще можно для каждого бланка задать имя и оперировать им, тогда лист указывать необязательно..
Живи и дай жить..
 
{quote}{login=Hugo}{date=02.03.2012 02:58}{thema=}{post}У Вас разница между двумя модулями только в одном символе:  
 
 Можно как-нибудь придумать, как в код передавать соотв. значение переменной n:  
 Sheets("Бланк" & n).Range("A1:CB50").CopyPicture Appearance:=xlScreen, Format:=xlPicture  
{/post}{/quote}  
Все сложнее. Эти названия я взяла для примера. А на самом деле они будут соответствовать названию самих бланков,т.е. так же как будет написано в ячейке A5
 
' Сохранить Word-документ  
 objWord.SaveAs ThisWorkbook.Sheets("Бланк1").Path & "/" & Range("A5") & "_" & Range("A6")  
   FName = objWord.ActiveDocument.FullName  
Что в строке нужно поправить,подскажите?
 
' Сохранить Word-документ  
 With ThisWorkbook.Sheets("Бланк1")  
 objWord.ActiveDocument.SaveAs ThisWorkbook.Path & "/" & .Range("A5") & "_" & .Range("A6")  
 End With  
 FName = objWord.ActiveDocument.FullName  
 
 
Или, что длиннее:  
 
 ' Сохранить Word-документ  
 objWord.ActiveDocument.SaveAs ThisWorkbook.Path & "/" & ThisWorkbook.Sheets("Бланк1").Range("A5") & "_" & ThisWorkbook.Sheets("Бланк1").Range("A6")  
 FName = objWord.ActiveDocument.FullName
 
Спасибо! вот я напутала с кодами)
 
Но вопрос с тем, как лучше организовать сохранение разных бланков пока открыт... Жду... очень... советов!
Страницы: 1
Читают тему
Наверх