Anzeige
Archiv - Navigation
1680to1684
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

Code kürzen bzw abändern

Code kürzen bzw abändern
26.03.2019 10:29:31
Pierre
Hallo zusammen,
ich habe keine Problem in dem Sinne, sondern hätte gerne Unterstützung dabei, meine Codes zu kürzen, sofern das überhaupt hierbei machbar ist.
Alternativ kann natürlich auch ein völlig anderes Code-Konstrukt vorgeschlagen werden.
Mir geht es einfach um die unheimliche Länge, da kriegt man schon fast Angst...
Code 3 stammt aus diesem Forum, 1 und 2 habe ich mir durch verschiedene Seiten selbst zusammen gebastelt (so sieht es vermutlich auch für die Profis aus ;) )
1. Teil (hier habe ich den gesamten Block für jedes weitere Jahr erneut)
Kurz erklärt: Ich wähle aus ComboBox "2019" aus, das schreibt er mir in Zelle B1, wenn in B1 " _ 2019" steht, löscht er die Einträge aus den u. g. Bereichen und schreibt zusätzlich noch "2019" in alle weiteren Blätter immer in Zelle E56. Das Gleiche natürlich bei allen anderen Jahren auch. Geleert werden sollen die Bereiche bei jeder Änderung der ComboBox.

Private Sub ComboBox1_Change()
Select Case Me.ComboBox1.Value
Case "2019"
Range("B1") = "2019"
If Range("B1").Value = "2019" Then Range("D4:NE6").Value = ""
If Range("B1").Value = "2019" Then Range("D8:NE10").Value = ""
If Range("B1").Value = "2019" Then Range("D12:NE14").Value = ""
If Range("B1").Value = "2019" Then Range("D16:NE18").Value = ""
If Range("B1").Value = "2019" Then Range("D20:NE22").Value = ""
If Range("B1").Value = "2019" Then Range("D24:NE26").Value = ""
If Range("B1").Value = "2019" Then Range("D28:NE30").Value = ""
If Range("B1").Value = "2019" Then Range("D32:NE34").Value = ""
If Range("B1").Value = "2019" Then Range("D36:NE38").Value = ""
If Range("B1").Value = "2019" Then Worksheets("Januar").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("Februar").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("März").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("April").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("Mai").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("Juni").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("Juli").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("August").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("September").Range("E56").Value="2019"
If Range("B1").Value = "2019" Then Worksheets("Oktober").Range("E56").Value = "2019"
If Range("B1").Value = "2019" Then Worksheets("November").Range("E56").Value= "2019"
If Range("B1").Value = "2019" Then Worksheets("Dezember").Range("E56").Value ="2019"
Case "2020"

2. Teil: Hier spring er mir immer zu der definierten Zelle, so weit so gut. Aber nächstes Jahr ist Schaltjahr, also verschiebt sich die ganze Tabelle, sodass er mir nicht mehr zum 1. eines Monats springt, sondern zum letzten des Vormonats.
Wäre nicht ganz so tragisch, wenn sich hier keine bessere Lösung finden lässt.
Schöner wäre es halt, wenn er das Datum sucht und zu dieser Zelle springt.
Die Zelle soll immer ganz links (ersten 3 Spalten fixiert) angezeigt werden.

Private Sub ComboBox2_Change()
Select Case Me.ComboBox2.Value
Case "Jan"
Range("B2") = "Jan"
ActiveWindow.ScrollColumn = 4

3. Teil: Hier eigentlich nur die Frage, ob man den Code auch in die weiteren Blätter einfügen kann?
Wenn ich den einfach nur kopiere, geht es leider nicht. Müsste also irgendwas angepasst werden, vermute ich, aber was?
Dieser Code verbindet die Zelle, in der ein bestimmtes Wort eingetragen wird mit der _
darunterliegenden Zelle.

z = Target.Row
s = Target.Column
mo = z Mod 4
If mo > 1 Then Exit Sub
If s  369 Then Exit Sub
If z  28 Then Exit Sub
'If mo = 0 Then mo = 5
mo = 2 - mo * 2 - 1
Application.EnableEvents = False
If Target.Text = "Urlaub2" Or Target.Text = "Krank" Or Target.Text = "Urlaub1"   Then
Cells(z + mo, s) = Target.Text
Application.DisplayAlerts = False
Range(Cells(z + mo, s), Cells(z, s)).MergeCells = True
Application.DisplayAlerts = True
Else
If Target.Text = "" Then
Cells(z + mo, s) = ""
Range(Cells(z + mo, s), Cells(z, s)).MergeCells = False
End If
End If
Application.EnableEvents = True
Exit Sub
'*** Fehlerbehandlung
Fehler:
Application.EnableEvents = True
If Err.Number  0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear

Ich hoffe, ihr könnt mir folgen und auch helfen, die elendig langen Codes zu kürzen.
Ich weiß nicht, ob dafür eine Beispielmappe von Vorteil wäre, wenn diese benötigt werden sollte, dann stelle ich gerne eine zur Verfügung.
Herzlichen Dank im Voraus!
Gruß Pierre

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

Betreff
Datum
Anwender
Anzeige
AW: Code kürzen bzw abändern
26.03.2019 11:10:23
Torsten
Hallo,
also fuer 1.
versuch mal:

Private Sub ComboBox1_Change()
Dim arr As Range
arr = Range("D4:NE6", "D8:NE10", "D12:NE14", "D16:NE18", "D20:NE22", "D24:NE26", "D28:NE30", " _
D32:NE34", "D36:NE38")
Select Case Me.ComboBox1.Value
Case "2019"
Range("B1") = "2019"
If Range("B1").Value = "2019" Then arr = ""
If Range("B1").Value = "2019" Then Sheets(Array("Januar", "Februar", "März", "April", "Mai", " _
Juni", "Juli", "August", "September", "Oktober", "November", "Dezember")).Range("E56").Value = "2019"
Case "2020"
Gruss Torsten
AW: Code kürzen bzw abändern
26.03.2019 11:11:57
Torsten
Fuer die anderen Sachen waere es einfacher die Datei zu sehen. Bitte hochladen.
Anzeige
AW: Code kürzen bzw abändern
26.03.2019 12:29:05
Pierre
Hallo Torsten,
bei "arr = Range" meckert er rum.
Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft.
Mappe kommt gleich.
Nicht wundern, der Code, der da drin steht, ist jetzt nicht deiner.
AW: Code kürzen bzw abändern
26.03.2019 11:10:33
Mustafa
Hallo Pierre,
zu Teil 1
du schreibst im Code in die Zelle B1 den Wert 2019 und fragst dann jedesmal ab ob dort 2019 steht.
Unnötig und if then kann dann weg.
und mit :
Union(Range("D4:NE6"), Range("D8:NE10"), Range("Deine weiteren Zellen")).ClearContents
kannst du alle deine Zellen in einem rutsch leeren.
Rückmeldung obs Hilft wäre nett.
Gruß aus der Domstadt Köln.
Anzeige
AW: Code kürzen bzw abändern
26.03.2019 12:34:21
Pierre
Hallo Mustafa,
das funktioniert einwandfrei.
Damit wäre ein großer Teil schon mal deutlich gekürzt.
Danke für deine Hilfe!
Nur um das gesagt zu haben: Ich habe von VBA keine wirkliche Ahnung und habe einfach den Code immer nach dem gleichen Prinzip erweitert. Ist halt ewig lange, aber ich war erstmal froh, dass er überhaupt lief.
AW: Code kürzen bzw abändern
26.03.2019 11:13:48
Werner
Hallo Pierre,
und hier noch mit Schleife:
Private Sub ComboBox1_Change()
Select Case CLng(Me.ComboBox1)
Case 2019
Range("B1") = 2019
For i = 4 To 36 Step 4
Range(Cells(i, 4), Cells(i + 2, 369)).ClearContents
Next i
For Each ws In ThisWorkbook.Worksheets
Select Case ws.Name
'hier alle Blätter aufführen, die nicht bearbeitet werden
Case "Ausnahmeblatt1", "Ausnahmeblatt2"
'nix machen
Case Else
ws.Range("E56") = 2019
End Select
Next ws
End Select
End Sub
Für den Rest bitte eine Beispielmappe.
Gruß Werner
Anzeige
AW: Code kürzen bzw abändern
26.03.2019 13:09:50
Pierre
Anbei die Datei.
Habe da nur einige Monatsblätter gelöscht, wegen der Größe.
Ich habe den 1. Code von Mustafa genommen, um die Zellen leeren zu lassen. Funktioniert auch top!
In meinem gefährlichen Halbwissen habe ich den Teil von Torsten mit eingefügt, der dafür sorgen sollte, dass der Eintrag in die Monatsblätter übertragen wird. Leider klappt das nicht, es kommt eine Fehlermeldung wegen "arr = Range". Deswegen ist der Teil auskommentiert.
https://www.herber.de/bbs/user/128662.xlsm
AW: Code kürzen bzw abändern
27.03.2019 01:46:58
Werner
Hallo,
hier mal der Code zu deinen Problemen 1 und 2
Private Sub ComboBox1_Change()
Dim ws As Worksheet
Application.ScreenUpdating = False
Application.EnableEvents = False
Range("B1") = Me.ComboBox1
Union(Range("D4:NE6"), Range("D8:NE10"), Range("D12:NE14"), Range("D16:NE18"), Range("D20:NE22") _
, _
Range("D24:NE26"), Range("D28:NE30"), Range("D32:NE34"), Range("D36:NE38")).ClearContents
For Each ws In ThisWorkbook.Worksheets
If ws.Name  "Jahr" Then
ws.Range("E56") = Me.ComboBox1
End If
Next ws
Application.EnableEvents = True
End Sub
Private Sub ComboBox2_Change()
Dim raFund As Range
Select Case Me.ComboBox2.Value
Case "Jan"
Range("B2") = "Jan"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 1, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Feb"
Range("B2") = "Feb"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 2, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Mär"
Range("B2") = "Mär"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 3, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Apr"
Range("B2") = "Apr"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 4, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Mai"
Range("B2") = "Mai"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 5, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Jun"
Range("B2") = "Jun"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 6, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Jul"
Range("B2") = "Jul"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 7, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Aug"
Range("B2") = "Aug"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 8, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Sep"
Range("B2") = "Sep"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 9, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Okt"
Range("B2") = "Okt"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 10, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Nov"
Range("B2") = "Nov"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 11, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case "Dez"
Range("B2") = "Dez"
Set raFund = Rows("2:2").Find(what:=DateSerial(Me.ComboBox1, 12, 1), _
LookIn:=xlValues, lookat:=xlWhole)
ActiveWindow.ScrollColumn = raFund.Column
Case Else
End Select
Set raFund = Nothing
Me.ComboBox2.Value = "Monat"
End Sub
Zu Problem 3 kann ich nichts sagen. Was willst du da eigentlich. Du hast da z.B. einen Bezug auf die Zelle B3 drin, Zeile 3 ist aber ausgeblendet und du kannst dort keine Eingaben machen, auf die das Makro reagieren könnte. Auch anderweitig habe ich nichts gefunden, dass in Zelle B3 irgendwelche Änderungen z.B. durch ein Makro vorgenommen werden.
If Target.Address(False, False) = "B3" Then
Gruß Werner
Anzeige
AW: Code kürzen bzw abändern
27.03.2019 06:42:36
Pierre
Hallo Werner,
erstmal vielen Dank für deine Mühe.
Komme erst jetzt wieder an die Mappe ran.
Also das leeren der Zellen bei Auswahl aus ComboBox1 funktioniert perfekt. Deutlich schneller, als das Gebilde vorher.
Problem 1 gelöst.
zu 2.: Hier gab er mir eben beim ersten Test einen Fehler (ich glaube es war 13, Typenunverträglichkeit?) aus, jetzt habe ich die Mappe geschlossen, neu geöffnet und nun steht da: "Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt."
Markiert wird die Zeile Set raFund ...
Jedenfalls funktioniert dieser Teil leider gar nicht.
zu 3.: Wie bereits geschrieben, vermutlich kann der ganze Teil bis zu "z = Target.Row" komplett gelöscht werden. Habe mich bisher nur nicht richtig getraut ;).
Der Code ist deswegen vorhanden, weil ich zunächst normale Dropdownlisten verwendet habe, die ich mittlerweile aber durch die ComboBoxen ersetzt habe.
Mir ging es eher darum, wie ich den Code "Worksheet_Change" anpassen kann, damit dieser auch in den Monatsblättern läuft. Da tut sich so nämlich nichts.
Anzeige
AW: Code kürzen bzw abändern
27.03.2019 08:14:13
Pierre
Sorry, vergessen:
Teil 3 des Codes: Oberer Teil (mittlerweile gelöscht) machte im Prinzip das, was ich nun über den 2. Teil erreichen möchte, nämlich dass er mirin die Spalte mit dem 1. des in ComboBox2 gewählten Monats springt.
Da es sich aber wie gesagt auf eine Dropdownliste bezog, die ich nicht mehr verwende, ist der Codeteil überflüssig.
Der untere Teil dient der Zellverbindung, wenn ich Urlaub oder Krank eintrage.
Das nur zur Erklärung, weil du ja nachfragtest.
Gruß Pierre
AW: Code kürzen bzw abändern
27.03.2019 13:07:09
Werner
Hallo Pierre,
also bei mir funktioniert es mit deiner Testmappe. Ich habe keine Ahnung, ob deine Originalmappe in ihrem Aufbau von der hochgeladenen Testmappe abweicht.
https://www.herber.de/bbs/user/128702.xlsm
Und zu deinem 3. Problem. Das Change-Event des Blattes löst nur bei "händischer" Eingabe aus und nicht wenn das Ergebnis als Formelberechnung zustande kommt.
Gruß Werner
Anzeige
AW: Code kürzen bzw abändern
27.03.2019 14:01:29
Pierre
Hallo Werner,
Also, was anders ist:
ActiveWindow.ScrollColumn = raFund.Column

hattest du gestern in deinem Code angegeben.
Jetzt hast du stattdessen aber folgende Zeile:
If Not raFund Is Nothing Then ActiveWindow.ScrollColumn = raFund.Column
Dennoch, wenn ich deinen gesamten Code aus der Mappe in mein Original einfüge, geht es nicht.
"Set raFund = Rows("2:2") ...", da ist eine Typenunverträglichkeit Laufzeitfehler 13.
Und ja, in deiner Mappe klappt es.
Ich habe aber den Aufbau genau so gelassen, wie er war, nur dass ich die Namen der Mitarbeiter überschrieben habe.
Gruß Pierre
Anzeige
AW: Code kürzen bzw abändern
27.03.2019 14:06:09
Werner
Hallo Pierre,
das habe ich dir schon geschrieben, da kann ich nichts dazu sagen. Offensichtlich weicht dein Original von deiner hochgeladenen Mappe ab. Ich vermute mal, dass in deiner Originaldatei in Zeile 2 keine Datumswerte vorhanden sind.
Gruß Werner
AW: Code kürzen bzw abändern
27.03.2019 14:53:40
Pierre
Hallo Werner,
doch, die waren da. Das Problem konnte ich beseitigen.
Es war noch viel schlimmer (weil einfacher und irgendwie fast schon peinlich): Die ComboBox hatte ich vorausgefüllt mit dem Wort "Jahr".
Das auf "2019" geändert und schon funktioniert es.
Hat jetzt echt gedauert, auf die einfachsten Dinge kommt man manchmal einfach nicht.
Vielen Dank für deine Hilfe, weltklasse!
Zu Problem 3 schreibe ich an anderer Stelle wieder.
Anzeige
Update dazu
27.03.2019 08:10:03
Pierre
Hallo zusammen, Werner,
Teil 1 ist gelöst.
Teil 2 noch offen. Leider funktionierte Werners Code nicht, wegen Fehler 13 bzw. anschließend dann 91.
Teil 3 konnte ich etwas kürzen. Habe einfach bisschen rum experimentiert.
Hier habe ich allerdings noch folgendes Problem:
Habe den Code testweise in ein Monatsblatt kopiert. Wenn ich den Eintrag, der zur Zellverbindung führen soll, händisch eintrage, funktioniert es, lasse ich es über die Zellverknüpfung (Tabelle2 ZelleA1 = Tabelle 1 ZelleA1) laufen, verbinden sich die Zellen nicht.
Kann man das irgendwie umgehen?
Wenn nein, dann muss ich wohl mit der aktuellen Lösung leben.
Kurzum: Hauptsächlich ist noch Teil 2 offen.
Danke für eure Unterstützung!
Gruß Pierre
Anzeige
Nur noch Problem 3 offen
27.03.2019 15:05:07
Pierre
So...
nachdem ihr mir schon die wichtigsten Dinge gemeistert habt, nur noch ein Punkt:
Teil 3:
Da habe ich kein Problem in dem Sinne, sondern würde den Code nur gerne in den anderen Blättern ebenfalls laufen lassen. Allerdings werden die Zellen über Formeln [=Jahr!A1] befüllt, weswegen der Code laut Werner nicht läuft.
Kann man den Code GANZ EINFACH dahingehend ändern, dass mir im Monatsblatt die Zelle mit Eintrag "Krank" mit der darunter liegenden Zelle verbunden wird? Wie gesagt ohne direkte Eingabe, sondern indirekt via Formel.
Wenn es nicht mal so eben geht (also nur 1-2 Wörter bzw. Befehle zu ändern), dann muss sich keiner mehr ein Bein ausreißen. Wäre eine kleine Arbeitserleichterung für mich.
Der zu ändernde Code steht oben.
Danke nochmal an alle, die bisher so super geholfen haben!
Gruß Pierre

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige