Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Klassenmodul für ActiveX-Controls in Tabellen
zurück: Das TreeView-Control weiter: Notiz in Kommentar Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Isabelle :-)
Menschin


Verfasst am:
02. Sep 2013, 21:10
Rufname:
Wohnort: Westlicher Spiralarm der Galaxis


Klassenmodul für ActiveX-Controls in Tabellen - Klassenmodul für ActiveX-Controls in Tabellen

Nach oben
       Version: Office 2k (2000)

Hallöchen,

weil immer wieder der falsche Ansatz versucht wird, hier mal ein Beispiel wie es funktioniert.

Den Fehler den die meisten machen, sie versuchen entweder die Klasse direkt nach dem Erstellen des Controls zu instanziieren, oder rufen aus der Erstell-Routine die Instanziierroutine per Call auf.

Das klappt aber so nicht, und das hat folgenden Hintergrund. Beim Einfügen eines ActiveX-Controls muss Excel in den Entwurfsmodus gehen. Dieser Modus bleibt dann bis zum Ende der Prozedur erhalten. Darum kann so eine Prozedur auch nicht mit F8 schrittweise durchgegangen werden. Da meldet Excel dann einen Fehler: „Wechseln in den Haltemodus ist zu diesem Zeitpunkt nicht möglich“. Dasselbe passiert übrigens auch beim Löschen von ActiveX-Controls per VBA.

Das wechseln in den Entwurfsmodus beim Einfügen von ActiveX-Controls in Tabellen hat auch noch andere Auswirkungen. So werden alle eigenen Klassen zerstört und alle öffentlichen Variablen zurückgesetzt.

Also, was können wir tun? Wir müssen die Prozeduren entkoppeln, so dass Excel die Möglichkeit hat den Entwurfsmodus zu beenden. Dazu bietet sich die Application.OnTime-Methode an. Die Methode rufen wir einfach nach dem Erstellen der Controls auf. Wenn das direkt vor dem „End Sub“ geschieht, dann können wir das auch ohne Verzögerung machen.


Hierzu ein Beispiel:

Im Modul „DieseArbeitsmappe“:

Code:
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not Saved Then
        Select Case MsgBox("Sollen Ihre Änderungen in '" & Name & _
            "' gespeichert werden", vbExclamation Or vbYesNoCancel)
            Case vbYes
                Save
            Case vbNo
                Saved = True
            Case vbCancel
                Cancel = True
        End Select
    End If
    If Not Cancel Then Call TerminateCheckBoxClass
End Sub

Private Sub Workbook_Open()
    Call InitCheckBoxClass
End Sub


In einem Standardmodul:

Code:
Option Explicit
Option Private Module

Private lobjCheckBoxCollection As Collection

Public Sub InitCheckBoxClass()

    Dim objOLEObject As OLEObject
    Dim objCheckBoxClass As clsCheckBox

    'Neue Instanz der Collection zum aufnehmen der Klassen initialisieren
    Set lobjCheckBoxCollection = New Collection

    'Schleife über alle OLE-Objekte der Tabelle1
    For Each objOLEObject In Tabelle1.OLEObjects

        'Wenn eine CheckBox gefunden wurde
        If objOLEObject.ProgId = "Forms.CheckBox.1" Then

            'Neue Instanz der Klasse erzeugen
            Set objCheckBoxClass = New clsCheckBox
           
            'CheckBox an die Klasse übergeben
            Set objCheckBoxClass.CheckBox = objOLEObject.Object

            'Insatnz der Klasse an die Collection übergeben
            Call lobjCheckBoxCollection.Add(Item:=objCheckBoxClass)

        End If
    Next

    'Objekte zurücksetzen
    Set objOLEObject = Nothing
    Set objCheckBoxClass = Nothing

End Sub

Public Sub TerminateCheckBoxClass()

    'Collection zurücksetzen
    Set lobjCheckBoxCollection = Nothing

End Sub

Public Sub CreateCheckBoxes()

    Dim objOLEObject As OLEObject
    Dim lngRow As Long

    'Vorsichtshalber vorhandene Klassen zerstören
    Call TerminateCheckBoxClass
   
    'Vorhandene CheckBoxes löschen
    Call DeleteCheckBoxes

    With Tabelle1

        '10 CheckBoxes erstellen
        For lngRow = 2 To 20 Step 2

            'Checkbox an vorgegebener Position erstellen
            Set objOLEObject = .OLEObjects.Add( _
                ClassType:="Forms.CheckBox.1", _
                Left:=.Cells(lngRow, 3).Left, _
                Top:=.Cells(lngRow, 3).Top, _
                Width:=70, Height:=22)

            'Beschriftung ändern
            objOLEObject.Object.Caption = "Test " & CStr(lngRow \ 2)

        Next
    End With

    'Objekt zurücksetzen
    Set objOLEObject = Nothing

    'Entkoppelt den Initialisierungprozesse der Klasse aufrufen
    Call Application.OnTime(EarliestTime:=Now, Procedure:="InitCheckBoxClass")

