Помогите, пожалуйста, новичку в 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
Не поняла, куда кликать тогда. Я-то только за упрощение. У меня такая таблица формируется. В любой момент нужно кликнуть по кнопке, что детали получены, вызывается форма, и именно в этой строке проставляется дата и значок, и эта строка закрашивается зеленым или красным. Т.е. мне нужна привязка к конкретной строке. Если делать двойной клик, то по чему кликать?
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
MsgBox Target.Row
End Sub
Если не знаете куда код вставлять, подучите события листа Excel. Вариант2, можно макрос вызова формы добавить на кнопку в панели быстрого доступа, та что с самого верху. Вариант3, сделать маленькую форму с одной кнопкой, клик по которой будет вызывать главную форму. Прокрутка и фильтр не будет влиять на положение маленькой формы. P.S. Большое количество кнопок негативно повлияет на размер файла.
письменная или устная инструкция по эксплуатации дает пользователю представление о допустимых и необходимых от него действиях пользователь один раз использует фильтр в вашем файле и все кнопки собьются в кучу, их потом нужно вернуть на свои строки и убедиться, что они не перепутались
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
для начала Вам надо отказаться от элементов ActiveX(ClassType:="Forms.CommandButton.1"), если нужны именно кнопки. Их можно заменить простыми фигурами. Но как выше уже написали - идея изначально не самая лучшая. Правильнее сделать одну кнопку, которая вызывает форму, но ориентируется на данные выделенной ячейки. Пользователь по-любому осознает после пары вызовов как это работает.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
написал: пользователь один раз использует фильтр в вашем файле и все кнопки собьются в кучу, их потом нужно вернуть на свои строки и убедиться, что они не перепутались
Фильтров-то там не будет, таблицы небольшие. Будет расти кол-во таблиц, в каждой из которых не более 10 строк с операциями
Ксения П. написал: А с чек-боксом можно эту ячейку сделать
можно. только чем это будет отличаться от кнопки в строке? - ничем чекбоксов нужно сначала натолкать на лист, на каждый навесить обработку события "чекбоксИзменился" и только потом общая процедура изменения произошли "тут" и она уже сделает основную работу (с даблкликом первые два пункта уже реализованы)
Еще можно добавить кнопки(и чекбоксы в том числе) простым протягиванием ячейки за черный крестик, как протягивается обычная формула. Сначала создаем кнопку(элементы управления формы), подгоняем размер кнопки, чтобы она была внутри ячейки, назначаем кнопке макрос и просто протягиваем ячейку за крестик.
написал: Еще можно добавить кнопки(и чекбоксы в том числе) простым протягиванием ячейки за черный крестик, как протягивается обычная формула. Сначала создаем кнопку(элементы управления формы), подгоняем размер кнопки, чтобы она была внутри ячейки, назначаем кнопке макрос и просто протягиваем ячейку за крестик.
Не, мне нужно, чтобы они добавлялись вместе с добавляемой строкой, т.к. добавление этих новых строк и будет уже осуществляться пользователем. А строк этих может быть разное кол-во в разных таблицах. В таблице 1 может быть 5, а в таблице 2 - 7 строк, например. Каждая строка - это описание определенной операции, и когда эта операция будет выполнена (получены детали), то пользователь ставит флажок, заполняет всплывшую форму, строка подсвечивается зеленым/красным, и в эту строку вносятся различные данные из формы. При таком раскладе и флажок виден, и щелкать понятно сразу куда, когда детали получены, и привязка к строке готова. (Пока у меня просто картинка с галочкой вставляется=)))
Ксения, если очень хочется галочку, то ведь можно по даблклику и её реализовать : писать в ячейку символ "а" шрифтом Marlettt. Или подобрать символ, где будет галочка в квадратике.
написал: добавление этих новых строк и будет уже осуществляться пользователем
значит надо написать отдельный код для добавления и удаления строк, а пользователю запретить это делать. Тогда проблем будет меньше как сейчас, так и в будущем.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
на каждый навесить обработку события "чекбоксИзменился"
А как правильно прописать, чтобы каждому новому чек-боксу на листе навешивалась обработка одного события? Вот я добавила чек-бокс в новую строку, а дальше?
Код
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 выскакивает сразу после добавления строки с флажком, хоть он и пустой. Если форму закрываю, меняю значение чек-бокса - ничего не происходит
написал: значит надо написать отдельный код для добавления и удаления строк, а пользователю запретить это делать. Тогда проблем будет меньше как сейчас, так и в будущем.
Да, строки добавляются по нажатию кнопки из формы. Конечно он не вручную будет добавлять эти строки. В этом и цель. Лист защищу, как все это дело реализую)) Это мне еще тоже предстоит изучить
написал: Ксения, если очень хочется галочку, то ведь можно по даблклику и её реализовать : писать в ячейку символ "а " шрифтом Marlettt. Или подобрать символ, где будет галочка в квадратике.
Как вариант, попробую А форму же можно открыть по дабл-клику?
Ксения П. написал: А как правильно прописать, чтобы каждому новому чек-боксу на листе навешивалась обработка одного события?
Код
Dim obj As CheckBox
Set obj = ActiveSheet.CheckBoxes.Add(ActiveCell.Left, ActiveCell.Top, ActiveCell.Width, ActiveCell.Height)
obj.OnAction = "Макрос1"
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
[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 выполняет не то, о чем вы мечтаете, а то что вы написали в коде (угадывать мечты не умеет)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!