Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1728to1732
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
Inhaltsverzeichnis

Array für mehrere TextBoxen

Array für mehrere TextBoxen
29.12.2019 14:33:18
Peer
Hallo liebe VBA-Gemeinde.
Ich möchte gern über eine Checkbox "chk_Dienstreise" viele Textboxen, Radiobutton und ComboBoxen steuern. Dabei habe ich an ein Array gedacht und mit meinen Anfänger-Latein folgendes gebastelt.
Private Sub chk_Dienstreise_Click()
If chk_Dienstreise = False Then
With txt_Zieladresse
.Enabled = False    'deaktiviert
.BackColor = &H8000000F     'grau
End With
Else
With txt_Zieladresse
.Enabled = True     'aktiviert
.BackColor = RGB(255, 255, 255) 'weiss
End With
End If
End Sub
Hier soll mit Deaktivieren der Checkbox als Beispiel die TextBox "txt_Zieladresse" deaktiviert und grau hinterlegt werden. Wenn die CheckBox aktiviert wird, soll die TextBox wieder beschreibbar sein.
Das möchte ich mit mehreren Objekten auf der UF machen.
Um nicht einzeln alles aufzulisten, dachte ich an Array.
Ist die Idee umsetzbar?
Mein Versuch

Private Sub chk_Dienstreise_Click()
Dim arrFelder(), i As Byte
arrFelder = Array("txt_Zieladresse", "txt_Abgabe")
If chk_Dienstreise = False Then
For i = 0 To UBound(arrFelder())
arrFelder(i).BackColor = &H8000000F     'grau
arrFelder(i).Enabled = False     'deaktiviert
Next
Else: Exit Sub
End If
End Sub

führt nicht zum Ergebnis.
Ist die Überlegung überhaupt sinnvoll?
LG
Peer

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 14:54:00
Nepumuk
Hallo Peer,
teste mal:
Private Sub chk_Dienstreise_Click()
    
    Dim objItem As Variant
    
    If Not chk_Dienstreise.Value Then
        
        For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
            
            With objItem
                
                .BackColor = &H8000000F 'grau
                .Enabled = False 'deaktiviert
                
            End With
        Next
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 16:51:37
Peer
Vielen Dank, Nepumuk.
Starke Leistung.
Was muss ich noch eingeben, wenn ich die Checkbox wieder aktiviere?
Einfaches
    If Not chk_Dienstreise.Value Then
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = &H8000000F 'grau
.Enabled = False 'deaktiviert
End With
Next
Else: Exit Sub
End If
reicht nicht. Muss ich hier alles wieder "umdrehen"? Oder geht es doch einfacher?
LG
Peer
AW: Array für mehrere TextBoxen
29.12.2019 17:05:41
Oberschlumpf
Hi,
versuch es so:

If Not chk_Dienstreise.Value Then
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = &H8000000F 'grau
.Enabled = False 'deaktiviert
End With
Next
Else
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = '? andere Farbe
.Enabled = True 'aktiviert
End With
Next
End If
Ciao
Thorsten
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 18:05:39
Peer
Hallo Thorsten.
So habe das mit "umdrehen" gemeint.
LG
Peer
AW: Array für mehrere TextBoxen
29.12.2019 18:28:53
Oberschlumpf
Hi Peer,
und SO würde ich es machen:

If Not chk_Dienstreise.Value Then
sbTxtboxEnabledOrNot False, &H8000000F
Else
sbTxtboxEnabledOrNot True, ? = deine andere Farbe für aktiviert
End If
Sub sbTxtboxEnabledOrNot(ByVal YesOrNo As Boolean, ByVal farbe As Long)
Dim objItem As Object
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = farbe
.Enabled = YesOrNo 'wenn False, dann deaktiviert / wenn True, dann aktiviert
End With
Next
End Sub

Vorteil:
Die For/Next-Schleife musst du nur 1x schreiben. Die entsprechenden Parameter werden an die Schleife übergeben.
Ciao
Thorsten
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 18:45:53
Oberschlumpf
und hier mit MsgBox-Warnung:

If Not chk_Dienstreise.Value Then
If MsgBox("Datenfelder wirklich löschen´?", _
vbYesNo, "Daten der Dienstreise löschen") = vbNo Then Exit Sub
sbTxtboxEnabledOrNot False, &H8000000F
Else
sbTxtboxEnabledOrNot True, ? = deine andere Farbe für aktiviert
End If
Sub sbTxtboxEnabledOrNot(ByVal YesOrNo As Boolean, ByVal farbe As Long)
Dim objItem As Object
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = farbe
.Enabled = YesOrNo 'wenn False, dann deaktiviert / wenn True, dann aktiviert
End With
Next
If YesOrNo = False Then
'hier alle Befehle rein, mit denen Txt- und andere Boxen geleert werden
End If
End Sub

Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 18:54:16
Peer
Hallo Thorsten.
Danke für deine Mühe.
Interessant für einen Laien ist deine Version definitiv. Ich versuche den Code zu verstehen, aber den Zusammenhang zwischen "externen" und "internen" Sub kann ich bis jetzt nicht nachvollziehen.
Bei deiner vorherigen Variante brauchte ich doch auch nur die Objekte im Array einmal eintragen, oder?
Und wie kann ich fehlerhaftes Klicken und damit das Löschen über eine Abfrage auffangen?
LG
Peer
AW: Array für mehrere TextBoxen
29.12.2019 18:33:45
Peer
Hallo.
Ich hatte über so etwas nachgedacht.
Dabei wäre es sinnvoll, eine "Auswahlroutine" (MsgBox) einzubauen.
Private Sub chk_Dienstreise_Click()
Dim objItem As Variant
If Not chk_Dienstreise.Value Then
If MsgBox("Datenfelder wirklich löschen´?", _
vbYesNo, "Daten der Dienstreise löschen") = vbNo Then Exit Sub
Else
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = &H8000000F 'grau
.Enabled = False 'deaktiviert
End With
Next
End If
End Sub
LG
Peer
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 18:39:48
Peer
Ich habe noch vergessen zu erwähnen, dass ich damit beabsichtige, den Inhalt der TextBoxen und ComboBoxen zu leeren, wenn "chk_Dienstreise" abgewählt und alle Objekte wieder "scharf" zumachen, wenn gewählt wird. Mit der MsgBox möchte ich dem User die Möglichkeit geben, dass Löschen zu überdenken.
LG
Peer
AW: Array für mehrere TextBoxen
29.12.2019 18:40:22
Oberschlumpf
so funktioniert dein neuer Code mit MsgBox nicht.
Was passiert, wenn du auf YES klickst?
Es wird der nächste Befehl nach MsgBox ausgeführt. Aber nach MsgBox kommt nur Else.
Und der Code unter Else wird nur ausgeführt, wenn du bei CheckBox den Haken setzt...es würden alle txtboxes de-aktiviert werden.
Das verstehst du, wenn du deinen neuen Code Zeile für Zeile durchliest.
Unabhängig davon: wie findest du denn meine Idee mit der Code-Auslagerung in eine Sub?
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 18:57:51
Peer
Stimmt Thorsten
Ich habe noch das geändert.
Private Sub chk_Dienstreise_Click()
Dim objItem As Variant
If chk_Dienstreise.Value = False Then
If MsgBox("Datenfelder wirklich löschen´?", vbYesNo, _
"Daten der Dienstreise löschen") = vbNo Then Exit Sub
If vbYes Then
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = &H8000000F 'grau
.Enabled = False 'deaktiviert
End With
Next
End If
End If
End Sub
LG
Peer
AW: Array für mehrere TextBoxen
29.12.2019 19:00:17
Peer
Aber die Sub wird nicht "abgebrochen", wenn ich die CheckBox deaktiviere.
AW: Array für mehrere TextBoxen
29.12.2019 19:08:03
Oberschlumpf
Hi Peer,
lass den Befehl
If vbYes Then

weg!
Das Überprüfen der MsgBox (ob Ja oder Nein geklickt wurde) wird doch vom If MsgBox...Befehl selbst durchgeführt.
Lösch den obigen Befehl, und probier aus.
Deine andere Frage, Unterschied zwischen "externe" und "interne" Sub mag ich dir hier nicht erklären, weil daraus dann ein VBA-Lehrgang wird.
Außerdem wird dir "Tante Google" ganz viele Seiten zeigen, in denen das auch schon erklärt wird.
Ciao
Thorsten
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 19:12:42
Nepumuk
Hallo Peer,
einfach so:
Private Sub chk_Dienstreise_Click()
    
    Dim objItem As Variant
    
    If chk_Dienstreise.Value Then
        
        For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
            
            With objItem
                
                .BackColor = vbWhite
                .Enabled = True
                
            End With
        Next
        
    Else
        
        If MsgBox("Datenfelder wirklich löschen ?", _
            vbYesNo Or vbQuestion, "Daten der Dienstreise löschen") = vbYes Then
            
            For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
                
                With objItem
                    
                    .BackColor = &H8000000F
                    .Enabled = False
                    .Text = vbNullString
                    
                End With
            Next
        End If
    End If
End Sub

Code lesen und versuchen zu verstehen !!!
Gruß
Nepumuk
Anzeige
AW: Array für mehrere TextBoxen
29.12.2019 19:37:22
Peer
Hallo ihr beiden.
Dank euch, konnte ich das lange Basteln beenden.
Hier meine endgültige Fassung, wobei ich noch die Zeile am Ende der If-Schleife hinzugefügt habe.
Private Sub chk_Dienstreise_Click()
Dim objItem As Variant
If chk_Dienstreise.Value Then
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = vbWhite
.Enabled = True
End With
Next
Else
If MsgBox("Datenfelder wirklich löschen ?", _
vbYesNo Or vbQuestion, "Daten der Dienstreise löschen") = vbYes Then
For Each objItem In Array(txt_Zieladresse, txt_Abgabe)
With objItem
.BackColor = &H8000000F
.Enabled = False
.Text = vbNullString
End With
Next
Else: chk_Dienstreise.Value = True
End If
End If
End Sub
@Nepumuk.
Ich versuche zu verstehen, aber manchmal denke ich, ich bin zu blöd für VBA.
LG
Peer
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige