Циклически присвоить свойства кнопкам

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
RomaS
Сообщения: 57
Зарегистрирован: 05 мар 2008, 09:59

Вопрос: На форме имеются 10 кнопок, надо каждой из них присвоить имя и действие согласно данных на листе эксель. Не получается указать указать имя для очередного контрола. Делал так:

Код: Выделить всё

 For n = 1 To 10
If ThisWorkbook.Worksheets("История").Cells(n + 3, 3) <> "" Then UserForm1.CommandButton(n).Enabled = True
With UserForm1.CommandButton(n)
.Action = "hist"
.Caption = "Реестр № " & _
ThisWorkbook.Worksheets("История").Range("d5").Value & _
 " выгружен " & ThisWorkbook.Worksheets("История").Range("c5").Value & _
 "  за  " & ThisWorkbook.Worksheets("История").Range("e5").Value
End With
Next 
Ругается на (n). Как задать номер кнопки по-другому?
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Ну во первых, вы наверно имели в виду (судя по примеру) присваивание кнопкам не имени (Name) а заголовка (Caption) .... ;)
Во вторых, Вы путаете кнопки пользовательской формы MSForms.CommandButton и объект CommandBar - это совершенно
разные объекты несмотря на внешнюю схожесть
Изменить Caption в цикле для кнопки n на форме UserForm1 можно так

Код: Выделить всё

.....
UserForm1.Controls("CommandButton" & format$(n,"#")).caption= ..... 
....
C действием сложнее - свойства Action у кнопки на форме нет.
Нужно воспользоваться обявлением кнопок как класса с ключевым словом WithEvents
Если помимо обрабатываемых в цикле на форме есть и другие кнопки нужно при проектировании
присвоит вашим кнопкам регулярные имена. Например: Btn1...Btn10
В модуле MyModule размещаете код

Код: Выделить всё

Public MyBtnArray() As New myButtonClass
В Модуле класса myButtonClass размещаете код

Код: Выделить всё

Option Explicit
Public WithEvents MyBtn As MSForms.CommandButton
Private Sub MyBtn_Click()
     select case Int(Mid$(MyBtn.Name,4))
           Case 1:
                   'Обработка нажатия Btn1
           Case10:
                   'Обработка нажатия Btn10
     end select
End Sub
А в модуле формы пишете

Код: Выделить всё

Private Sub UserForm_Initialize()
   Dim i As Integer
   ReDim MyBtnArray(1 To 10)
   For i = 1 To 10
          Set MyBtnArray(i).MyBtn = UserForm1.Controls(Format$(i, """Btn""#"))
   Next i
End Sub
Разумеется, используя эту технологию можно и динамически создавать кнопки на форме.
Примеры находятся на этом форуме всё по тому же ключевому слову WithEvents
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Кстати, вместо имени кнопки часто бывает удобно использовать свойство .Tag
Андрей Энтелис,
aentelis.livejournal.com
RomaS
Сообщения: 57
Зарегистрирован: 05 мар 2008, 09:59

Спасибо, видимо я не правильн сформулировал задачу, но все таки я имел ввиду имя кнопки, чтобы в дальнейшем каждой циклически присвоить некоторые свойства (например, каждая обрабатывает свою строку на листе). У меня всего 10 кнопок, поэтому решил задачу на мой взгляд проще:

коды кнопок:

Код: Выделить всё

 Private Sub CommandButton12_Click() ' первая строка
Dim x As Integer
x = 1
hist_prop (x)
End Sub

Private Sub CommandButton13_Click() ' вторая строка
Dim x As Integer
x = 2
hist_prop (x)
End Sub 
код макроса:

Код: Выделить всё

 Sub hist_prop(x) 
Dim pathx As String
UserForm1.CommandButton22.Visible = False
If x < 1 Then Exit Sub
UserForm1.Label28 = "Реестр № " & _
ThisWorkbook.Worksheets("История").Cells(x + 1, 4).Value & _
......... 
Ответить