Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Code anpassen

Forumthread: Code anpassen

Code anpassen
17.09.2024 17:36:25
Dieter
Hey all,
Ich habe separat einen Code für Geburtstage setzten und Feiertage setzen.
Feiertage sind variabel wegen Bundesländer. Das klappt soweit alles.
Jetzt würde ich gerne noch über einen Button die Geburtstage und Feiertage gleichzeitig anzeigen lassen.
Ferner sollte er mir auch gleichzeitig in der Tabelle Basisdaten in Spalte D Filtern für F = Feiertage, G = Geburtstage und leere
da zwischen den Feiertagen und Geburtstagen leere Zeilen liegen.
Sub Feier_Geburtstag_setzen()

Dim rng1 As Range, rng2 As Range
Dim yn As Integer
Application.EnableEvents = False
Set shKal = Worksheets("Kalender")
Set shBd = Worksheets("Basisdaten")
shKal.Cells(1, 12).Value = "Kalender" ' in L1
shKal.Cells(35, 12).Value = "Kalender" ' in L35
shKal.Range("A3:X67").Interior.Color = -4142 ' -4142 / xlColorIndexNone / xlNone keine Farbe
shKal.Range("C3:C33,G3:G33,K3:K33,O3:O33," & _
"S3:S33,W3:W33,C37:C67,G37:G67,K37:K67,O37:O67,S37:S67,W37:W67").ClearContents ' Inhalte der Zellen löschen
yn = MsgBox("Feier u. Gburtstage setzen ?", vbYesNo + vbQuestion, "Sicherheitsabfrage") ' Abfrage ja nein
Range("A1").Select
If yn = 7 Then Exit Sub ' bei 7 nein Abbruch
shKal.Cells(1, 12).Value = "Feier u. Geburtstags - Kalender"
shKal.Cells(35, 12).Value = "Feier u. Geburtstags - Kalender"
For Each rng1 In shBd.Range("B2:B20") 'Feiertage holen
For Each rng2 In shKal.Range("A3:A33,E3:E33,I3:I33,M3:M33," & _
"Q3:Q33,U3:U33,A37:A67,E37:E67,I37:I67,M37:M67,Q37:Q67,U37:U67")
If rng2 = rng1 Then
shKal.Range(rng2.Address & ":" & _
rng2.Offset(0, 3).Address).Interior.ColorIndex = 34 ' Türkis
shKal.Range(rng2.Offset(0, 2).Address) = shBd.Cells(rng1.Row, 1)
shKal.Range(rng2.Offset(0, 2).Address).Font.Size = 10
End If
Next
Next
For Each rng1 In shBd.Range("C21:C" & shBd.Cells(Rows.Count, 3).End(xlUp).Row) 'Geburtstage holen
For Each rng2 In shKal.Range("A3:A33,E3:E33,I3:I33,M3:M33," & _
"Q3:Q33,U3:U33,A37:A67,E37:E67,I37:I67,M37:M67,Q37:Q67,U37:U67")
If rng2 = rng1 Then
shKal.Range(rng2.Address & ":" & _
rng2.Offset(0, 3).Address).Interior.ColorIndex = 34 'Türkis
shKal.Range(rng2.Offset(0, 2).Address) = shBd.Cells(rng1.Row, 1)
shKal.Range(rng2.Offset(0, 2).Address).Font.Size = 10
End If
Next
Next
shKal.Range("A1").Select
Application.EnableEvents = True

End Sub


Der Code klappt so halbwegs, ich habe das Problem wenn zb. der Feiertag und Geburtstag auf dem selben Datum fällt
zeigt er mir nur den Geburtstag an aber keinen Feiertag.
Wo ist mein Fehler ?
Das mit der Filterung bekomme ich auch leider nicht hin. Muss ich dafür neues Thema aufmachen ?
Vielen Dank im Voraus der Mühe.

MfG
Dieter
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Code anpassen
17.09.2024 17:55:42
Onur
Das passiert wohl, weil du beide Einträge in die selbe Zelle setzt und da Feiertag zuerst kommt, wird der Eintrag durch Geburtstag einfach überschrieben.
AW: Code anpassen
17.09.2024 17:58:35
Eifeljoi 5
Hallo

