Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
816to820
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
816to820
816to820
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Makro Datumsabfrage+Sheet copy

Makro Datumsabfrage+Sheet copy
05.11.2006 10:04:08
Michael
Hallo!
Wie bereits in einem anderen Beitrag geschrieben bin ich LearningByDoing-User ohne VBA-Hintergrund und habe ein Makro geschrieben, dass das monatliche Ersetzen der Bezüge dieser 31 mal(für jeden Tag) vorkommenden Formel automatisiert:
=WENN(ISTFEHLER(SVERWEIS(B17;'C:\Dokumente und Einstellungen\compass\Desktop\COBA\Abrechnung\[FB-18 Barausgabenliste.xls]Nov.06'!$A$14:$H$35;7;FALSCH));SVERWEIS(1;'C:\Dokumente und Einstellungen\compass\Desktop\COBA\Abrechnung\[FB-15 Kontrollblatt Kreditkkarten.xls]Nov.06'!$A$16:$F$46;6);(SVERWEIS(1;'C:\Dokumente und Einstellungen\compass\Desktop\COBA\Abrechnung\[FB-15 Kontrollblatt Kreditkkarten.xls]Nov.06'!$A$16:$F$46;6))-(SVERWEIS(B17;'C:\Dokumente und Einstellungen\compass\Desktop\COBA\Abrechnung\[FB-18 Barausgabenliste.xls]Nov.06'!$A$14:$H$35;7;FALSCH)))
So sieht das Makro aus:

Private Sub CommandButton1_Click()
j2 = InputBox("Geben Sie die LETZTEN ZWEI STELLEN des AKTUELLEN Jahres ein:" & vbCr & vbCr & vbCr & vbCr & "***Beispiel: 07 ***")
Z1 = InputBox("Geben Sie den aktuellen Monat in Zahlen ein:" & vbCr & vbCr & vbCr & vbCr & "***Beispiel:  März = 3, Dezember = 12 ***")
j1 = 2000 + j2
jw = j2 + 1
If Z1 = "1" Then GoTo Januar
If Z1 = "2" Then GoTo Februar
If Z1 = "3" Then GoTo März
If Z1 = "4" Then GoTo April
If Z1 = "5" Then GoTo Mai
If Z1 = "6" Then GoTo Juni
If Z1 = "7" Then GoTo Juli
If Z1 = "8" Then GoTo August
If Z1 = "9" Then GoTo September
If Z1 = "10" Then GoTo Oktober
If Z1 = "11" Then GoTo November
If Z1 = "12" Then GoTo Dezember Else GoTo abbruch2
Januar:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Jan." & j2, Replacement:="Feb." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
Februar:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Feb." & j2, Replacement:="März." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
März:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="März." & j2, Replacement:="April." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
April:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="April." & j2, Replacement:="Mai." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
Mai:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Mai." & j2, Replacement:="Juni." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
Juni:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Juni." & j2, Replacement:="Juli." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
Juli:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Juli." & j2, Replacement:="Aug." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
August:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Aug." & j2, Replacement:="Sept." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
September:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Sept." & j2, Replacement:="Okt." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
Oktober:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Okt." & j2, Replacement:="Nov." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
November:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Nov." & j2, Replacement:="Dez." & j2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
Dezember:
With Range("b17")
.Value = DateSerial(j1, Z1 + 1, 1)
Cells.Replace What:="Dez." & j2, Replacement:="Jan.0" & jw, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End With
Exit Sub
abbruch2:
MsgBox "Das Ersetzen wird abgebrochen, bitte nur gültige Zahlen eintragen!", vbInformation + vbOKOnly, "Information"
End Sub