End Sub

Public Sub DeleteCheckBoxes()

    Dim objOLEObject As OLEObject

    'Schleife über alle OLE-Objekte in der Tabelle1
    For Each objOLEObject In Tabelle1.OLEObjects

        'Wenn eine CheckBox gefunden wurde dann löschen
        If objOLEObject.ProgId = "Forms.CheckBox.1" Then objOLEObject.Delete

    Next

    'Objekt zurücksetzen
    Set objOLEObject = Nothing

End Sub


In einem Klassenmodul mit dem Namen „clsCheckBox“:

Code:
Option Explicit

Private WithEvents mobjCheckBox As MSForms.CheckBox

Private Sub Class_Terminate()
    Set mobjCheckBox = Nothing
End Sub

Friend Property Set CheckBox(ByRef probjCheckBox As MSForms.CheckBox)
    Set mobjCheckBox = probjCheckBox
End Property

Private Sub mobjCheckBox_Click()
    mobjCheckBox.ForeColor = IIf(mobjCheckBox.Value, vbBlue, vbBlack)
End Sub


Und natürlich brauchen wir in der Tabelle noch einen Commandbutton zum Aufruf der Routine:

Code:
Option Explicit

Private Sub CommandButton1_Click()
    Call CreateCheckBoxes
End Sub

_________________
LG Isi

Die Mitgliedschaft im Forum erhöht deine Chance auf eine Antwort von mir um 99,999%
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel Formeln: Zellen aus verschiedenen Tabellen addieren 5 Klaus D. 1949 01. Feb 2006, 20:47
Klaus D. Zellen aus verschiedenen Tabellen addieren
Keine neuen Beiträge Excel Formeln: Zwei Excel Tabellen verbinden??? 1 Hirschi 21003 17. Jan 2006, 11:31
Günni Zwei Excel Tabellen verbinden???
Keine neuen Beiträge Excel Formeln: Mittels 2 Tabellen eine Übersicht erstellen 11 atwin97 1304 05. Okt 2005, 09:55
atwin97 Mittels 2 Tabellen eine Übersicht erstellen
Keine neuen Beiträge Excel Formeln: Daten aus 2 Tabellen verbinden 3 sleepydienst 2686 13. Sep 2005, 10:18
fridgenep Daten aus 2 Tabellen verbinden
Keine neuen Beiträge Excel Formeln: Verknüpfen von mehreren Tabellen 18 tobiasu 3577 19. Aug 2005, 11:11
tobiasu Verknüpfen von mehreren Tabellen
Keine neuen Beiträge Excel Formeln: Verknüpfung von Tabellen 6 dragonfly 1356 11. Jul 2005, 10:26
dragonfly Verknüpfung von Tabellen
Keine neuen Beiträge Excel Formeln: werte aus verschiedenen tabellen addieren 3 Actiongreg 2518 06. Jul 2005, 17:23
actiongreg werte aus verschiedenen tabellen addieren
Keine neuen Beiträge Excel Formeln: Tabellen vergleichen 1 dolce.41 2184 21. Feb 2005, 00:26
Gast A Tabellen vergleichen
Keine neuen Beiträge Excel Formeln: Vergleich zweier Tabellen 2 Enjoy82 1975 25. Nov 2004, 13:50
Enjoy82 Vergleich zweier Tabellen
Keine neuen Beiträge Excel Formeln: Tabellen auswertung, errechnung, ausgabe 4 L*R 905 11. Nov 2004, 15:34
L*R Tabellen auswertung, errechnung, ausgabe
Keine neuen Beiträge Excel Formeln: Verknüpfungen zu anderen Tabellen 2 Flohh 1027 21. Okt 2004, 06:54
Flohh Verknüpfungen zu anderen Tabellen
Keine neuen Beiträge Excel Formeln: Inhalte aus zwei Excel Tabellen in dritter zusammenfassen 0 AB 3289 11. Okt 2004, 13:49
AB Inhalte aus zwei Excel Tabellen in dritter zusammenfassen
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Excel Tricks