Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel VBA - jak obsłużyć zdarzenie "click" dla dynamicznie tworzonego

25 Wrz 2015 12:29 1206 1
  • Poziom 12  
    Witam.
    Mam kod, który na formularzu tworzy kilkanaście kontrolek typu "Combo". Jak podpiąć pod każdą taką kontrolkę obsługę zdarzenia "Click". Chodzi mi o to aby pobrać nazwę kontrolki która została wybrana i zależnie od tej nazwy wykonać odpowiednie polecenia. Najlepiej żeby to była jedna procedura.

    Code:

    Private Sub czTworzPolaCombo()
    Dim NowyComboBox As MSForms.ComboBox 'nazwa "Ctl"
    Dim X, Y, maxX, maxY, sz, margL, xDAN, yDAN As Integer
    Dim wartosc, wys

      ' skasowanie jak były utworzone
      czKasujPolaCombo
      ' tworzenie poł combo
      sz = 70 ' szerokość pola Combo
      x0 = 5
      y0 = 6
      margL = 60 ' lewy margines
     
      For X = 1 To czUstawMaxX(5, 5)
        ' utworzenie pola z nazwą zakłądki
        a = czUtworzNazwaArkusza(margL, sz, X, 1, x0, y0 - 1)
       
        For Y = 1 To czUstawMaxY(3, 6)
          ' utworzenie częsci wspólnej dla nazw plików
          a = czUtworzCzWspNazPlik(margL, sz - 25, Y, x0, 3)
         
          ' utworzenie pol Combo
          wartosc = Arkusz1.Cells(y0 + Y - 1, x0 + X - 1)
          Set NowyComboBox = FormSterowanie.Controls.Add("Forms.ComboBox.1")
         
          With NowyComboBox
            .Name = "KomboBox" & X & Y
            .Top = 10 + Y * 20
            .Width = sz
            .Left = margL
            .Font.Size = 8
            If wartosc <> "" Then
              .Text = wartosc
              .AddItem wartosc
              .BackColor = &HFF00&
            End If
          End With

          ' obsługa Click
          ' ......

        Next Y
        margL = margL + sz + 5
      Next X

    End Sub

  • Poziom 12  
    Nikt nie zainteresował się tym tematem. Dla zaawansowanego użytkownika pewnie to nie jest żaden problem. Po wielu próbach znalazłem rozwiązanie więc poniżej umieszczę. Może ktoś to kiedyś wykorzysta.
    Poniżej poprawiony kod makra

    Code:
    Option Explicit
    

    Private pComboboxes As Collection


    Private Sub czTworzPolaCombo()

    Dim X, Y, maxX, maxY, sz, margL, xDAN, yDAN As Integer
    Dim wartosc, wys, x0, y0, a
    Dim nazwaCombo

    Dim ctl As MSForms.ComboBox
    Dim cbx As c_Combobox

      If pComboboxes Is Nothing Then Set pComboboxes = New Collection

      ' skasowanie jak były utworzone
      czKasujPolaCombo
      ' tworzenie poł combo
      sz = 70 ' szerokość pola Combo
      x0 = 5
      y0 = 6
      margL = 60 ' lewy margines
      wybWartCombo.Caption = ""
     
      For X = 1 To czUstawMaxX(5, 5)
        ' utworzenie pola z nazwą zakłądki
        a = czUtworzNazwaArkusza(margL, sz, X, 1, x0, y0 - 1)
       
       
        For Y = 1 To czUstawMaxY(3, 6)
          ' utworzenie częsci wspólnej dla nazw plików
          a = czUtworzCzWspNazPlik(margL, sz - 25, Y, x0, 3)
         
          ' utworzenie pol Combo
          wartosc = Arkusz1.Cells(y0 + Y - 1, x0 + X - 1)
         
          Set ctl = FormSterowanie.Controls.Add("Forms.ComboBox.1")
          'Set ctl = Me.Controls.Add("Forms.ComboBox.1")
         
          nazwaCombo = "KomboBox_" & Y & "#" & X
         
          With ctl
            .Name = nazwaCombo
            .Top = 10 + Y * 20
            .Width = sz
            .Left = margL
            .Font.Size = 8
            If wartosc <> "" Then
                .Text = wartosc
                .AddItem wartosc
                .AddItem nazwaCombo
                .BackColor = &HFF00&
              Else
                .Enabled = False
            End If

            'obsługa zdarzenia
            Set cbx = New c_Combobox ' jak zdefiniować tę klasę opis poniżej
            cbx.SetCombobox ctl
            pComboboxes.Add cbx

          End With
        Next Y
        margL = margL + sz + 5
      Next X
      FormSterowanie.Width = margL + 10

    End Sub



    Poniżej definicja Klasy, "c_Combobox" w której jest zdefiniowana obsługa kliknięcia. Informacja dla początkujących: kod poniżej trzeba wkleić w treść modułu nowej klasy. Robi to się klikając na moduły i wybierając Insert -> "Class Module". Tak utworzonej klasie trzeba jeszcze zmienić nazwę na "c_Combobox". To wszystko, dalsze polecenia już każdy może dorobić stosownie do swoich potrzeb.

    Code:

    Option Explicit

    Public WithEvents cbx As MSForms.ComboBox

    Sub SetCombobox(ctl As MSForms.ComboBox)
        Set cbx = ctl
    End Sub

    Private Sub cbx_Change()
        If cbx.ListIndex > -1 Then
            MsgBox "Wybrałeś Combo o nazwie >>" & cbx.Name & "<<" & vbLf & _
                   "Wybrana wartość to >>" & cbx.Value & "<<"
            ' kolejna działania na wybranej wartości
           
        End If
    End Sub