Wie kann ein Tabellenblatt 'archiviert werden (vba

Hallo
Ich habe ein Tabellenblatt, welche mit rj + Jahr (z.B. rj09) benannt ist. Nun möchte ich, wenn das Tabellenblatt ausgefüllt ist, das rjxx kopieren und als archiv_rjxx die Werte einfügen (anschliessend noch sperren und drucken). Das rj09 soll nun um 1 aufgezählt werden, also rj10 und die Eingabezellen gelöscht werden.

Leider weiss ich nicht, wie ich meine Frage editieren kann, deshalb antworte ich mir selber.
Ich habe natürlich auch schon viel versucht, zusammenkopiert und getestet.

Sub CommandButton1\_Click()
Prompt = "wirlich?"
DialogArt = vbYesNo + vbExclamation + vbDefaultButton1
Title = "alles finish"
Beep
Antwort = MsgBox(Prompt, DialogArt, Title)
If Antwort = vbYes Then
entsperren
kopieren
drucken
loeschen
sperren
' MeldungEnde
Else
End If
End Sub

Sub entsperren()
Dim wks As Worksheet
For Each wks In Worksheets
wks.Unprotect '"passwort"
Next wks
End Sub

Sub kopieren()
Dim tbname As String
Dim tbzelle As String
Dim loebereich As Range
tbname = ActiveSheet.Range("M01")
On Error Resume Next ' Fehler abfangen falls es bereits ein Tabellenblatt mit diesem Namen gibt
ActiveSheet.Unprotect
ActiveSheet.Copy before:=Sheets(Worksheets.Count)
ActiveSheet.Name = tbname
With ActiveSheet.UsedRange
.Cells.Value = .Cells.Value
ActiveWorkbook.Sheets(2).Name = "" & Range("M03").Value
End With
End Sub

Sub drucken()
ActiveSheet.PrintOut
' ActiveWorkbook.Sheets.Tab.ColorIndex = 10 'rote Farbe für archvierte Tabellenblätter, funktioniert leider nicht
End Sub

Sub loeschen()
Dim loezellen As Range
ActiveSheet.Unprotect
Set loezellen = Union(Range("A8:b17"), Range("A19:a20"), Range("b19:b21"), Range("D8:h21"), \_
Range("a24:a25"), Range("b24:b27"), Range("D24:h27"), \_
Range("a30:a34"), Range("b30:b35"), Range("D30:h35"), \_
Range("a38:a43"), Range("b38:b46"), Range("D38:h46"))
loezellen.ClearContents
End Sub

Sub sperren()
Dim wks As Worksheet
For Each wks In Worksheets
wks.Protect '"passwort"
Next wks
End Sub

Soweit funktioniert vieles. Blöderweise wird jedoch die Kopie bei einem zweiten übertrag nicht in „archiv_rjxx(2)“ sondern in „rjxx(2)“ umbenannt. Am Schluss ist zudem nicht wieder das „Original“ aktiv, sondern die Kopie. Und wenn ich gleich am jammern bin; die Hintergrundfarbe in Rot zu ändern (bei den Kopien) habe ich auch nicht geschaft.
Für Tipps, Korrekturen oder Hilfen bin ich dankbar.

mfg motoremio

Hallo motoremio.

Sub drucken()
ActiveSheet.PrintOut
’ ActiveWorkbook.Sheets.Tab.ColorIndex = 10 'rote Farbe für
archvierte Tabellenblätter, funktioniert leider nicht
End Sub

Hier fehlt doch wahrscheinlich nur die Angabe, um welches Tabellenblatt es sich handeln soll: Sheets(„Blablabla“)…

VG
Carsten

Hallo motoremio.

Am Schluss ist zudem nicht wieder das „Original“ aktiv, sondern die Kopie

Ich denke, an dieser Stelle sollte eine Anweisung in der Art wie „Sheets(„Original“).Activate“ ausreichen, um zum Original zurückzukehren.

