Страницы: 1 2 След.
RSS
VBA Назначить одну команду всем кнопкам в диапазоне
 
Помогите, пожалуйста, новичку в VBA дописать код.
Посредством макроса у меня добавляется новая строка в таблицу (точнее копируется из другой таблицы), и в одну из ячеек добавляется кнопка, но этих строк в таблице может быть любое количество, в каждой будет кнопка (лучше даже вообще флажок поставить, чтоб галочку ставить, но тут и по оформлению у меня трудности, с кнопкой хоть получилось симпатично)
Мне нужно, чтобы при нажатии каждой такой кнопки вызывалось окно, UserForm готова.
Может это надо в отдельный Sub вынести?

На данный момент у меня выскакивает ошибка 13 Type mismatch
Код
Option Explicit
Dim List As Worksheet
Dim Glavnaya As Worksheet
Dim TablMoto As Range
Dim TablOper As Range
Dim NextFreeCell As Range

' Клик по кнопке ОК в UserForm "Oper"
Sub AddOper()
Set List = ThisWorkbook.Worksheets(2)
Set Glavnaya = ThisWorkbook.Worksheets(1)
Set TablOper = List.Range("A3").EntireRow
Set NextFreeCell = Glavnaya.Cells(Rows.Count, "A").End(xlUp).Offset(RowOffset:=1)
List.Range("B3:G3").ClearContents
' Вставка в таблицу введенных в форме "Oper" данных
List.Range("B3") = Oper.DTPicker1.Value
List.Range("C3") = Oper.TextBox2.Value
List.Range("D3") = Oper.ComboBox1.Value
List.Range("E3") = Oper.TextBox1.Value
' Копирование и вставка шаблона (строка из другой таблицы)
TablOper.Copy
NextFreeCell.PasteSpecial
' Добавление кнопки в добавленную строку в столбец 6
NextFreeCell.Cells(, 6).Activate
Dim obj As OLEObject
Set obj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
                    Left:=ActiveCell.Left, Top:=ActiveCell.Top, _
                    Width:=ActiveCell.Width, Height:=ActiveCell.Height)

' А вот тут я застопорилась. Надо, чтобы эта кнопка по клику вызывала UserForm "Poluch", но строк уже может быть несколько с этими кнопками. 
' А также нужно, чтобы выделилась эта же ячейка, в которой расположена кнопка, а лучше сразу соседняя справа
For Each obj In Glavnaya.Columns(6)
Poluch.Show
    Next
    Oper.Hide
End Sub
Изменено: Ксения П. - 12.09.2022 20:52:54
 
лучше не лепить туда ни флажков ни кнопок, а обойтись двойным кликом
и это будет РЕАЛЬНО одна процедура для всех строк
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Не поняла, куда кликать тогда.
Я-то только за упрощение.
У меня такая таблица формируется. В любой момент нужно кликнуть по кнопке, что детали получены, вызывается форма, и именно в этой строке проставляется дата и значок, и эта строка закрашивается зеленым или красным.
Т.е. мне нужна привязка к конкретной строке.
Если делать двойной клик, то по чему кликать?
Изменено: Ксения П. - 13.09.2022 09:31:10
 
по ячейке. каждая ячейка находится в какой-то, но очень конкретной строке
Изменено: Ігор Гончаренко - 13.09.2022 09:47:54
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
по ячейке. каждая ячейка находится в какой-то, но очень конкретной строке
А как пользователь поймет, что туда нужно кликнуть дважды? Кнопка-то выглядит как кнопка, тут понятно, что на нее нажать нужно.
 
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox Target.Row
End Sub

Если не знаете куда код вставлять, подучите события листа Excel.
Вариант2, можно макрос вызова формы добавить на кнопку в панели быстрого доступа, та что с самого верху.
Вариант3, сделать маленькую форму с одной кнопкой, клик по которой будет вызывать главную форму. Прокрутка и фильтр не будет влиять на положение маленькой формы.
P.S. Большое количество кнопок негативно повлияет на размер файла.
Изменено: DANIKOLA - 13.09.2022 11:44:21
 
Цитата
Ксения П. написал:
А как пользователь поймет
письменная или устная инструкция по эксплуатации дает пользователю представление о допустимых и необходимых от него действиях
пользователь один раз использует фильтр в вашем файле и все кнопки собьются в кучу, их потом нужно вернуть на свои строки и убедиться, что они не перепутались
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
Я-то только за упрощение
для начала Вам надо отказаться от элементов ActiveX(ClassType:="Forms.CommandButton.1"), если нужны именно кнопки. Их можно заменить простыми фигурами.
Но как выше уже написали - идея изначально не самая лучшая. Правильнее сделать одну кнопку, которая вызывает форму, но ориентируется на данные выделенной ячейки. Пользователь по-любому осознает после пары вызовов как это работает.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Ксения П. написал:
А как пользователь поймет, что туда нужно кликнуть дважды?
Так вместо кнопок сделайте инструкцию, куда нажать.
 
см. вложение
(вы догадались куда кликать? и может даже без инструкции поняли для чего это предназначено)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо, с двойным кликом поняла.
А с чек-боксом можно эту ячейку сделать, чтобы галочку ставить, как альтернатива двойному клику?
 
Цитата
написал:
пользователь один раз использует фильтр в вашем файле и все кнопки собьются в кучу, их потом нужно вернуть на свои строки и убедиться, что они не перепутались
Фильтров-то там не будет, таблицы небольшие. Будет расти кол-во таблиц, в каждой из которых не более 10 строк с операциями
 
Цитата
Ксения П. написал:
А с чек-боксом можно эту ячейку сделать
можно. только чем это будет отличаться от кнопки в строке? - ничем
чекбоксов нужно сначала натолкать на лист, на каждый навесить обработку события "чекбоксИзменился" и только потом общая процедура изменения произошли "тут" и она уже сделает основную работу
(с даблкликом первые два пункта уже реализованы)
Изменено: Ігор Гончаренко - 13.09.2022 12:49:30
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Еще можно добавить кнопки(и чекбоксы  в том числе) простым протягиванием ячейки за черный крестик, как протягивается обычная формула. Сначала создаем кнопку(элементы управления формы), подгоняем размер кнопки, чтобы она была внутри ячейки, назначаем кнопке макрос и просто протягиваем ячейку за крестик.
Изменено: DANIKOLA - 13.09.2022 13:10:17
 
Цитата
написал:
Еще можно добавить кнопки(и чекбоксы  в том числе) простым протягиванием ячейки за черный крестик, как протягивается обычная формула. Сначала создаем кнопку(элементы управления формы), подгоняем размер кнопки, чтобы она была внутри ячейки, назначаем кнопке макрос и просто протягиваем ячейку за крестик.
Не, мне нужно, чтобы они добавлялись вместе с добавляемой строкой, т.к. добавление этих новых строк и будет уже осуществляться пользователем. А строк этих может быть разное кол-во в разных таблицах. В таблице 1 может быть 5, а в таблице 2 - 7 строк, например.
Каждая строка - это описание определенной операции, и когда эта операция будет выполнена (получены детали), то пользователь ставит флажок, заполняет всплывшую форму, строка подсвечивается зеленым/красным, и в эту строку вносятся различные данные из формы.
При таком раскладе и флажок виден, и щелкать понятно сразу куда, когда детали получены, и привязка к строке готова. (Пока у меня просто картинка с галочкой вставляется=)))

Но за подсказку спасибо, возьму на вооружение))
 
Ксения, если очень хочется галочку, то ведь можно по даблклику и её реализовать : писать в ячейку символ " шрифтом Marlettt. Или подобрать символ, где будет галочка в квадратике.
 
Цитата
Ксения П. написал:
добавление этих новых строк и будет уже осуществляться пользователем
а вы за пользователем добавляете в эти строки кнопки или чекбоксы и открываете VBE навешиваете на них макросы и все прекрасно)
Изменено: Ігор Гончаренко - 13.09.2022 14:12:18
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
добавление этих новых строк и будет уже осуществляться пользователем
значит надо написать отдельный код для добавления и удаления строк, а пользователю запретить это делать. Тогда проблем будет меньше как сейчас, так и в будущем.  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Цитата
на каждый навесить обработку события "чекбоксИзменился"
А как правильно прописать, чтобы каждому новому чек-боксу на листе навешивалась обработка одного события?
Вот я добавила чек-бокс в новую строку, а дальше?
Код
Set NextFreeCell = Glavnaya.Cells(Rows.Count, "A").End(xlUp).Offset(RowOffset:=1)
NextFreeCell.Cells(, 6).Activate
'Добавляю чек-бокс
Dim obj As OLEObject
Set obj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
                    Left:=ActiveCell.Left + 24, Top:=ActiveCell.Top + 4, _
                    Width:=ActiveCell.Width - 40, Height:=ActiveCell.Height - 4.5)
obj.Name = ""
obj.Object.Caption = ""
    Oper.Hide

'И вот тут что-то пытаюсь написать    
    For Each obj In ActiveSheet
    If obj.Value = True Then
    Poluch.Show
    End If
    Next

Но форма Poluch выскакивает сразу после добавления строки с флажком, хоть он и пустой. Если форму закрываю, меняю значение чек-бокса - ничего не происходит
Изменено: Ксения П. - 13.09.2022 14:21:25
 
Цитата
написал:
значит надо написать отдельный код для добавления и удаления строк, а пользователю запретить это делать. Тогда проблем будет меньше как сейчас, так и в будущем.  
Да, строки добавляются по нажатию кнопки из формы. Конечно он не вручную будет добавлять эти строки. В этом и цель. Лист защищу, как все это дело реализую)) Это мне еще тоже предстоит изучить
 
Цитата
написал:
Ксения, если очень хочется галочку, то ведь можно по даблклику и её реализовать : писать в ячейку символ  "а " шрифтом Marlettt. Или подобрать символ, где будет галочка в квадратике.
Как вариант, попробую
А форму же можно открыть по дабл-клику?
 
Цитата
Ксения П. написал:
форму же можно открыть по дабл-клику?
Конечно можно )
 
Цитата
Ксения П. написал:
А как правильно прописать, чтобы каждому новому чек-боксу на листе навешивалась обработка одного события?

Код
Dim obj As CheckBox
    Set obj = ActiveSheet.CheckBoxes.Add(ActiveCell.Left, ActiveCell.Top, ActiveCell.Width, ActiveCell.Height)
    obj.OnAction = "Макрос1"
Изменено: testuser - 13.09.2022 15:13:40
 
testuser, спасибо, то что надо!
А как активировать именно ту ячейку, в которой расположен чек-бокс, при нажатии на него?
Она автоматически не выделяется
 
Цитата
Ксения П. написал:
А как активировать именно ту ячейку, в которой расположен чек-бокс, при нажатии на него?
А не простое это дело )
Код
Sub Добавлениефлажка()    
    Dim ac As Range
    Set ac = ActiveCell
    Set obj = ActiveSheet.CheckBoxes.Add(ac.Left, ac.Top, ac.Width, ac.Height)
    obj.LinkedCell = ac.Address 'связываем чекбокс с ячейкой
    ac.NumberFormat = ";;;" 'скрываем значения чекбокса в ячейке
    obj.OnAction = "Макрос1" 'назначаем макрос
End Sub

Sub Макрос1()
    Range(ActiveSheet.CheckBoxes(Application.Caller).LinkedCell).Select
    'код
End Sub
Изменено: testuser - 14.09.2022 09:58:19
 
Цитата
написал:
А не простое это дело )
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13      Sub   Добавлениефлажка()              Dim   ac   As   Range          Set   ac = ActiveCell          Set   obj = ActiveSheet.CheckBoxes.Add(ac.Left, ac.Top, ac.Width, ac.Height)          obj.LinkedCell = ac.Address   'связываем чекбокс с ячейкой          ac.NumberFormat =   ";;;"   'скрываем значения чекбокса в ячейке          obj.OnAction =   "Макрос1"   'назначаем макрос    End   Sub       Sub   Макрос1()          Range(ActiveSheet.CheckBoxes(Application.Caller).LinkedCell).  Select          'код    End   Sub   
 
Супер! Вот еще дальше пытаюсь допилить
Код
Dim obj As checkbox
Dim ac As Range
    Set ac = ActiveCell
    Set obj = ActiveSheet.CheckBoxes.Add(Left:=ActiveCell.Left + 21, Top:=ActiveCell.Top - 0.75, _
                    Width:=ActiveCell.Width - 40, Height:=ActiveCell.Height - 4.5)
    obj.Caption = ""
    obj.LinkedCell = ac.Address 'ñâÿçûâàåì ÷åêáîêñ ñ ÿ÷åéêîé
    ac.NumberFormat = ";;;" 'ñêðûâàåì çíà÷åíèÿ ÷åêáîêñà â ÿ÷åéêå
    If obj.Value = False Then
obj.OnAction = "Макрос 1"
Else
obj.OnAction = "Макрос 2"
  End If
Но в обоих случаях запускается Макрос 1, т.е. условие if не срабатывает
 
тут огромная дырка в логике, т.е. логики - нет
когда вы вставляете чекбокс а ячейку, он по умолчание пустой (без метки) равен ЛОЖЬ
какой смысл потом писать условие
If obj.Value = False
если я понятно что там False и ВСЕМ вновь вставленным чекбоксам  привязывается макрос1

VBA  выполняет не то, о чем вы мечтаете, а то что вы написали в коде (угадывать мечты не умеет)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ксения П., условие нужно прописать в самом макросе
Код
If ActiveSheet.CheckBoxes(Application.Caller).value = false then 
'Действие 1
Else
'Действие 2
End if
Изменено: testuser - 14.09.2022 12:02:25
 
Цитата
написал:
нужно, чтобы выделилась эта же ячейка, в которой расположена кнопка, а лучше сразу соседняя справа
Кстати, если надо выделить соседнюю справа
Код
Range(ActiveSheet.CheckBoxes(Application.Caller).LinkedCell).Offset(, 1).Select
 
Цитата
когда вы вставляете чекбокс а ячейку, он по умолчание пустой (без метки) равен ЛОЖЬ
А когда меняю на галочку, а потом снова меняю на пустой? Т.е. когда снимаю флажок

Цитата
если я понятно что там False и ВСЕМ вновь вставленным чекбоксам  привязывается макрос1
А макрос-то надо привязать к изменению значения чек-бокса, причем на одно изменение (true) один макрос, а на другое (false) - второй

Цитата
VBA  выполняет не то, о чем вы мечтаете, а то что вы написали в коде (угадывать мечты не умеет)
Вот четвертый день только изучаю этот язык)) Словарный запас еще маловат)

А testuser, похоже, меня правильно понял
Страницы: 1 2 След.
Наверх