Member 12691679 Ответов: 2

Я создал кроссворд с помощью командных кнопок в VBA под userform. Теперь я хотел выделить командные кнопки, когда пользователь нажимает на них. Пожалуйста помочь


Когда пользователь идентифицирует слово в кроссворде,он должен выделить его.

Однако я не могу выделить командную кнопку при нажатии пользователем.

Следующий код я использовал для создания сетки командных кнопок 10 x 10.

Private Sub cmd_Click()
FrmCross.Frame1.Controls(cnt).BackColor = RGB(0, 0, 255)
End Sub

Private Sub CmdReset_Click()
' for repeat crossword
    FrmCross.Frame1.Controls.Clear
    CmdStart.Enabled = True
End Sub
Private Sub CmdStart_Click()
'declare variable
    Dim Loop1, Loop2, ButTop, ButLeft As Integer
    Dim cmdbut As MSForms.CommandButton

    Application.ScreenUpdating = False
    Sheet1.Range("a1").Select

    ButTop = 20
    ButLeft = 20
    cnt = 0
' Display the list of words
    listbox1.RowSource = "Sheet2!A2:A10"
' Create 10* 10 Grid commandbox
    For Loop1 = 1 To 10
        For Loop2 = 1 To 10
            FrmCross.Frame1.Controls.Add ("Forms.CommandButton.1"), cnt, True
            FrmCross.Frame1.Controls(cnt).Top = ButTop
            FrmCross.Frame1.Controls(cnt).Left = ButLeft
            FrmCross.Frame1.Controls(cnt).Height = 25
            FrmCross.Frame1.Controls(cnt).Width = 30
            FrmCross.Frame1.Controls(cnt).Caption = ActiveCell.Offset(Loop2 - 1, Loop1 - 1).Value
            ButTop = ButTop + 25
            cnt = cnt + 1
        Next Loop2
        ButLeft = ButLeft + 30
        ButTop = 20
    Next Loop1
  
CmdStart.Enabled = False
Application.ScreenUpdating = True

End Sub


Применена следующая логика выделения командных кнопок

Private Sub UserForm_Activate()
    Dim Buttons() As New BtnClass
    Dim ButtonCount As Long
    Dim ctl As Control
    '   Create the Button objects
    ButtonCount = 0
    For Each ctl In Me.Controls
        If TypeName(ctl) = cnt Then
    'Skip the OK Button
        If ctl.Name <> "cmdStart" Or ctl.Name <> "cmdReset" Or ctl.Name <> "cmdCheck" Then
            ButtonCount = ButtonCount + 1
            ReDim Preserve Buttons(1 To ButtonCount)
            Set Buttons(ButtonCount).ButtonGroup = ctl
        End If
        End If
    Next ctl
End Sub

Public WithEvents ButtonGroup As MSForms.CommandButton
Private Sub ButtonGroup_Click()
    ButtonGroup.Name.BackColor = vbGreen
End Sub

Maciej Los

Вы пытались отладить программу? На первый взгляд кажется, что все в порядке. Я бы заменил UserForm_Activate событие с USerForm_Initialize.

2 Ответов

Рейтинг:
2

Maciej Los

Если вы хотите динамически добавить много CommandButtons на форме и вы хотите назначить тот же метод для Click событие, вы должны следовать приведенной ниже инструкции:


  1. Добавить новое Class Module в ваш проект (в Code pane окно, Используйте Insert->Class Module)
  2. Измените его название на MyBtnClass и поставьте там ниже код:
    Public WithEvents btn As MSForms.CommandButton
    
    Private Sub btn_Click()
        With btn
            .BackColor = vbYellow
            .ForeColor = vbRed
            .BackStyle = fmBackStyleOpaque
        End With
    End Sub

  3. Вставить новое UserForm и ударил F7 ключ для изменения вида на код; поместите его ниже кода:
    Option Explicit
    
    Dim btns() As New MyBtnClass
    
    Private Sub UserForm_Initialize()
    Dim i As Integer, b As MSForms.CommandButton, sName As String
    For i = 1 To 5
        sName = "Button_" & i
        Set b = Me.Controls.Add("Forms.CommandButton.1", sName, True)
        With b
            .Top = ((i - 1) * 32) + 8
            .Left = 10
            .Height = 24
            .Caption = sName
        End With
        ReDim Preserve btns(i)
        Set btns(i).btn = b
    Next
    End Sub

  4. Сохраните изменения и запустите код (F5)
  5. Когда вы нажимаете любую кнопку, backcolor и forecolor свойство контроля изменено ;)
  6. Вот и все!


Вы видите разницу?


Рейтинг:
0

Richard MacCutchan

If ctl.Name <> "cmdStart" Or ctl.Name <> "cmdReset" Or ctl.Name <> "cmdCheck" Then

Ну а если он не содержит "cmdStart", то он не будет проверять ни одно из других значений.