Страница: 1 | 2 |
Вопрос: Народ, помогите плиз с кнопками в Excel
Добавлено: 02.02.08 01:50
Автор вопроса: Bublik
Необходимо при создании таблицы в Экселе напротив определенных ячеек создавать кнопки. Есть какие-либо пути решения? ;) Спасиб!
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #1
Добавлено: 02.02.08 12:55
Начнём с того, что "А можете ли Вы создавать кнопки на листе?" Если ответ на этот вопрос у Вас вызывает усмешку, то вопрос сводится к примитиву: каждая ячейка обладает рядом свойств геометрии и, естественно, адресом(типа Cell(2,3).top = 25)
Отсюда и пляшете!
ПС: Если всё-таки первая часть вопроса вызывает у Вас затруднение, то необходимо следовать по-порядку.
Номер ответа: 2
Автор ответа:
Bublik
Вопросов: 2
Ответов: 10
Профиль | | #2
Добавлено: 03.02.08 01:31
Ага, понял, спасибо!
Добавляю кнопки вот так...
ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
, DisplayAsIcon:=False, Left:=408.75, Top:=98.25, Width:=75.75, Height _
:=41.25).Select
Соответственно, подставил нужные координаты и все получилось ))
Только теперь возник такой вопрос... Кнопок получается достаточно много и их количество может меняться, соответственно при нажатии на них должна выполняться определенная процедура.
Думал по аналогии с Формами использовать такой вариант с объединением кнопок в группу, но что-то никак не выходит...
Option Explicit
Public WithEvents ButtonGroup As CommandButton
Private Sub ButtonGroup_Click()
Beep
End Sub
Option Explicit
Dim Buttons() As New BtnClass
Private Sub UserForm_Initialize()
 im ButtonCount As Integer
 im ctl As Control
ButtonCount = 0
For Each ctl In UserForm1.Controls
If TypeName(ctl) = "CommandButton" Then
ButtonCount = ButtonCount + 1
ReDim Preserve Buttons(1 To ButtonCount)
Set Buttons(ButtonCount).ButtonGroup = ctl
End If
Next ctl
End Sub
Как найти все кнопки на листе ??
Номер ответа: 3
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #3
Добавлено: 03.02.08 13:05
См. коллекции контролов определённого типа
Номер ответа: 4
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #4
Добавлено: 03.02.08 20:32
Дык, сменить надо Form на Sheet(один класс на другой!)
Номер ответа: 5
Автор ответа:
Bublik
Вопросов: 2
Ответов: 10
Профиль | | #5
Добавлено: 03.02.08 20:42
Так я вроде так и сделал... Не выходит... Ругается (((
Номер ответа: 6
Автор ответа:
Bublik
Вопросов: 2
Ответов: 10
Профиль | | #6
Добавлено: 03.02.08 20:54
Private Sub UserForm_Initialize()
 im ButtonCount As Integer
 im ctl As Control
 im WBook As Excel.Workbook
 im WSheet As Excel.Worksheet
Set WBook = Workbooks("excel.xlsm"
Set WSheet = WBook.Worksheets.Item("Таблица"
ButtonCount = 0
For Each ctl In WSheet.Controls
If TypeName(ctl) = "CommandButton" Then
ButtonCount = ButtonCount + 1
ReDim Preserve Buttons(1 To ButtonCount)
Set Buttons(ButtonCount).ButtonGroup = ctl
End If
Next ctl
видно все-таки что-то не то сделал... (((
Номер ответа: 7
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #7
Добавлено: 03.02.08 20:58
вот это?
Номер ответа: 8
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #8
Добавлено: 04.02.08 00:51
Шутка, конечно, на самом деле ты ещё один товариСЧ, который пытается одну процедуру прописать на все кнопки, ведь так?
ладно, это лирика, если по делу, то ошибка вот здесь...
После принятия некоторых исправлений, вот здесь
ПС Всегда рад помочь!
Номер ответа: 9
Автор ответа:
bi-lya
Вопросов: 1
Ответов: 125
Профиль | | #9
Добавлено: 04.02.08 04:30
В классе
Private Sub ctl_Click()
MsgBox ctl.Name
End Sub
В модуле
В модуле листа
Dim sh As Shape, i As Long
i = 0
For Each sh In Sheets(1).Shapes
If Left(sh.Name, 7) = "Command" Then
ReDim Preserve Massiv(i)
Set Massiv(i).ctl = sh.OLEFormat.Object.Object
i = i + 1
End If
Next
End Sub
(с)Дмит (dimit)
Номер ответа: 10
Автор ответа:
bi-lya
Вопросов: 1
Ответов: 125
Профиль | | #10
Добавлено: 04.02.08 05:09
Поправка - процедуру examp поместите в "обычный" модуль. Для того, чтобы запускать автоматически, используйте
examp
End Sub
Номер ответа: 11
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #11
Добавлено: 04.02.08 05:40
Номер ответа: 12
Автор ответа:
bi-lya
Вопросов: 1
Ответов: 125
Профиль | | #12
Добавлено: 04.02.08 07:24
Если честно - я что-т никак Type победить не могу.
Номер ответа: 13
Автор ответа:
bi-lya
Вопросов: 1
Ответов: 125
Профиль | | #13
Добавлено: 04.02.08 08:24
Хотя если через Ole...
Dim sh As OLEObject, i As Long
i = 0
For Each sh In Sheets(1).OLEObjects
If TypeName(sh.Object) = "CommandButton" Then
ReDim Preserve Massiv(i)
Set Massiv(i).ctl = sh.Object
i = i + 1
End If
Next
End Sub
:D
Номер ответа: 14
Автор ответа:
Bublik
Вопросов: 2
Ответов: 10
Профиль | | #14
Добавлено: 04.02.08 22:04
Урра, все залетало )) Спасибо всем за разбор полета ))))
Номер ответа: 15
Автор ответа:
Bublik
Вопросов: 2
Ответов: 10
Профиль | | #15
Добавлено: 05.02.08 01:48
Создал форму на ней две кнопки на одной весит процедура examp, на второй ins... на листе пара кнопок. При вызове examp первой кнопки на листе добавляются в группу, но если до этого выполнить процедуру ins и создать на листе новую кнопку, то examp уже не работает ...
Public Massiv() As New Class1
Public Sub examp()
 im sh As OLEObject, i As Long
i = 0
For Each sh In Sheets(1).OLEObjects
If TypeName(sh.Object) = "CommandButton" Then
ReDim Preserve Massiv(i)
Set Massiv(i).ctl = sh.Object
i = i + 1
End If
Next
End Sub
Public Sub ins()
ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
, DisplayAsIcon:=False, Left:=108.75, Top:=137.25, Width:=72.75, _
Height:=54.75).Select
End Sub
То есть, на созданные в процессе программы кнопки процедура не работает ?