Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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()
    ;Dim ButtonCount As Integer
    ;Dim 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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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()
    ;Dim ButtonCount As Integer
    ;Dim ctl As Control
    ;Dim WBook As Excel.Workbook
    ;Dim 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
вот это?
Set WSheet = WBook.Worksheets.Item("Таблица";)

Ответить

Номер ответа: 8
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #8 Добавлено: 04.02.08 00:51
Шутка, конечно, на самом деле ты ещё один товариСЧ, который пытается одну процедуру прописать на все кнопки, ведь так?
ладно, это лирика, если по делу, то ошибка вот здесь...
For Each ctl In WSheet.Controls
Sheet поддерживает либо OleObject либо Shape, поэтому и искать надо соответсвующее!
После принятия некоторых исправлений, вот здесь
If TypeName(ctl) = "CommandButton" Then
ты поймёшь, о чём это я в начале.
ПС Всегда рад помочь! :)

Ответить

Номер ответа: 9
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #9 Добавлено: 04.02.08 04:30
В классе
Public WithEvents ctl As CommandButton

Private Sub ctl_Click()
MsgBox ctl.Name
End Sub

В модуле
Public Massiv() As New Class1

В модуле листа
Public Sub examp()
  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 поместите в "обычный" модуль. Для того, чтобы запускать автоматически, используйте
Private Sub Workbook_Open()
examp
End Sub

Ответить

Номер ответа: 11
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #11 Добавлено: 04.02.08 05:40
If Left(sh.Name, 7) = "Command"
а если имя другое?

Ответить

Номер ответа: 12
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #12 Добавлено: 04.02.08 07:24
Если честно - я что-т никак Type победить не могу.

Ответить

Номер ответа: 13
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #13 Добавлено: 04.02.08 08:24
Хотя если через Ole...
Public Sub examp()
  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()
  ;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

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

То есть, на созданные в процессе программы кнопки процедура не работает ?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам