Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
448to452
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
448to452
448to452
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Klassenmodul - 30 Textfelder zusammenfassen

Klassenmodul - 30 Textfelder zusammenfassen
05.07.2004 16:33:22
{Boris}
Hallo Leute,
vorab: VBA-Nein müsste heissen: VBA-Grundkenntnisse.
Ich habe derzeit 11 verschiedene Textfelder (aus der Formularleiste), die ich gerne zu einer Klasse zusammenfügen möchte (es werden aber immer mehr, da der Bereich immer größer wird - wahrscheinlich bis zu 30 und mehr).
Ich brauche immer die Column-Eigenschaft des Textfeldes. Das bekomme ich auch hin mit

Sub Textfeld1_BeiKlick()
With ActiveSheet.Shapes(Application.Caller).TopLeftCell
Range("B5:L35").Sort Cells(3, .Column), IIf(Cells(5, .Column) > Cells(35, .Column), xlAscending, xlDescending)
End With
End Sub


Sub Textfeld2_BeiKlick()
With ActiveSheet.Shapes(Application.Caller).TopLeftCell
Range("B5:L35").Sort Cells(3, .Column), IIf(Cells(5, .Column) > Cells(35, .Column), xlAscending, xlDescending)
End With
End Sub

Also ich möchte immer immer einen Bereich sortieren - abhängig von der Spalte des Textfeldes. Aus optischen Gründen soll es auch ein Textfeld bleiben (ich möchte also nicht oder nur sehr ungern auf das Selection-Change oder Doubleclick-Ereignis der Zellen ausweichen).
Aber das müsste ich für alle Textfelder einzeln machen - und wahrscheinlich kommen auch bald noch einige dazu.
Wer könnte mir mal ein Beispiel geben, wie das mit einer Klasse geht?
Wäre auch ganz allgemein ein schöner Lerneffekt für mich.
Danke und Grüße
Boris
AW: Klassenmodul - 30 Textfelder zusammenfassen
Boris
Hi Nike,
danke bisweilen - hab mir das mal angeschaut. Ist aber für mich noch recht verwirrend, da ich wohl das Prinzip noch nicht ganz geschnallt habe.
Zudem weiss ich auch ad hoc nicht, wie man die Zeichnen-Textfelder in so einer Klasse anspricht (im Gegensatz zu UF-Textboxen).
Grüße Boris
AW: Klassenmodul - 30 Textfelder zusammenfassen
Udo
Bist du sicher, dass es ein Textfeld aus der Symbolleiste Formular gibt?
In Version 2002/2003 jedenfalls nicht.
Udo
Anzeige
Natürlich nicht aus Formular, sondern ZEICHNEN
Boris
Hi Udo,
...du hast natürlich Recht. Faux-Pas meinerseits.
Grüße Boris
AW: Natürlich nicht aus Formular, sondern ZEICHNEN
K.Rola
Hallo Boris,
weis allen Textfeldern das Makro "App_Caller()" zu:
Option Explicit

Sub App_Caller()
Dim intCol As Integer
intCol = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column
Call sort_auf_ab(intCol)
End Sub

''==========================================================================

Sub sort_auf_ab(col As Integer)
[B5:L35].Sort Cells(3, col), IIf(Cells(5, col) > Cells(35, col), xlAscending, xlDescending)
End Sub

Gruß K.Rola
Anzeige
Das funktioniert
Boris
Hi K.Rola,
...wie von Dir nicht anders zu erwarten - danke!
Das verkürzt das Ganze schon gewaltig und macht es übersichtlicher.
Es bleibt ja aber für jedes Textfeld ein eigener Prozedurrumpf mit der einzigen Anweisung App_Caller().
Daher dachte ich halt, es macht Sinn, das in einer Klasse zusammenzuführen.
Macht das Sinn? Falls ja: Wenn du Lust und Zeit hast, kannst du mir mal ein Beispiel dafür geben?
Danke und Grüße
Boris
AW: Das funktioniert
K.Rola
Hallo Boris,
falsch, du brauchst das Makro "App_Caller()" nur einmal,
musst es nur allen Textfeldern zuweisen.
Klassen mit Shapes gibts nicht(außer Diagramm).
Gruß K.Rola
Anzeige
AW: Das funktioniert
Boris
Hi K.Rola,
das hatte ich schon richtig verstanden - mich nur falsch ausgedrückt;-)
Aber das es Klassen für Shapes nicht gibt, ist ne klare Aussage, die, wenn sie denn von der Meisterin der Codezeilen kommt, für mich Gesetzescharakter hat.
Grüße
Boris
AW: Das funktioniert
K.Rola
Hallo Boris,
selbst wenn es gäbe, wäre es keinerfalls kompakter hinzubekommen,
als die jetzige Lösung. Denk mal darüber nach. :°)
Gruß K.Rola
AW: Das funktioniert
Boris
Hi K.Rola,
mein Rätsel also für den Abend :-p
Aber es ist wirklich kompakt - für alle, die es interessiert:
Option Explicit

Sub Textfeld1_BeiKlick()
App_Caller
End Sub


Sub Textfeld2_BeiKlick()
App_Caller
End Sub


Sub Textfeld3_BeiKlick()
App_Caller
End Sub


Sub Textfeld4_BeiKlick()
App_Caller
End Sub


Sub Textfeld5_BeiKlick()
App_Caller
End Sub


Sub Textfeld6_BeiKlick()
App_Caller
End Sub


Sub Textfeld7_BeiKlick()
App_Caller
End Sub


Sub Textfeld8_BeiKlick()
App_Caller
End Sub


Sub Textfeld9_BeiKlick()
App_Caller
End Sub


Sub Textfeld10_BeiKlick()
App_Caller
End Sub


Sub Textfeld11_BeiKlick()
App_Caller
End Sub


Sub App_Caller()
Dim intCol As Integer
intCol = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column
Call sort_auf_ab(intCol)
End Sub


Sub sort_auf_ab(col As Integer)
[B5:L35].Sort Cells(3, col), IIf(Cells(5, col) > Cells(35, col), xlAscending, xlDescending)
End Sub

Grüße Boris
Anzeige
Falsch, falsch falsch, 3 x Falsch
K.Rola
Hallo Boris,
genau das ist eben nicht nötig.
Weis jedem Textfeld das Makro App_Caller() direkt zu. Der Code ermittelt
mit ...TopLeftCell.Column die Spalte und übergibt diesen Wert an die Unterroutine.
Gruß K.Rola
Mensch - bin ich behämmert....
Boris
Hi K.Rola,
mea maxima Culpa für meine Beschränktheit...:-(((
Da stand ich ja mal völlig auf der Leitung...
Beschämte Grüße
Boris
AW: Klassenmodul - 30 Textfelder zusammenfassen
05.07.2004 19:22:58
Melanie
Hallo Boris,
gibt es einen besonderen Grund, warum du Textfelder aus der Zeichnen-Symbolleiste verwendest?
Wenn du dich entschließen kannst, Elemente der Steuerelement-Toolbox zu nehmen,
gibt es eine Möglichkeit alle Elemente mit 2 Prozeduren zu überwachen.
Dann entfallen auch die 30 'TextfeldN_BeiKlick()':-)
Leider gibt es bei dieser Methode für die TextBoxen kein Click-Ereignis,
sondern nur ein DblClick-Ereignis.
Deswegen habe ich für folgende Prozeduren in jeder Spalte Labels aufgezogen.
Rufe diese Prozedur z.B. im Workbook_Open auf, um die Labels zu initialisieren:
' Standardmodul
Public objEvents As New Collection
Public Sub SetLabel()
Dim obj As OLEObject
Dim objClass As cls_Event
For Each obj In ActiveSheet.OLEObjects
If obj.progID = "Forms.Label.1" Then
Set objClass = New cls_Event
Set objClass.objLabel = obj.Object
objEvents.Add objClass
End If
Next obj
End Sub
Füge in die Arbeitsmappe ein neues Klassenmodul ein und benenne es mit 'cls_Event.
Darin folgender Code:
' Klassenmodul cls_Event
Public WithEvents objLabel As MSForms.Label

Private Sub objLabel_Click()
Dim intCol As Integer
intCol = objLabel.TopLeftCell.Column
MsgBox objLabel.Name & " / " & "Spalte " & intCol
With Worksheets(objLabel.Parent.Name)
.Range("B5:L35").Sort Cells(3, intCol), _
IIf(Cells(5, intCol) > Cells(35, intCol), _
xlAscending, xlDescending)
End With
End Sub

Wenn du auf ein Label klickst, wird die Prozedur 'objLabel_Click' ausgeführt.
--
Mit freundlichen Grüssen
Melanie Breden
- Microsoft MVP für Excel -
http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Anzeige
AW: Klassenmodul - 30 Textfelder zusammenfassen
Boris
Hi Melanie,
gibt es einen besonderen Grund, warum du Textfelder aus der Zeichnen-Symbolleiste verwendest?
Die lassen sich einfach immer so schön und einfach formatieren - da sind Steuerelemente doch etwas "schwerfälliger" ;-)
Weiterhin funktioniert das ja - wie ich inzwischen von K.Rola gelernt habe - super einfach mit der Übergabe von 'Application.Caller' an eine einzige Sub. Das von mir gepostete Beispiel war ja schon wieder Schnee von gestern;-)
Wenn du dich entschließen kannst, Elemente der Steuerelement-Toolbox zu nehmen,
gibt es eine Möglichkeit alle Elemente mit 2 Prozeduren zu überwachen.

In diesem Fall werde ich mich dazu nicht mehr entschließen müssen, aber in Zukunft möchte ich mich mehr mit Klassenmodulen auseinandersetzen - und dabei von vornherein die Steuerelemente verwenden.
Dann entfallen auch die 30 'TextfeldN_BeiKlick()':-)
Wie bereits gesagt - die sind auch so bereits weg ;-)
Leider gibt es bei dieser Methode für die TextBoxen kein Click-Ereignis,
sondern nur ein DblClick-Ereignis.
Deswegen habe ich für folgende Prozeduren in jeder Spalte Labels aufgezogen.
Rufe diese Prozedur z.B. im Workbook_Open auf, um die Labels zu initialisieren:
[Schnipp]
Viel Code...
[Schnapp]

Und dennoch: Vielen Dank für das Beispiel und den Anschauungsunterricht - ich werde das in ruhiger Minute mal auseinandernehmen. Es wird mir sicherlich sehr behilflich sein, dieses Thema mal endlich zu "kapieren" ;-)
Vielen Dank und Grüße
Boris
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige