Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1880to1884
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

VBA Code einkürzen?

VBA Code einkürzen?
27.04.2022 21:06:48
Ulf
Hallo Ihr lieben Helfer,
ich habe da ein kleines Anliegen. Ich habe eine Userform geschrieben mit 13 Checkboxen (0010, 0020, etc.) und einigen anderen Text- bzw. Comboboxen zum befüllen. Wenn eine bestimmte Checkbox ausgewählt wurde, soll der Inhalt der Text- bzw. Comboboxen in das jeweilige Blatt eingetragen werden (auch hier 0010, 0020, etc.). Bisher habe ich das so gemacht, dass ich für jede Checkbox eine If Abfrage geschrieben habe mit immer demselben Codeinhalt. Bei Änderungen im Code ist das sehr aufwändig zu pflegen ...
Kann ich das nicht irgendwie einkürzen, sodass man in einer Schleife die Checkbox Auswahl abfragt und dann in das entsprechende Blatt schreibt? Hierbei hört mein Wissen aber leider auf, da ich mir das noch nicht habe aneignen können. Daher hoffe ich nun auf Eure Hilfe. Leider kann ich komischerweise von der Arbeit aus keine Beiträge mehr im Forum posten, sodass ich von zu Hause aus schreiben muss. Hier habe ich aber auch keine Beispieldatei vorliegen und den Code habe ich nicht im Kopf. Ich hoffe aber, dass ich das einigermaßen verständlich geschrieben habe.
Gruß Ulf

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Code einkürzen?
27.04.2022 21:31:37
onur
Nimm statt der 13 Checkboxen eine Combobox mit 13 Einträgen.
Oder die ganze IF-Abfrage und den Rest in eine eigene Sub auslagern und in die Checkbox-Events einfach Call Meine_Sub eintragen.
Du kannst sogar die Nummer mir übergeben: Call Meine_Sub("0010")
AW: VBA Code einkürzen?
27.04.2022 22:29:57
Daniel
Mit einer Combobox kann man eine Gruppe Optionbuttons ersetzen.
Um Checkboxen zu ersetzen, bei denen man mehrere gleichzeitig anhaken kann, muss man dann eine ListBox mit MultiSelect-Option nehmen.
Gruß Daniel
AW: VBA Code einkürzen?
27.04.2022 22:35:44
onur
Hi Daniel,
Wieso erzählst du MIR das?
Gruß
Onur
AW: VBA Code einkürzen?
28.04.2022 02:12:42
Daniel
Weil Du geschrieben hast:
"Nimm statt der 13 Checkboxen eine Combobox mit 13 Einträgen."
Anzeige
AW: VBA Code einkürzen?
28.04.2022 03:14:06
onur
Er schrieb doch: "Wenn eine bestimmte Checkbox ausgewählt wurde" - da gehe ich von EINER Checkbox aus und hab mich schon gewundert, warum er nicht Optionbuttons genommen hat.
AW: VBA Code einkürzen?
28.04.2022 06:32:52
Daniel
Wenn du deine Verwunderung schon in deiner Antwort an den Fragesteller zum Ausdruck gebracht hättest, hätte ich meinen Beitrag an dich wahrscheinlich nicht geschrieben.
AW: VBA Code einkürzen?
27.04.2022 21:41:01
onur
Noch besser:

Call Meine_Sub(ActiveControl.Name)
Dann brauchst du für jede Checkbox immer den selben Code.
AW: VBA Code einkürzen?
28.04.2022 08:09:48
Ulf
Hallo Onur,
danke für die Anregungen. Ich werde das nachher probieren.
Gruß Ulf
Anzeige
Welches Code?
27.04.2022 22:35:29
Yal
Hallo Ulf,
wie können wir Vorschläge machen, wenn wir überhaupt nichts in der Hand haben: wo ist deine Datei*? Wo ist dein Code?
Die Werkstatt repariert dein Auto auch nicht übers Telefon...
*: befreit von allem, was nicht im Netz gehört, aber trotzdem aussagekräftig.
VG
Yal
AW: Welches Code?
28.04.2022 08:06:20
Ulf
Hallo Yal,
ich hatte doch geschrieben, dass ich von der Arbeit aus keine Einträge mehr ins Forum schreiben kann. Daher konnte ich von zu Hause aus auch kein Beispiel einfügen.
Anzeige
AW: Welches Code?
28.04.2022 08:08:33
Ulf
Hallo Yal,
ich kann von der Arbeit aus keine Einträge mehr machen im Forum und zu Hause hatte ich keine Beispieldatei.
Gruß Ulf
AW: Welches Code?
28.04.2022 10:28:16
Yal
Hallo Ulf,
ok, sorry. Der Hinweis war sehr gut versteckt.
Mir geht es darum, dass ich deinem Startstand habe. Es würde reichen, wenn Du von Zuhause etwas entwirft, was deine bisherige Konstellation entspricht. Sich die Datei ans private Adresse zumailen oder auf USB-Stick speichern, ist sicher nicht im Sinne deines Arbeitsgebers. Das Ergebnis aber schon.
Wenn ich selber etwas von null auf aufbaue, wird es sicher Lichtjahren von deiner Umgebung entfernt sein und Du wirst damit nichts anfangen können.
VG
Yal
Anzeige
AW: Welches Code?
28.04.2022 12:59:00
Ulf
Hallo Yal,
also ich habe es bisher so gemacht:

Private Sub Command_OK_Click()
Dim last As Integer
Dim l0010 As Integer
last = Sheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row + 1
l0010 = Sheets("0010").Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets("Daten").Cells(last, 1).Value = CDate(Eingabe.Text_Datum.Value)
Sheets("Daten").Cells(last, 2).Value = Eingabe.Text_Monat.Value
Sheets("Daten").Cells(last, 3).Value = Eingabe.Text_KW.Value
If Eingabe.Text_geschätzt.Value = "" Then
Sheets("Daten").Cells(last, 5).Value = CCur("0")
End If
If Eingabe.Text_geschätzt.Value > "" Then
Sheets("Daten").Cells(last, 5).Value = CCur(Eingabe.Text_geschätzt.Value)
End If
Sheets("Daten").Cells(last, 5).Value = Eingabe.Combo_Projekt.Value
Sheets("Daten").Cells(last, 7).Value = Eingabe.Text_JahrKW.Value
If Eingabe.Check_0010.Value = True Then
Sheets("Daten").Cells(last, 6).Value = Check_0010.Caption
Sheets("0010").Cells(l0010, 1).Value = CDate(Eingabe.Text_Datum.Value)
Sheets("0010").Cells(l0010, 2).Value = Eingabe.Text_Monat.Value
Sheets("0010").Cells(l0010, 3).Value = Eingabe.Text_KW.Value
Sheets("0010").Cells(l0010, 4).Value = Eingabe.Text_Fehler.Value
If Eingabe.Text_geschätzt.Value = "" Then
Sheets("0010").Cells(l0010, 5).Value = CCur("0")
End If
If Eingabe.Text_geschätzt.Value > "" Then
Sheets("0010").Cells(l0010, 5).Value = CCur(Eingabe.Text_geschätzt.Value)
End If
Sheets("0010").Cells(l0010, 6).Value = Eingabe.Combo_Grund.Value
If Eingabe.Text_Rechnung = "" Then
Sheets("0010").Cells(l0010, 7).Value = Eingabe.Text_Rechnung.Value
End If
If Eingabe.Text_Rechnung > "" Then
Sheets("0010").Cells(l0010, 7).Value = CCur(Eingabe.Text_Rechnung.Value)
End If
Sheets("0010").Cells(l0010, 8).Value = Eingabe.Text_xFlow.Value
Sheets("0010").Cells(l0010, 9).Value = Eingabe.Text_QMonat.Value
Sheets("0010").Cells(l0010, 10).Value = Eingabe.Combo_Status.Value
Sheets("0010").Cells(l0010, 14).Value = Eingabe.Combo_Projekt.Value
Sheets("0010").Cells(l0010, 15).Value = Eingabe.Combo_Verursacher.Value
Sheets("0010").Cells(l0010, 16).Value = Eingabe.Text_IQOS.Value
End If
Und so weiter für alle 13 Checkboxen ...
Gruß Ulf
Anzeige
AW: Welches Code?
28.04.2022 17:31:49
Yal
Hallo Ulf,
kürzer wird's kaum. Einige Sachen können anders behandlet werden.
Achte auf das Einrücken, es erleichtert die Lesbarkeit.
Auch der Auswahl der Variable l0010 ist sehr störend: Kleines L sieht aus wie einen 1 und dahinter Zahlen: macht die Lesbarkeit schwieriger.
Potentielle Kürzung
z.B.:

If Eingabe.Text_geschätzt.Value = "" Then
Sheets("Daten").Cells(last, 5).Value = CCur("0")
End If
If Eingabe.Text_geschätzt.Value > "" Then
Sheets("Daten").Cells(last, 5).Value = CCur(Eingabe.Text_geschätzt.Value)
End If
wird zu (wenn man davon ausgeht, dass hier nie negative Zahlen eingetragen werden):

Sheets("Daten").Cells(last, 5).Value = CCur("0" & Eingabe.Text_geschätzt.Value)
Wobei Du den Datentyp Currency gar nicht brauchst: es hat nur nicht damit zu tun, ob es einen Geldbetrag oder nicht, sondern nur um die Anzahl von Ziffern vor und nach der Kommastelle. Der Typ Currency erlaubt Werte in 15+4, also 15 Ziffern vor der Komma und 4 nach (zwischen -922 und +922 Billion). Ich vermute, solche Zahlen brauchst Du nicht. Ein Double (CDbl) erlaubt 15 Ziffern, verteilt vor und nach der Komma. Aber hier wenig relevant.
Die Weiderholung von Eingabe kann mit einem With vermieden werden. Alles was zwischen With objName und End With mit einem Punkt anfängt, ist mit objName davor zu verstehen.
Man könnte anstatt die Zeilenumer eine Objektvariable auf die gesamte Zeile und dann eine relative Adresse verwenden: Cells(1, 1) ist die Zelle in Spalte A der vorgemerkte Zeile.

Private Sub Command_OK_Click()
Dim Dat As Range
Dim Chk As Range
Set Dat = Sheets("Daten").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow
Set Chk = Sheets("0010").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow
With Eingabe
Dat.Cells(1, 1) = CDate(.Text_Datum.Value)
Dat.Cells(1, 2) = .Text_Monat.Value
Dat.Cells(1, 3) = .Text_KW.Value
Dat.Cells(1, 4) = CCur("0" & .Text_geschätzt.Value)
Dat.Cells(1, 5) = .Combo_Projekt.Value
'6
Dat.Cells(1, 7) = .Text_JahrKW.Value
If .Check_0010.Value = True Then
Dat.Cells(1, 6) = Check_0010.Caption
Chk.Cells(1, 1) = CDate(.Text_Datum.Value)
Chk.Cells(1, 2) = .Text_Monat.Value
Chk.Cells(1, 3) = .Text_KW.Value
Chk.Cells(1, 4) = .Text_Fehler.Value
Chk.Cells(1, 5) = CCur("0" & .Text_geschätzt.Value)
Chk.Cells(1, 6) = .Combo_Grund.Value
Chk.Cells(1, 7) = CCur("0" & .Text_Rechnung.Value)
Chk.Cells(1, 8) = .Text_xFlow.Value
Chk.Cells(1, 9) = .Text_QMonat.Value
Chk.Cells(1, 10) = .Combo_Status.Value
Chk.Cells(1, 14) = .Combo_Projekt.Value
Chk.Cells(1, 15) = .Combo_Verursacher.Value
Chk.Cells(1, 16) = .Text_IQOS.Value
End If
End With
End Sub
Es ist nicht kürzer. Aber leichter zu lesen. So kannst Du besser entdecken, dass im ersten Block die Spalte 5 doppelt vergeben war. Ich habe es in 4 geändert:

Dat.Cells(1, 4) = CCur("0" & Eingabe.Text_geschätzt.Value)
Ich habe an den .Value hinter den Dat.Cells(1, 1) gespart. Es könnte eventuell zu eine Störung führen. Da habe ich nicht weiter geforscht.
VG
Yal
Anzeige
AW: Welches Code?
29.04.2022 08:38:51
Ulf
Hallo Yal,
besten Dank für Deine Hilfe. Ich werde das nachher umsetzen.
Was VBA angeht bin ich noch sehr grün hinter den Ohren. Ich suche mir immer einigermaßen passende Sachen zusammen und versuche sie dann für meine Projekte umzuschreiben. Das klappt natürlich nicht immer, aber irgendwie muss man ja anfangen. Zum Glück gibt es dieses Forum und Leute wie Dich, die Frischlingen unter die Arme greifen.
Gruß Ulf

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige