kann ich die Value von einer TextBox in einem Label ausgeben?

1 Antwort

Andersherum: ItemLabel.Caption = "Text, der angezeigt werden soll"

Außerdem ist ein TabStrip nicht besonders handlich - es ist letztlich nur ein Rahmen mit einer Art Label-Gruppe für die "Tabs" - du musst dich nicht nur um das Hinzufügen (und Löschen) jedes einzelnen enthaltenen Steuerelements kümmern, sondern auch darum beim Tab-Wechsel alle benötigten Elemente einzublenden und alle anderen auszublenden. (In dieser Hinsicht ist ein Multipage-Object (Multiseiten-Objekt) einfacher handhabbar - jedenfalls, wenn die Seiten vorher bekannt sind.)

Hier ist ein TabStrip wohl brauchbar, allerdings würde ich überlegen, die Steuerelemente für jedes einzelne Item (jede einzelne Aufgabe) in einen eigenen Rahmen (Frame) setzen (den Rahmen kann man ausblenden) - damit kann man eine ganze Gruppe von Steuerelementen gleichzeitig ein- bzw. ausblenden.

-----

Leider kann man in VBA keine eigenen erweiterten Steuerelemente verwenden oder eigene UserForms als Steuerelemente benutzen - das würde die Sache ERHEBLICH vereinfachen.

An dieser Stelle merkt man, dass VBA 6 in erster Linie für Dokumente (wie Excel-Tabellen) gedacht ist und nicht für eigenständige Anwendungsfenster. Das Erzeugen von neuen Steuerelementen (Controls) zur Laufzeit ist m. E. übermäßig unübersichtlich (man benötigt den internen Namen der Steuerelement-Klasse bei Control.Controls.Add).

Vgl. auch https://stackoverflow.com/questions/61983200/create-a-custom-form-control

Danach ist es einfacher, die eigentliche Anwendung extern (z. B. mit VBA.NET in Visual Studio) zu erstellen und in VBA einzubinden - aber das ist für ein einmaliges Projekt leider viel zu kompliziert.

-----


Julperx 
Beitragsersteller
 12.04.2025, 13:49

Vielen Dank für deine sehr ausführliche Antwort.

Ich würde weiterhin auf die Registerkarten (Tabs) setzten aber mit einen Frame arbeiten.

Kannst du mir erklären wie ich es hinbekomme das der jeweilige Text in dem Label, welches in dem Frame ist nur in der jeweiligen Registerkarte angezeigt wird? Und ob sich das speichern lässt, ich also zwischen den Registerkarten hin und her wechseln kann und der Text immer da steht.

PWolff  12.04.2025, 13:57
@Julperx

Du hast im Wesentlichen zwei Möglichkeiten:

  • für jedes Item (hier Aufgabe) einen eigenen Frame erstellen und darin die weiteren Elemente erzeugen (Label, Kalender, ...)
  • die Element ein einziges Mal erzeugen und bei jedem Klick auf eine Registerkarte neu füllen (erfordert eine Datenhaltung im Hintergrund - ob als Variable in der UserForm oder in einer eigenen Excel-Tabelle)

Im Ereignis-Handler des Change-Ereignisses des TabStrips

Private Sub TabStrip1_Change()

werden dann die Frames aus- und eingeblendet bzw. die Steuerelemente gefüllt.

Wenn du die Steuerelemente nur ein einziges Mal da stehen hast und einige davon sich ändern lassen, müssen diese Änderungen natürlich als Erstes gespeichert werden.

(Auf die Idee, die Steuerelemente nur ein einziges Mal zu erzeugen, bin ich leider erst gerade eben gekommen - ich bin zu sehr gewöhnt, eine eigene Steuerelement-Klasse zu erstellen, also eine Art UserForm, die sich wie ein Steuerelement verwenden lässt. - Die Elemente nur ein einziges Mal zu haben, hat einen großen Vorteil: die Gesamtzahl der Steuerelemente auf einer UserForm ist - soweit ich mich erinnere - auf 256 (insgesamt!) beschränkt. Wenn man viele Registerkarten mit jeweils vielen Elementen hat, kommt man da schnell an die Grenze.)

Julperx 
Beitragsersteller
 12.04.2025, 22:54
@PWolff

Nochmals vielen Dank für deine Antwort.

Hast du einen Beispiel Code für das ganze?

Wie gesagt ich habe die Registerkarten und darin ist jetzt ein Frame mit den ganzen Elementen. Das Ziel ist es den Inhalt beim Wechsel der Registerkarte zu speichern und die neuen Elemente zu der neuen Aufgabe ein- bzw. die alten auszublenden.

PWolff  14.04.2025, 13:39
@Julperx

Im Moment würde ich dazu neigen, die Steuerelemente nur ein einziges Mal anzulegen und jedesmal neu zu füllen. Die Daten stehen in einer eigenen Excel-Tabelle - eine eigene Datei ist auch möglich, aber erfordert zusätzlich Einarbeitung in Dateioperationen.

Zwar könnte ich dir den kompletten Code liefern, aber dann würdest du nichts lernen. (Außerdem würde ich als Freelancer einen Freundschaftspreis von einem gerade noch zweistelligen Europreis pro Stunde plus Mehrwertsteuer veranschlagen. - Schätzung 30 Minuten für eine halbwegs lauffähige Version, vermutlich 3 Stunden, bis alle Feinheiten erledigt sind.)

Das Einlesen geht ungefähr so:

Set DataSheet = ActiveWorkbook.Worksheets("Datenhaltung")
SatzNummer = TabStrip1.Value
ZeileNummer = SatzNummer + 2 ' 1 Überschrift, 1 Offset - TabStrip1.Value ist 0-basiert, Zeilennummer 1-basiert
Set currentTab = TabStrip1.Tabs.Item(TabStrip1.Value)
currentTab.Caption = DataSheet.Cells(Zeilennummer, 1) ' nur nötig, wenn ein Datensatz neu eingelesen wird; das ist eine der zahlreichen Feinheiten, die bei Software-Projekten üblicherweise so zu erledigen sind
TextBox1.Text = DataSheet.Cells(Zeilennummer, 2).Value
TextBox2.Text = DataSheet.Cells(Zeilennummer, 3).Value
ComboBox1.Value = CBool(DataSheet.Cells(Zeilennummer, 4).Value)
' usw.

Schreiben in die Tabelle: umgekehrt.

DataSheet.Cells(Zeilennummer, 4).Value = Format(ComboBox1.Value)
'usw.

Beim Löschen sollte der letzte Tab stehenbleiben - viele Steuerelemente mit mehreren Unterelementen machen Probleme, wenn kein Unterelement mehr da ist. Dann sollte eine eigene Caption wie "<kein Eintrag>" da stehen und der TabStrip sowie die Elemente darauf deaktiviert werden (Control.Enabled = False). Sobald wieder ein Tab da ist, natürlich wieder aktivieren.

Ereignishandler für Tab-Wechsel z. B.:

Private Sub TabStrip1_Change()
    'TabStrip1.Tag enthält den alten Wert von TabStrip1.Value oder Leerstring, falls kein Tab ausgewählt war
    If IsNumeric(TabStrip1.Tag) Then
        SatzNummer = CLng(TabStrip1.Tag)
        ZeileNummer = SatzNummer + 2
        ' weiter wie oben
    End If
    If KeinTabVorhanden Then ' eigene Variable, die angibt, ob der letzte Tab als gelöscht werden soll
        TabStrip1.Tag = ""
    Else
        TabStrip1.Tag = Format(TabStrip1.Value)
        SatzNummer = TabStrip1.Value
        ZeileNummer = SatzNummer + 2
        ' weiter wie oben
    End If
End Sub