Kleiner Tip an dieser Stelle noch: Du könntest vor Deinen Prozeduren die Anweisung „Application.ScreenUpdating = False“ verwenden, um den ganzen Ablauf optisch zu „beruhigen“. Hinterher dann wieder auf „True“ einstellen.

VG
Carsten

Hallo motoremio.

Blöderweise wird jedoch die Kopie bei einem zweiten übertrag nicht in „archiv_rjxx(2)“ sondern in „rjxx(2)“ umbenannt.

Sub kopieren()
Dim tbname As String
Dim tbzelle As String
Dim loebereich As Range
tbname = ActiveSheet.Range(„M01“)
On Error Resume Next ’ Fehler abfangen falls es bereits ein
Tabellenblatt mit diesem Namen gibt
ActiveSheet.Unprotect
ActiveSheet.Copy before:=Sheets(Worksheets.Count)
ActiveSheet.Name = tbname
With ActiveSheet.UsedRange
.Cells.Value = .Cells.Value
ActiveWorkbook.Sheets(2).Name = „“ & Range(„M03“).Value
End With
End Sub

An dieser Stelle kann ich nur Mutmaßungen anstellen. Was bedeutet „zweiter Übertrag“? Ich konnte an keiner Stelle im Code die Zeichenfolge „archiv_“ entdecken, was dann bedeuten würde, dass diese Zeichenfolge irgendwo in einer Tabellenblatt-Zelle steht. Verkette doch die Zeichenfolgen im Code.

Du verwendest die Anweisung „On Error Resume Next“. Das bedeutet ja, dass bei einem Fehler die nächste Anweisung ausgeführt wird. Meine Vermutung ist, dass das nicht so sein darf, da ja ein Tabellenblatt umbenannt wird. Ich denke, Du brauchst eine Fehlerbehandlung mit einer definierten Sprungmarke. Ungefähr so:

Sub kopieren()
 Dim tbname As String
 Dim tbzelle As String
 Dim loebereich As Range
 tbname = ActiveSheet.Range("M01")
**On Error GoTo ErrHandler**
 ActiveSheet.Unprotect
 ActiveSheet.Copy before:=Sheets(Worksheets.Count)
 ActiveSheet.Name = tbname
 With ActiveSheet.UsedRange
 .Cells.Value = .Cells.Value
 ActiveWorkbook.Sheets(2).Name = "" & Range("M03").Value
 End With

Ende:

 Exit Sub

**ErrHandler:**

 tbname = IrgendwasAnderes
 Resume Ende

End Sub

Jedenfalls solltest Du die Anweisung „On Error Resume Next“ einfach 'mal auskommentieren und dann den Code ausführen, um festzustellen, ob und wo ein Fehler auftritt.

VG
Carsten

Hallo Emio,

Leider weiss ich nicht, wie ich meine Frage editieren kann,

kannst du nicht, nur ein Mod.
Du kannst aber deinen Beitrag rauskopieren, dann den Beitrag löschen solange noch keiner darauf geantwortet hat, dann mit neuem Betreff neu einstellen als Frage.

deshalb antworte ich mir selber.

Geht auch :smile:

Zu deinem Code, benutze bitte Leerzeichen als Einrückungen für If- u.ä. Schleifen, hier dann den Pre-Tag, wird unterhalb des Eingabefensters erklärt.

Soweit funktioniert vieles. Blöderweise wird jedoch die Kopie
bei einem zweiten übertrag nicht in „archiv_rjxx(2)“ sondern
in „rjxx(2)“ umbenannt.

Ich dachte Blatt rjxx soll nach archiv_rjxx umkopiert werden!?
Warum jetzt diese (2)?
Wieso „zweiter“ Übertrag? Soll dann das Blatt archiv_rjxx überschrieben werden?

Am Schluss ist zudem nicht wieder das
„Original“ aktiv, sondern die Kopie.

Aktiviere das Original. Worksheets(„MeinOriginal“).Activate

Und wenn ich gleich am
jammern bin; die Hintergrundfarbe in Rot zu ändern (bei den
Kopien) habe ich auch nicht geschaft.

„Hintergrundfarbe“? Du meinst die Hintergrundfarbe der Tabellenblattnamen unten im Register?
Solls ab XL2002 oder 2003 geben.

Wenn dafür die Syntax ist
xyz.Tab.ColorIndex = 10
so mußt du in xyz das jeweilige Blatt referenzieren.
Wobei mir 10 für Rot suspekt vorkommt.

Gruß
Reinhard

Hallo zusammen
Ich danke Euch ganz herzlich für Eure Antworten. Versuche diese Mal zu verstehen.

Noch eine Erläuterung wegen dem doppelten Übertrag. Im Jahr 09 wird das Tabellenblatt rj09 archiviert. Die Kopie von rj09 wird in archiv_rj09 unbenannt; das Original in rj10 (=rj09 +1) unbenannt und die Inhalte gelöscht. Möglicherweise gibt es nochmals einträge fürs 2009, also muss nochmals ein Übertrag gemacht werden. Diesesmal müsste die Archiv-Datei doch „archiv_rj09(2)“ heissen. Oder?

Nun habe ich noch etwas angepasst. Die Tabellenblattbenennung wird nicht aus der Zelle ausgelesen, sondern durch folgenden Befehl erreicht:

ActiveSheet.Name = "rj" & Format(DateSerial(Year(Date) + 1, Month(Date) + 1, lngCounter), "YY")

@Reinhard: Was meintest Du mit
Zu deinem Code, benutze bitte Leerzeichen als Einrückungen für If- u.ä. Schleifen, hier dann den Pre-Tag, wird unterhalb des Eingabefensters erklärt.
Könnt ihr mir noch erklären, ob mein Makro in ein Objekt (=Tabellenblatt) oder in Module gespeichert werden sollte?

Danke
motoremio

tabellenblatt kopieren und umbenennen
Hallo Forumler
Nun dachte ich schon, mein Code ist gut. Aber die Sache mit der Umbenennung läuft noch nicht rosig.
Hier mal mein Code

Sub alles()
Dim wks As Worksheet
Dim tbname_aktuell As String
Dim tbname_archiv As String
Dim tbzelle As String
Dim loebereich As Range
Dim lngCounter As Long
Dim i As Integer
Dim loezellen As Range
Dim strStartBlatt As String
i = 1
tbname_aktuell = „rj“ & Format(DateSerial(Year(Date) + 1, Month(Date), lngCounter), „YY“)
tbname_archiv = „archiv_rj“ & Format(DateSerial(Year(Date), Month(Date), Day(Date)), „YY“) & „(“ & i & „)“
ActiveSheet.Name = tbname_aktuell
ActiveSheet.Unprotect
ActiveSheet.Copy before:=Sheets(Worksheets.Count)
With ActiveSheet.UsedRange
.Cells.Value = .Cells.Value
On Error GoTo ErrHandler
ActiveSheet.Name = tbname_archiv
End With
Ende:

ErrHandler:

’ MsgBox „Wenn der Name 'archiv_rjYY(1), soll ein die letzte Zahl _
’ hochgezählt werden; also 'archiv_rjYY(2), etc“
Resume Next
ActiveSheet.PrintOut
ActiveWorkbook.Sheets(tbname_archiv).Tab.ColorIndex = 3
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveSheet.EnableSelection = xlNoSelection
Sheets(tbname_aktuell).Activate
Set loezellen = Union(Range(„A8:b17“), Range(„A19:a20“), Range(„b19:b21“), Range(„D8:h21“), _
Range(„a24:a25“), Range(„b24:b27“), Range(„D24:h27“), _
Range(„a30:a34“), Range(„b30:b35“), Range(„D30:h35“), _
Range(„a38:a43“), Range(„b38:b46“), Range(„D38:h46“))
loezellen.ClearContents
ActiveSheet.Protect
Range(„a8“).Select
End Sub

Das zweite jedoch kleiner Problem ist halt immer noch die Sache bei mehreren Überträgen im selben Jahr. Nochmals die Erklärung…
Im Jahr 09 wird das Tabellenblatt rj09 archiviert. Die Kopie von rj09 wird in archiv_rj09 unbenannt; das Original in rj10 (=rj09 +1) unbenannt und die Inhalte gelöscht. Möglicherweise gibt es nochmals einträge fürs 2009, also muss nochmals ein Übertrag gemacht werden. Diesesmal müsste die Archiv-Datei doch „archiv_rj09(2)“ heissen.

Wäre super froh, wenn mir jemand helfen könnte.
mfg motoremio

Das zweite jedoch kleiner Problem ist halt immer noch die
Sache bei mehreren Überträgen im selben Jahr. Nochmals die
Erklärung…
Im Jahr 09 wird das Tabellenblatt rj09 archiviert. Die Kopie
von rj09 wird in archiv_rj09 unbenannt; das Original in rj10
(=rj09 +1) unbenannt und die Inhalte gelöscht. Möglicherweise
gibt es nochmals einträge fürs 2009, also muss nochmals ein
Übertrag gemacht werden. Diesesmal müsste die Archiv-Datei
doch „archiv_rj09(2)“ heissen.

Hallo Motoremio,

Sub Archiv()
Dim wks As Worksheet, Blatt As String, Nr As Integer, NichtNeu As Boolean
Dim Kopie As String
Blatt = ActiveSheet.Name
If Blatt "rj" & Format(Date, "YY") Then Exit Sub
For Each wks In ThisWorkbook.Worksheets
 If wks.Name = "rj" & CInt(Format(Date, "YY")) + 1 Then NichtNeu = True
 If wks.Name Like "archiv\_" & Blatt & "\*" Then
 Nr = Nr + 1
 End If
Next wks
Kopie = "archiv\_" & Blatt
If Nr \>= 1 Then Kopie = Kopie & "(" & Nr + 1 & ")"
Worksheets(Blatt).Copy after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Kopie
If NichtNeu = False Then
 Worksheets(Blatt).Copy after:=Worksheets(Worksheets.Count)
 ActiveSheet.Name = "rj" & CInt(Format(Date, "YY")) + 1
 Range("A8:b17, A19:a20, b19:b21, D8:h21, a24:a25, b24:b27,D24:h27").ClearContents
 Range("a30:a34, b30:b35, D30:h35, a38:a43, b38:b46, D38:h46").ClearContents
End If
Worksheets(Blatt).Activate
End Sub

Gruß
Reinhard

Besten Dank Reinhard

Nun sehe ich, wie es anderen ergeht, wenn ich Ihre CSS-Codes anpasse… (War erschrocken, wie meine VBA-Kenntnisse schlecht sind).
Auf jedenfall mal besten Dank.
Beim Abspielen des Makro gibt es wie gewünscht eine Kopie (archiv_rjxx) und es entsteht noch eine zweite Kopie (rj_xx + 1). Die ursprüngliche Datei (rjxx) bleibt leider auch. Vielleicht habe ich das zuwenig genau erklärt, aber eigentlich sollte immer nur ein wks zum erfassen sein (wenn bereis ein Übertrag gemacht wurde, dann [nach heutigem Datum 2009] rx10 [zum ausfüllen bereit] und archiv_rx09. Gab es noch keine Einträge ist eben nur rx09 vorhanden. Dann kommt noch die Sache mit dem doppelten Übertrag dazu, welche Du ja perfekt gelöst hast.

Ich hoffe, dass ich mich verständlich ausgedrückt habe.
Habe versucht den Code anzupassen, musste aber passen.

Kannst Du mir nochmals helfen?
Danke
Matthias

Hallo Matthias,

Beim Abspielen des Makro gibt es wie gewünscht eine Kopie
(archiv_rjxx) und es entsteht noch eine zweite Kopie (rj_xx +
1). Die ursprüngliche Datei (rjxx) bleibt leider auch.
Vielleicht habe ich das zuwenig genau erklärt, aber eigentlich
sollte immer nur ein wks zum erfassen sein (wenn bereis ein
Übertrag gemacht wurde, dann [nach heutigem Datum 2009] rx10
[zum ausfüllen bereit] und archiv_rx09. Gab es noch keine
Einträge ist eben nur rx09 vorhanden. Dann kommt noch die
Sache mit dem doppelten Übertrag dazu, welche Du ja perfekt
gelöst hast.

Hallo Matthias,

so wie ich es sehe sind da nur kleine Dinge im Code anzupassen, aber vielleicht schiele ich :smile:)

09 steht für das aktuelle Jahr.

Pro Jahr gibt es ein Blatt wie z.b. rj09.

Beim ersten Speichern soll das Blatt archiv_rj09 und das Blatt rj10 erzeugt werden. In rj10 sollen einige Zellinhalte gelöscht werden.
Das Blatt rj09 soll danach gelösht werden.
Korrekt?

Nun ergeben sich Änderungen in archiv_rj09, dann soll das als Blatt archiv_rj09(2) gespeichert werden.
archiv_rj09 soll erhalten bleiben?
rj10 bleibt davon unbehelligt?
Korrekt?

Wenn nun archiv_rj09(2), archiv_rj09(3),archiv_rj09(4) existieren, soll es dann dem Makro egal sein welche grad archiviert werden soll, es wird immer archiv_rj09(5) daraus?
(*hüstel* so ganz habe ich diese Frage von mir auch nicht verstanden, ich hoffe du kannst damit was anfangen und erahnen was ich meine *lächel*)

Das mit Blattschutz bzw. Protect habe ich bewußt erstmal weggelassen.
Wenn der Gesamtcode steht kann man das leicht ei9nbauen, aber in der Testphase ist das hinderlich wie ausgeblendete Blätter usw.

Gruß
Reinhard

Habe es doch noch geschaft…

Sub Archiv()
Dim wks As Worksheet, Blatt As String, Nr As Integer, NichtNeu As Boolean
Dim Kopie As String
Blatt = ActiveSheet.Name
ActiveSheet.Unprotect
If Blatt "rj" & Format(Date, "YYYY") Then
 If MsgBox("Falsches Rechnungsjahr!" & Chr(10) & "Tabellenblatt in rj" & CInt(Format(Date, "yyyy")) & " umbenennen?", vbYesNo + vbQuestion, "Tabellenblattbeschriftung!!") = vbYes Then
 ActiveSheet.Name = "rj" & CInt(Format(Date, "YYYY"))
 Blatt = ActiveSheet.Name
 Else:
 MsgBox "so hilf Dir selber!"
 Exit Sub
 End If
 End If
For Each wks In ThisWorkbook.Worksheets
 If wks.Name = "rj" & CInt(Format(Date, "YYYY")) + 1 Then NichtNeu = True
 If wks.Name Like "archiv\_" & Blatt & "\*" Then
 Nr = Nr + 1
 End If
Next wks
Kopie = "archiv\_" & Blatt
If Nr \>= 1 Then Kopie = Kopie & "(" & Nr + 1 & ")"
Worksheets(Blatt).Copy after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Kopie
Range("a1:j60").Value = Range("a1:j60").Value
ActiveWorkbook.Sheets(Kopie).Tab.ColorIndex = 3
ActiveSheet.PrintOut
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveSheet.EnableSelection = xlNoSelection
If NichtNeu = False Then
 Worksheets(Blatt).Activate
 ActiveSheet.Name = "rj" & CInt(Format(Date, "YYYY")) + 1
 Range("A8:b17, A19:a20, b19:b21, D8:h21, a24:a25, b24:b27, D24:h27").ClearContents
 Range("a30:a34, b30:b35, D30:h35, a38:a43, b38:b46, D38:h46, q10:v35").ClearContents
End If
 ActiveSheet.Protect
 Range("a8").Select
End Sub

Was meint ihr dazu?