Warum muss VBA unbedingt sein?
Arbeite doch mit Intelligenten Tabellen, Excel noch mehr als genug Zeilen und Spalten auf einem einzigen Datenblatt.
Warum machst du es nicht einfach über Datenschnitt bzw. den normalen Filter?
Und wenn es unbedingt sein muss was ich teilweise mache Tabellen mit Power Query zusammenfassen bearbeiten.
Anzeige
AW: Code anpassen
19.09.2024 11:28:01
Dieter
Hey Eifeljoi 5,
Erst mal danke der Antwort, aber was Du mir da vorschlägst
geht gar nicht, da ich davon überhaut keine Ahnung habe.
MfG
AW: Code anpassen
17.09.2024 18:02:18
daniel
hi
ich mach mir jetzt nicht die Mühe, dein Code zu analysieren, ich rate einfach mal:

du schreibst in beiden Fällen einfach nur den Wert in die Zelle, also zuerst:
Kalenderzelle.value = Feiertag

und im zweiten Lauf:
Kalenderzelle.value = Geburtstag

damit überschreibst du natürlich den Feiertag mit dem Geburtstag, sollte in der Zelle schon ein Feiertag drin stehen.

dh du müsstes daher beim zweiten Lauf mit den Geburtstagen prüfen, ob in der Kalenderzelle schon was steht und dann den Geburtstag anhängen:
If Kalenderzelle.value = "" Then

Kalenderzelle.value = Geburtstag
Else
Kalenderzelle.value = Kalenderzelle.value & ", " & Geburtstag
End iF



Anzeige
AW: Code anpassen
19.09.2024 11:31:23
Dieter
Hey daniel,
Danke Deiner Antwort,
Wo müsste ich Deinen Zusatz zwischen schreiben, das es klappt ?
MfG
Dieter
AW: Code anpassen
19.09.2024 11:36:07
daniel
dieser IF-Block muss beim zweiten Durchlauf dort eingesetzt werden, wo du die Werte (dh die Geburtstage) in die Zellen schreibst.

beachte, dass meine Darstellung nur schematisch ist und dir das Funktionsprinzip erläutern soll.
du musst den Code natürlich schon noch mit deinen Begriffen selber schreiben.
Gruß Daniel
Anzeige
AW: Code anpassen
20.09.2024 14:44:36
Dieter
Hallo daniel,
Erst mal danke Deiner Antwort, aber bekomme es nicht hin.
Aber nicht schlimm, da der Code von Yal prima läuft.
Trotzdem Danke für Deine Bemühung.
MfG
Dieter
AW: Code anpassen
20.09.2024 15:04:23
daniel
woran scheitert es denn?

kannst du zumindest die Zeile identifizieren, in welcher die Geburtstabe in die Tabelle geschrieben werden?
soweit solltest du deinen Code kennen.

Gruß Daniel
Anzeige
AW: Code anpassen
20.09.2024 16:46:25
Dieter
Hallo Daniel,
Schau mal hier, denke da hole ich mir die Daten und füge sie ein.
hier für Feiertage holen
shBd=Basisdaten, Feiertage und Geburtstage holen
shKal=Kalender, da wird geschrieben
For Each rng1 In shBd.Range("B2:B20")   'Feiertage holen

For Each rng2 In shKal.Range("A3:A33,E3:E33,I3:I33,M3:M33," & _
"Q3:Q33,U3:U33,A37:A67,E37:E67,I37:I67,M37:M67,Q37:Q67,U37:U67")
If rng2 = rng1 Then
shKal.Range(rng2.Address & ":" & _
rng2.Offset(0, 3).Address).Interior.ColorIndex = 34 ' Türkis
shKal.Range(rng2.Offset(0, 2).Address) = shBd.Cells(rng1.Row, 1)
shKal.Range(rng2.Offset(0, 2).Address).Font.Size = 10
End If
Next
Next

und hier für Geburtstage
For Each rng1 In shBd.Range("C21:C" & shBd.Cells(Rows.Count, 3).End(xlUp).Row)  'Geburtstage holen

For Each rng2 In shKal.Range("A3:A33,E3:E33,I3:I33,M3:M33," & _
"Q3:Q33,U3:U33,A37:A67,E37:E67,I37:I67,M37:M67,Q37:Q67,U37:U67")
If rng2 = rng1 Then
shKal.Range(rng2.Address & ":" & _
rng2.Offset(0, 3).Address).Interior.ColorIndex = 34 'Türkis
shKal.Range(rng2.Offset(0, 2).Address) = shBd.Cells(rng1.Row, 1)
shKal.Range(rng2.Offset(0, 2).Address).Font.Size = 10
End If
Next
Next

Ansonsten must Du mal schauen in dem gesamten Code den ich am Anfang gepostet habe.
Sorry das ich mit Deine Aussage nicht klar komme. Danke trotzdem für Deine Mühe, ohne Deinen Versuch zu schmälern.
Würde aber trotzdem Deine Änderung auch mal testen wenn Du möchtest.
Aber wie schon erwähnt läuft der Code von Yal so wie ich haben wollte.
MfG
Anzeige
AW: Code anpassen
20.09.2024 17:01:24
daniel
gut
und jetzt suchst du die Zeile, in welcher ein Inhalt in eine andere Zelle geschrieben wird.

das ist diese Zeile:
shKal.Range(rng2.Offset(0, 2).Address) = shBd.Cells(rng1.Row, 1)


und an dieser Stelle musst du jetzt abfragen, ob in der Zelle schon was drin steht oder ob die Zelle leer ist.
wenn die Zelle leer ist, kannst du den neuen Inhalt wie vorher einfach reinschreiben, wenn nicht, musst du den alten inhalt an den neuen Inhalt anfügen:
dh du musst die obige Programmzeile durch diesen IF_Block ersetzen

If shKal.Range(rng2.Offset(0, 2).Address) = "" Then

shKal.Range(rng2.Offset(0, 2).Address) = shBd.Cells(rng1.Row, 1)
else
shKal.Range(rng2.Offset(0, 2).Address) = shKal.Range(rng2.Offset(0, 2).Address) & " " & shBd.Cells(rng1.Row, 1)
end if


bzw, du programmierst hier sehr umständlich.
shKal.Range(rng2.Address) ist das selbe wie rng2, daher reicht:
If rng2.Offset(0, 2) = "" Then

rng2.Offset(0, 2) = shBd.Cells(rng1.Row, 1)
else
rng2.Offset(0, 2) = rng2.Offset(0, 2) & " " & shBd.Cells(rng1.Row, 1)
end if


Gruß Daniel
Anzeige
AW: Code anpassen
21.09.2024 12:41:11
Dieter
Hallo Daniel,
Habe vielen lieben Dank für Deine Arbeit und Mühe mir
es so ausführlich zu erklären und zu schreiben.
Nachdem ich es jetzt so eingefügt habe, läuft Dein Code auch wunderbar wie er soll.
Was mir allerdings aufgefallen ist, ob nun der Code von Dir oder Yal ist,
das wenn er farblich unterlegt werden auch die restlichen Zellen vom Monat
farblich gemacht. Er soll mir aber nur die Zellen farblich unterlegen wenn da
ein Feiertag, Geburtstag o. beides vorhanden ist.
Ich denke mal das es an dem folgende Code liegt: ?
Ich spreche ja hier die Zeilen bis 33 bzw. 67 an weil die Monate ja unterschiedlich Tage haben.
      For Each rng2 In shKal.Range("A3:A33,E3:E33,I3:I33,M3:M33," & _

"Q3:Q33,U3:U33,A37:A67,E37:E67,I37:I67,M37:M67,Q37:Q67,U37:U67")

If rng2 = rng1 Then
shKal.Range(rng2.Address & ":" & _
rng2.Offset(0, 3).Address).Interior.ColorIndex = 34 ' Türkis

Könntest Du bei Zeit und Lust mal darüber schauen was ich dort ändern müsste ?
Ansonsten trotzdem vielen dank nochmals
MfG
Dieter
Anzeige
AW: Code anpassen
21.09.2024 14:50:14
Dieter
Hey Daniel,
Ich habe die Codezeilen angepasst an meine Zeilen
und jetzt geht alles.
For Each rng2 In shKal.Range("A3:A33,E3:E31,I3:I33,M3:M32," & _

"Q3:Q33,U3:U32,A37:A67,E37:E67,I37:I66,M37:M67,Q37:Q66,U37:U67")

Vielen Dank nochmals Deiner Mühe.
MfG
Dieter
Anzeige
AW: Code anpassen
17.09.2024 18:24:16
Yal
Hallo Dieter,

um die Handlung einfacher zu machen, habe ich die Schleifen getauscht: zuerst über alle Kalenderzellen, darin einmal über Feiertage, einmal über Geburtstage. Die Ergebnis werden zuerst in einer Variable abgelegt, dann in der Zelle.

rng1 und rng2 habe ich in zKal und zBas umbenannt.
Die Zellenliste (eigentlich nur einen Text) habe ich als Konstante abgelegt. Änderungen müssen dann nur an einer Stelle gemacht werden.

Du kannst eine Zelle rng1 direkt adressieren, es muss nicht daraus die Adresse gelesen und ein Range aufgebaut werden.

Sub Feier_Geburtstag_setzen()

Dim shKal As Worksheet
Dim shBas As Worksheet
Dim zBas As Range
Dim zKal As Range
Dim Msg As String

Const cZellen = "A3:A33,E3:E33,I3:I33,M3:M33,Q3:Q33,U3:U33,A37:A67,E37:E67,I37:I67,M37:M67,Q37:Q67,U37:U67"
Const cTrenner = ", "

Application.EnableEvents = False

Set shKal = Worksheets("Kalender")
Set shBas = Worksheets("Basisdaten")
shKal.Cells(1, 12).Value = "Kalender" ' in L1
shKal.Cells(35, 12).Value = "Kalender" ' in L35
shKal.Range("A3:X67").Interior.Color = -4142 ' -4142 / xlColorIndexNone / xlNone keine Farbe
shKal.Range(cZellen).Offset(0, 2).ClearContents ' Inhalte der Zellen löschen
shKal.Range("A1").Select
If MsgBox("Feier u. Geburtstage setzen ?", vbYesNo + vbQuestion, "Sicherheitsabfrage") > vbYes Then Exit Sub ' bei alles anderes als Ja Abbruch

shKal.Cells(1, 12).Value = "Feier u. Geburtstags - Kalender"
shKal.Cells(35, 12).Value = "Feier u. Geburtstags - Kalender"

For Each zKal In shKal.Range(cZellen)
Msg = ""
'Feiertage holen
For Each zBas In shBas.Range("B2:B20")
If zKal.Value = zBas.Value Then Msg = cTrenner & shBas.Cells(zBas.Row, 1).Value
Next
'Geburtstage holen
For Each zBas In Range(shBas.Range("C21"), shBas.Cells(Rows.Count, 3).End(xlUp))
If zKal.Value = zBas.Value Then Msg = Msg & cTrenner & shBas.Cells(zBas.Row, 1).Value
Next
'Ergebnis setzen
If Msg > "" Then
zKal.Resize(1, 3).Interior.ColorIndex = 34 'Türkis
zKal.Offset(0, 2).Value = Mid(Msg, Len(cTrenner) + 1) 'ohne vorangestellten Trenner
zKal.Offset(0, 2).Font.Size = 10
End If
Next
shKal.Range("A1").Select

Application.EnableEvents = True
End Sub


Ich hoffe, Du erkennst deinen Code wieder :-)

VG
Yal
Anzeige
AW: Code anpassen
19.09.2024 11:36:07
Dieter
Hallo Yal,
Vielen lieben Dank für Deine Antwort und Deiner Mühe
den Code fast neu zu schreiben. So halbwegs erkenne ich meinen dazwischen wieder.
Ich werde ihn mal ausprobieren, und Dir dann so schnell wie möglich Antwort geben.
MfG.
Dieter
AW: Code anpassen
20.09.2024 14:48:38
Dieter
Hallo Yal.
Ich habe Deinen Code jetzt eingebaut, und er
läuft einwandfrei.
Habe nochmals vielen lieben Dank Deiner Arbeit und Mühe.
MfG.
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige