[VBA] withevents in dynamic form not working

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 15-08 13:07
Na lang zoeken heb ik gevonden dat ik toch gebruik moet maken van withevents om in dynamische forms/frames acties te definieren.
Op dit moment heb ik de volgende 2 stukken code:

Module 1
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public BaseFrame As Frame
Sub add_button()


' Create Frame for Metric Chooser
Set BaseFrame = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Frame.1", Link:=False, _
        DisplayAsIcon:=False, Left:=10, Top:=10, _
        Width:=490, Height:=230).Object

With BaseFrame
    .Object.Caption = "Metric Requirement - Chooser"
    .Name = "BaseFrame"
    .Enabled = True
End With

BaseFrame.Select
Selection.Verb Verb:=xlVerbPrimary
End Sub


In de worksheet heb ik de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Dim WithEvents clear_button As CommandButton


Private Sub clear_button_Click()
MsgBox "test"
End Sub


Sub add_button()

Module2.add_button
create_button_create
End Sub

Sub create_button_create()

Set clear_button = BaseFrame.Controls.Add("Forms.CommandButton.1", "clear_button", True)
With clear_button
    .Left = 100
    .Top = 10
    .Width = 75
    .Height = 30
    .Name = "clear_button"
    .Caption = "Clear"
End With

End Sub


Als ik de code manueel in 2 stappen uitvoer:
  1. Module1.Add_button
  2. create_button_create
Dan werkt de button wel.

Als ik de code automatisch uitvoer met de optie:
add_button -> uit de worksheet
Dan werkt de button niet.

Waar dit probleem ligt weet ik niet. Ik heb wel het idee dat ik iets fout doe. Wat er fout gaat weet ik niet.

Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 15-08 13:07
Is er niemand die me hiermee kan helpen?
Een withevent op het frame lukt wle, maar op het moment dat ik in 1 ruk de code uitvoer dan doet de code achter de button het niet meer.

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

tricky. Je hebt te maken met drie objecten: de shape op je worksheet, het msforms.object wat daarin bevat is en dan nog een VBA variabele die verwijst naar het msformsobject. De excel eventhandlers gaan daar niet even voorspelbaar mee om. Er zijn meer voorbeelden van quircky gedrag van geneste controls.

De enige workaround die ik me kan voorstellen is om de button geen dochtercontrol te maken van het frame object maar het direct op de worksheet te plaatsen.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 15-08 13:07
Gelukkig doe ik dus niks verkeerd en is dit dus een probleem van VBA.
Dan ga ik nu inderdaad de weg in die je voorsteld, alle controls hoogstens op sheet niveau in plaats van object niveau.

Voor het uiterlijk maakt dit niks uit en voor de werking ook niet.

Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 15-08 13:07
Ik ben aan het zoeken geweest, maar kan niet vinden wat ik zoek.
De volgende setup krijg ik niet aan de praat:
Reguliere module:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Public eXL As New eventsXL
  
Function Create_ComboBox()
Dim OLEObj As OLEObject
Dim myCell As Range

With eXL
    Set .WB = ActiveWorkbook
    Set .WS = .WB.ActiveSheet
    .WS.Activate
    
        .WS.Range("E2").NumberFormat = ";;;" 'hide the value in the cell
        Set OLEObj = .WS.Range("E2").Parent.OLEObjects.Add _
                    (ClassType:="Forms.ComboBox.1", Link:=False, _
                    DisplayAsIcon:=False, _
                    Top:=.WS.Range("E2").Top, _
                    Left:=.WS.Range("E2").Left, _
                    Width:=.WS.Range("E2").Width, _
                    Height:=.WS.Range("E2").Height)
    
    Set .ComboBox1 = OLEObj.Object
    With .ComboBox1
        .AddItem "A"
        .AddItem "B"
        .AddItem "C"
        .AddItem "D"
    End With

End With
End Function


Classe module (eventsXL)
code:
1
2
3
4
5
6
7
8
9
10
11
12
Public WithEvents XL As Excel.Application
Public WithEvents WB As Excel.Workbook
Public WithEvents WS As Excel.Worksheet
Public WithEvents ComboBox1 As MSForms.ComboBox
  
Private Sub myOLEObj_Change()
MsgBox "Hello"
End Sub

Private Sub ComboBox1_Change()
MsgBox "Hello"
End Sub