Noch offene Fragen:
Beim Jahreswechsel, wenn sich der Sheetname von Dez.06 in Jan.07 ändert, habe ich mit der Formel jw = j2 + 1 das Problem, dass JW dann nur noch einstellig ist. Deshalb ist die Formel dort:
Code:
Cells.Replace What:="Dez." & j2, Replacement:="Jan.0" & jw, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Kann ich mir mit irgendeinem Format-Befehl die 0 hinter "Jan." schenken? Dann wäre die Formel länger tauglich und nicht nur bis 2010.
Und ganz raffiniert wäre noch, wenn ich irgendwie eine Abfrage einbauen könnte, die bei Auslösen des Buttons das eingegebene Datum mit dem gerade aktuellen Datum abgleicht und bei einer Differenz von über zwei Monaten oder so mit einer Messagebox nachhakt. Geht sowas?
Dann eine Frage zum Kopieren und dahinter Einfügen inkl. Umbenennen des neuen Sheets vor dem Ersetzen aller Bezüge, was ja auch monatlich anfällt.
Die Sheets heissen, wie auch alle anderen, die damit verknüpft sind Jan.06, Feb.06 usw...
Ich habe jetzt mal versucht, das Ganze so zu lösen(was überhaupt nicht funktioniert):
Code:
sh = ((j2 - 7) * 12) + (z1 - 2)
...
Januar:
ActiveSheet.Copy After:=Sheets(sh)
ActiveSheet.Select
ActiveSheet.Name = "Feb." & j2
mit dem sh wollte ich die jeweils aktuelle Anzahl der Sheets repräsentieren, allerdings kommt die Formel garnicht bis dorthin, weshalb ich nicht weiss, ob das so funktioniert.
Gibt es für dieses Problem eine Lösung?
Ich muss noch dazusagen, dass ich meine verformelten Arbeitsblätter meinen Nachfolgern in ehemaligen Betrieben hinterlasse und das Ersetzen via Telefon teilweise sehr mühsam ist, da auch teilweise keine PC-Kenntnisse vorhanden sind. Auch deshalb würde ich das gern automatisieren.

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro Datumsabfrage+Sheet copy
05.11.2006 11:56:55
Stefan
Hallo Michael,
das mit dem Kopieren zeichne ich immer mit dem Makrorecorder auf und ändere die Aufzeichnung dann ggf. noch auf andere Zellen etc. ab. Macht aber nur Sinn wenn es immer die gleichen Zellen beim Kopieren sind und sonst nichts im Weg ist.
Zu deiner zweiten Frage mit dem Datum abgleichen
if UF.Datum sheets("tabelle1")cells (1,1)+60 then
msgbox" so in ordnung?"
end if
Natürlich kann das Datum aus Userform.Datum auch in einer zweiten Zelle stehen statt in der UF, würde dann wie der hintere Teil der Formel aussehen. Die (+60) sind die zwei Monate, die du angesprochen hast, fall du es ganz genau haben willst, wirst du auf einen Kalender zurückgreifen müssen (am besten in einem weiteren Blatt einfach bauen), damit du auch den Februar und Monate mit 31 Tagen berücksichtigen kannst. Müsste dann eben statt der 60 ein neuer Blatt-und Zellbezug drangehängt werden.
Gruß
Stefan
Anzeige
AW: Makro Datumsabfrage+Sheet copy
05.11.2006 13:16:56
Daniel
Hallo
Erst Mal zur Code-Vereinfachung:
du kannst deinen Code dramatisch verkürzen, wenn du in der Replace-Funktion Variablen einsetzt, dann benötigst du die Replace-Funktion nur 1x und nicht 12x
Die Zuweisung des Textes erfolgt über Worksheetfunction.Choose
Damit ersparst du dir das ganze IF-THEN-GOTO und die 12-Malige Wiederholung des fast gleichen Codes.
Das Jahreswechselproblem löst du damit, daß du eine zusätzliche Variable J3 einführst für das neue Jahr verwendest. J3 einspricht J2, nur beim Jahreswechsel ist J3 = J2+1
Ein weiters Problem (das mit der Führenden 0 beim Jahr) bekommst du dadurch, daß du die Variable J2 mal als String (bei der eingabe) und mal als Zahl verwendest (bei der Datumsberechung). Das Problem kannst du umgehen, wenn du j2 generell als Zahl verwendest und dann die Format-Funktion verwendest (siehe Beispiel). Dann kann der Anwender die Jahreszahl auch einstellig eingeben.
bsw.

Dim strAlterMonat as string
Dim strNeuerMonat as String
j3 = j2
if Z1 = 12 then j3 = j2+1
strAlterMonat = WorksheetFunction.Choose(z1, "Jan.", "Feb.", "März.",....) & Format(j2,"00")
strNeuerMonat = WorksheetFunction.Choose(z1+1, "Jan.", "Feb.", "März.",...) & Format(j3,"00")
Cells.Replace What:=StrAlterMonat, Replacement:=strNeuerMonat, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False

Die Eingabe des Monats und des Jahres kannst du dir auch sparen, das datum der letzten Änderung steht ja in Zelle B17 und das aktuelle Datum bekommst du über die Funktion DATE
das heißt, anstelle der Inputboxen schreibst du:
Z1 = Month(Range("B17").value
J1 = Year(range("B17").value
J2= right(J2,2)*1
die Abfrage nach einem Übersprungenen Monat bekommst du dann mit:
if Month(Date)>Z1+1 then
allerdings müsstets du hier noch differnziernen, ob ein Jahreswechsel vorliegt, da müsste dann die Formel etwas anders aussehen.
zu deinem Sheet-Problem:
die Aktuelle Anzahl von Sheets bekommst du mit "sh = activeworkbook.sheets.count"
Wenn du gar nicht bis dahin kommst, sollten wir natürlich wissen, wo und mit welcher Fehlermeldugn das Makro abbricht.
Gruß, Daniel
Anzeige
AW: Makro Datumsabfrage+Sheet copy
05.11.2006 17:24:56
Michael
Hallo, Daniel!
Vielen Dank für die schnelle und umfangreiche Antwort.
Zu der Formelvereinfachung:
Leider bin ich wie gesagt völlig Makro und VBA unerfahren und agiere dabei in etwa wie Jean-Baptiste Grenouille in 'Das Parfum' beim Mischen der Düfte. Darum würde mir die korrekte Zusammenstellung des Makros sehr weiterhelfen. Also so:
Dim strAlterMonat as string
Dim strNeuerMonat as String
Z1 = Month(Range("B17").value
J1 = Year(range("B17").value
J2= right(J2,2)*1
j3 = j2
if Z1 = 12 then j3 = j2+1
strAlterMonat = WorksheetFunction.Choose(z1, "Jan.", "Feb.", "März.",....) & Format(j2,"00")
strNeuerMonat = WorksheetFunction.Choose(z1+1, "Jan.", "Feb.", "März.",...) & Format(j3,"00")
Cells.Replace What:=StrAlterMonat, Replacement:=strNeuerMonat, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
if Month(Date)&gtZ1+1 then
msgbox" Stimmt der Monat?"
end if
Wobei ich die MSG-Box Optionen noch definieren müsste.
Anderes Problem:
Der Debugger stört sich bereits an dem ActiveSheet.Copy, also an der ersten Zeile.
Also bis auf dieses ActiveSheet Problem müsste das Ganze dann so ausschauen, oder?:
sh = activeworkbook.sheets.count
ActiveSheet.Copy After:=Sheets(sh)
ActiveSheet.Select
ActiveSheet.Name = strNeuerMonat
Trotzdem bereits jetzt 10000 Dank für die unglaublich schnelle und fundierte Hilfe. Ich habe dieses Forum empfohlen bekommen, aber dass die Lobeshymnen so sehr zutreffen, hätte ich nicht gedacht.
Michael
Anzeige
AW: Makro Datumsabfrage+Sheet copy
Daniel
Hallo
im Prinzip ja.
Selbstvertändlich musst du in den Worksheetfunction.Choose(...)-Funktionen noch die restlichen Monatsnamen eintragen (ich bin halt etwas schreibfaul)
Das Zuweisen des neuen Datums nach B17 fehlt auch noch, das kannst du allerdings ohne WITH-Klammer schreiben. Die WITH-Klammer lohnt sich nur, wenn das mit With bezeichnete Objekt mehrfach vorkommt. Du schreibst aber einfacher:
"Range("b17").Value = DateSerial(j1, Z1 + 1, 1)"
Außderdem solltets du noch alle Variablen deklarieren (dh. direkt nach "SUB" den Verwendeten Variablen den richtigen Typ zuweisen:
Dim strAlterMonat as string
Dim strNeuerMonat as String
Dim J1, J2, J3, Z1 as long
Zustätzlich solltets du noch im Editor in EXTRAS-OPTTONEN-EDITOR das Häkchen bei "Variablendeklaration" setzten.
Das Bewirkt, daß du alle Variablen, die du verwenden willst, zuvor mit DIM deklarien mußt, hat aber den Vorteil, das Fehler durch falsche Variablen-Namen ausgeschlossen werden.
Auch die andreren Häkchen in sollten gesetzt seien.
Gruß, Daniel
Anzeige
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 08:30:05
Michael
Also, ich habe es jetzt so versucht:
&ltpre&gt
Private Sub CommandButton1_Click()
Dim strAlterMonat As String
Dim strNeuerMonat As String
Dim J1, J2, J3, Z1 As Long
Z1 = Month(ActiveSheet.Range("B17")).Value
J1 = Year(ActiveSheet.Range("B17")).Value
J2 = Right(J2, 2) * 1
J3 = J2
If Z1 = 12 Then J3 = J2 + 1
strAlterMonat = WorksheetFunction.Choose(Z1, "Jan.", "Feb.", "März.", "April.", "Mai.", "Juni.", "Juli.", "Aug.", "Sept.", "Okt.", "Nov.", "Dez.") & Format(J2, "00")
strNeuerMonat = WorksheetFunction.Choose(Z1 + 1, "Jan.", "Feb.", "März.", "April.", "Mai.", "Juni.", "Juli.", "Aug.", "Sept.", "Okt.", "Nov.", "Dez.") & Format(J3, "00")
sh = ActiveWorkbook.Sheets.Count
ActiveSheet.Copy After:=Sheets(sh)
ActiveSheet.Select
ActiveSheet.Name = strNeuerMonat
Range("b17").Value = DateSerial(J1, Z1 + 1, 1)
Cells.Replace What:=strAlterMonat, Replacement:=strNeuerMonat, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End Sub&lt/pre&gt
Ab hier:
Z1 = Month(ActiveSheet.Range("B17")).Value
bringt er mir, mit und ohne "ActiveSheet." den Laufzeitfehler 424, 'Objekt erforderlich'. Woran kann das liegen? Und ist das restliche Makro richtig?
Anzeige
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 13:20:32
Michael
Weil ich es gerade bemerke, die Frage ist teilweise noch offen.....
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 18:36:24
Daniel
Hallo
kannst du bitte mal die Datei hochladen?
Im direkten durchlauf lässt sich der Fehler wahrscheinlich schneller finden als in verstümmelten code.
ein paar Zeilen Dummy-Daten sollten auch dabei sein damit das Makro was zu tun hat.
Gruß, Daniel
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 23:01:58
Michael
Mach ich morgen, wenn ich in der Arbeit bin, danke schon mal...
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 23:02:36
Michael
Mach ich morgen, wenn ich in der Arbeit bin, danke schon mal...
AW: Makro Datumsabfrage+Sheet copy
08.11.2006 01:02:55
Daniel
Hallo
noch ein Klammerfehler in den ersten beiden Zeilen und in ner Berechnung J1 mit J2 verwechselt. Ansonsten passts.
HIer die Korrektur

Private Sub CommandButton1_Click()
Dim strAlterMonat As String
Dim strNeuerMonat As String
Dim Z1 As Long
Dim J1 As Long, J2 As Long, J3 As Long
Z1 = Month(ActiveSheet.Range("B17").Value)
J1 = Year(ActiveSheet.Range("B17").Value)
J2 = Right(J1, 2) * 1
J3 = J2
If Z1 = 12 Then J3 = J2 + 1
strAlterMonat = WorksheetFunction.Choose(Z1, "Jan.", "Feb.", "März.", "April.", "Mai.", "Juni.", "Juli.", "Aug.", "Sept.", "Okt.", "Nov.", "Dez.") & Format(J2, "00")
strNeuerMonat = WorksheetFunction.Choose(Z1 + 1, "Jan.", "Feb.", "März.", "April.", "Mai.", "Juni.", "Juli.", "Aug.", "Sept.", "Okt.", "Nov.", "Dez.") & Format(J3, "00")
sh = ActiveWorkbook.Sheets.Count
ActiveSheet.Copy After:=Sheets(sh)
ActiveSheet.Select
ActiveSheet.Name = strNeuerMonat
Range("b17").Value = DateSerial(J1, Z1 + 1, 1)
Cells.Replace What:=strAlterMonat, Replacement:=strNeuerMonat, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
End Sub

Ansonsten sollte es gehen.
Gruß, Daniel
Anzeige
AW: Makro Datumsabfrage+Sheet copy
08.11.2006 08:32:29
Michael
Hallo, Daniel!
Danke, die Formel funktioniert bis auf eine Kleinigkeit. Er kopiert das Sheet, benennt es um, ändert dann aber die Formeln im alten Sheet. Egal, wie oft und wo ich es mit
Sheets(strNeuerMonat).Select
probiere, er ändert immer das alte File und springt erst dann ins Neue. Muss ich die Formel eventuell zweimal machen, einmal für den Sheetnamen und einen Extra-Button für das Formeländern?
AW: Makro Datumsabfrage+Sheet copy
08.11.2006 09:37:37
Daniel.Eisert
Hallo
eigentlich sollte sich bei dieser Reihenfolge das Replace auf das neue Sheet beziehen.
Um sicher zu gehen, kannst du den Sheetnamen in die Replace-Anweisung mit aufnehmen:
Sheets("strNeuerMonat").range("B17")=
Sheets("strNeuerMonat").cells.replace what:.......
Außerdem musst du darauf achten, daß du beim Start des Makros immer im aktuell höchsten Monat bist, sonst hast du Monate doppelt.
Gruß, Daniel
Anzeige
AW: Makro Datumsabfrage+Sheet copy
08.11.2006 09:48:16
Michael
Hurra, Danke, jetzt funktionierts!!!!
AW: Makro Datumsabfrage+Sheet copy
08.11.2006 10:06:23
Michael
Doch noch was gefunden, beim Jahreswechsel kommt in der Zeile:
strNeuerMonat = WorksheetFunction.Choose(Z1 + 1, "Jan.", "Feb.", "März.", "April.", "Mai.", "Juni.", "Juli.", "Aug.", "Sept.", "Okt.", "Nov.", "Dez.") & Format(J3, "00")
Der Laufzeitfehler 1004, weil die Choose-Eigenschaft der Worksheetfunktion nicht zugeordnet werden kann. Ich denke, es liegt irgendwie daran, dass er einen 13. Index sucht. Nur wie bekomm ich das weg?
AW: Makro Datumsabfrage+Sheet copy
08.11.2006 13:17:05
Michael
Ich hab jetzt einfach noch ein "Jan." in die Choose-Liste ans Ende angefügt, jetzt scheint es zu funktionieren.
Danke nochmal!
Anzeige
AW: Makro Datumsabfrage+Sheet copy
08.11.2006 17:49:22
Daniel
Hallo
ich hätte wahrscheinlich eine if-Abfrage eingebaut, die den Wert wieder auf 1 zurückstzt, aber deine Idee ist viel besser. Du musst halt prüfen, ob du mit Z1=13 nicht an einer anderen Stelle schwierigkeiten bekommst.
Gruß, Daniel
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 14:01:11
Kurt
Hi,
Irrtum, si Dim J1, J2, J3, Z1 as long ist nur Z1 Long, der Rest Variant.
mfg Kurt
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 18:42:52
Daniel
Nö,
J1 ists ne Zahl von 2006 bis 2099,
J2 und J3 sind Zahlen von 0 bis 99.
Buchstaben in diese Variablen sind nicht möglich, daher sollten Sie schon als INT oder LONG dimensioniert werden.
Wenn die Zahlen in Strings verwendet werden, sollten sie mit den entsprechenden Formatierungen bewusst in solche umgewandelt werden.
alles andere ist meiner Ansicht nach unsaubere Programmierung.
Gruß, Daniel
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 18:46:10
Kurt
Hi,
das ändert nichts daran, dass deine Deklaration:
Dim J1, J2, J3, Z1 as long
bewirkt, das alle außer Z1 Variant sind, vielleicht noch mal einen Blick in die Hilfe nehmen.
mfg Kurt
AW: Makro Datumsabfrage+Sheet copy
06.11.2006 18:54:29
Daniel
Tatsächlich, ich dachte bisher immer, daß das , was in einer Zeile Steht auch gleich deklariert wird.
Wenn dem nicht so ist, muß man dann eben jede Variable einzeln deklarieren.
Schade, das gibt dann in Zukunft eben wieder länger Deklarationsteile.
Danke für den Hinweis.
Gruß, Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige