Excel VBA 2003 - Zeilen löschen/einfügen

Hallo,

ich habe eine Excel-Tabelle die monatlich mit Daten gefüllt wird.
Bisher wurde das von Hand erledigt, das will ich jetzt automatisieren.

In der Tabelle stehen in einem bestimmten Bereich mehrere Zeilen mit Daten. Die Anzahl schwankt monatlich. Deshalb muss ich erst Zeilen löschen und später Zeilen wieder einfügen, wenn sie benötigt werden.

An Code habe ich an der Stelle:

r = 12
While Trim(Cells(r, 1) "" 
 'Zeile löschen
 r = r + 1
Wend

'Daten aus Textdatei in Variable 'StrTxt' lesen
 If n 0 Then
 'Zeile einfügen
 End If
 n = n + 1
 For C = 0 to 2

 Cells(n + 12, po(c)) = StrTxt

Wie kann ich eine Zeile löschen / einfügen?

Gruß Rainer

Hallo, Rainer!

r = 12
While Trim(Cells(r, 1) ""
 'Zeile löschen
 rows(r).delete
 ' weil die Zeilen von unten hochrutschen,
 ' muss r nicht erhöht werden.
 ' r = r + 1
Wend

' einfügen:
' Zeile r und alle nachfolgenden nach unten schieben
' die Zeile r wird anschließend leer sein
ActiveSheet.Rows(r).Insert xlShiftDown

Gruß, Manfred

Hallo Manfred,

herzlichen Dank, das war die Hilfe die ich benötigt habe! Funktioniert alles Bestens, das Programm ist fast fertig.

Gruß Rainer

Wie kann ich eine Zeile löschen / einfügen?

Hallo Rainer,

grundsätzlich bei beidem immer von unten nach oben durchgehen, sonst muß man die Zeilennummern im Code korrigieren wenn man was löscht oder einfügt. Kommt man von unten entfällt diese Problematik.

Cells(Rows.Count, 1).End(xlUp).Row
entspricht dem, wenn man in A65536 steht und auf Strg+Pfeil aufwärts in Excel drückt, also die unterste belegte Zelle in der Spalte.
2 Dinge muß man ggfs. korrigieren.
Benutzt man die Funktion um die Zeilennummer unterhalb der untertesten Zelle auszuwählen und die unterste Zelle ist A65536 muß man den Fehler abfangen der entsteht wenn man Zelle A65537 markieren will.
Damit der Code auch in XL2007 mit 1 Million Zeilen klappt trägt man neuerdings nicht direkt 65536 ein wie lange Zeit früher sondern Rows.count.

Die zweite evtl. Problematik kommt dann wenn die Spalte ganz leer ist oder nur die oberste Zelle A1 gefüllt ist, in beiden Fällen erhält man als Ergebnis eine 1, diese muß man ggfs. für seine Zwecke anpassen, korrigieren

Die beiden IFs und Fors im unteren Code sind gleichwertig, sie sollen nur verschiedene Schreibweismöglichkeiten aufzeigen.

Mit If abfangen muß man ggfs auch den Fehler der entsteht wenn dein Trim() auf eine Excelfehlermeldung wie „#WERT!“ in einer Zelle trifft.

Bei Insert gibt es noch den Parameter Shift (Shift:=xlDown), den benutze ich nie.

Ich wei0ß nicht ob du in Excel das Autoausfüllen per maus kennst, trage in A1 eine 1 ein, dann markiere nochmals A1, halte die Strg-Taste gedrückt und klicke auf die rechte untere Ecke bis der Cursor zum Plus wid und ziehe dann die Ecke nach unten oder rechts, je nach Wunsch.

Dann hats da ja in A eine zahlenliste, jetzt lass das Makro Einfuegen laufen damit du siehst wo genau Zeilen eingefügt werden.

Die beiden Codes haben mit der Logik deiner Codeschnipsel nix gemeinsam :smile:

Option Explicit
'
Sub Einfuegen()
Dim r As Long
On Error GoTo Fehler
Application.ScreenUpdating = False
For r = Cells(Rows.Count, 1).End(xlUp).Row To 12 Step -1
 If r Mod 2 = 0 Then Rows(r).Insert
Next r
Fehler:
Application.ScreenUpdating = True
If Err.Number 0 Then MsgBox "Fehler in Zeile " & r
End Sub
'
Sub Loesch()
Dim r As Long
On Error GoTo Fehler
Application.ScreenUpdating = False
For r = Cells(Rows.Count, 1).End(xlUp).Row To 12 Step -1
'For r = Range("A" & Rows.Count).End(xlUp).Row To 12 Step -1
 If Trim(Cells(r, 1)) = "" Then Rows(r).Delete
 'If Trim(Cells(r, 1)) = "" Then Cells(r, 1).EntireRow.Delete
Next r
Fehler:
Application.ScreenUpdating = True
If Err.Number 0 Then MsgBox "Fehler in Zeile " & r
End Sub

Gruß
Reinhard

Hallo Reinhard,

grundsätzlich bei beidem immer von unten nach oben durchgehen,

*gg* das habe ich natürlich auch getan. :smile: Mir hat nur die Syntax zum Löschen und Einfügen gefehlt.

sonst muß man die Zeilennummern im Code korrigieren wenn man
was löscht oder einfügt. Kommt man von unten entfällt diese
Problematik.

Cells(Rows.Count, 1).End(xlUp).Row
entspricht dem, wenn man in A65536 steht und auf Strg+Pfeil
aufwärts in Excel drückt, also die unterste belegte Zelle in
der Spalte.
2 Dinge muß man ggfs. korrigieren.
Benutzt man die Funktion um die Zeilennummer unterhalb der
untertesten Zelle auszuwählen und die unterste Zelle ist
A65536 muß man den Fehler abfangen der entsteht wenn man Zelle
A65537 markieren will.
Damit der Code auch in XL2007 mit 1 Million Zeilen klappt
trägt man neuerdings nicht direkt 65536 ein wie lange Zeit
früher sondern Rows.count.

Die zweite evtl. Problematik kommt dann wenn die Spalte ganz
leer ist oder nur die oberste Zelle A1 gefüllt ist, in beiden
Fällen erhält man als Ergebnis eine 1, diese muß man ggfs. für
seine Zwecke anpassen, korrigieren

Die beiden IFs und Fors im unteren Code sind gleichwertig, sie
sollen nur verschiedene Schreibweismöglichkeiten aufzeigen.

Mit If abfangen muß man ggfs auch den Fehler der entsteht wenn
dein Trim() auf eine Excelfehlermeldung wie „#WERT!“ in einer
Zelle trifft.

Bei Insert gibt es noch den Parameter Shift (Shift:=xlDown),
den benutze ich nie.

Ich wei0ß nicht ob du in Excel das Autoausfüllen per maus
kennst, trage in A1 eine 1 ein, dann markiere nochmals A1,
halte die Strg-Taste gedrückt und klicke auf die rechte untere
Ecke bis der Cursor zum Plus wid und ziehe dann die Ecke nach
unten oder rechts, je nach Wunsch.

Klar, das kenne ich. :wink:

Dann hats da ja in A eine zahlenliste, jetzt lass das Makro
Einfuegen laufen damit du siehst wo genau Zeilen eingefügt
werden.

Die beiden Codes haben mit der Logik deiner Codeschnipsel nix
gemeinsam :smile:

Ich poste dann auch noch den fertigen Code.
Eigentlich war der schon fast fertig, dann habe ich mich verklickt … *grummel*

Ich fang also gerade noch einmal neu an, zum Glück wird das nicht so sehr viel Code. Ich denke, daß ich das Projekt heute oder morgen abschließe.

Gruß Rainer

Ergebnis
Hallo,

danke für die Hilfe, nun funktioniert alles wie es soll. So sieht das Ergebnis aus:

Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long


Private Sub Worksheet\_Activate()
 Dim PNR As String, Datei As String, Txt As String
 Dim MoString As String, Monat As String, Jahr As String
 Dim pos As Long, i As Integer, n As Integer
 Dim po(3)
 ActiveSheet.Range("B5") = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4)
 PNR = Right(ActiveSheet.Range("H7"), 7)
 Txt = Trim(Right(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 23))
 pos = InStr(Txt, " ")
 MoString = Trim(Left(Txt, pos))

 po(1) = 3
 po(2) = 7
 po(3) = 5

 Select Case MoString
 Case "Januar"
 Monat = "01"
 Case "Februar"
 Monat = "02"
 Case "März"
 Monat = "03"
 Case "April"
 Monat = "04"
 Case "Mai"
 Monat = "05"
 Case "Juni"
 Monat = "06"
 Case "Juli"
 Monat = "07"
 Case "August"
 Monat = "08"
 Case "September"
 Monat = "09"
 Case "Oktober"
 Monat = "10"
 Case "Novenber"
 Monat = "11"
 Case "Dezember"
 Monat = "12"
 Case Else
 MsgBox "Tippfehler bei Monat!", vbCritical
 Exit Sub
 End Select
 Txt = Trim(Right(Txt, Len(Txt) - pos))
 Jahr = Left(Txt, 4)

 Datei = ThisWorkbook.Path + "\" + PNR + "-" + Jahr + "-" + Monat + ".txt"

 Cells(11, 3) = 0
 Cells(11, 5) = 0
 Cells(11, 7) = 0
 n = 12
 While Cells(n, 1) = 494
 n = n + 1
 Wend
 For i = n - 1 To 12 Step -1
 Rows(i).Delete
 Next

 n = 0
 If PathFileExists(Datei) Then
 Open Datei For Input As #1
 While EOF(1) = False
 Line Input #1, Txt
 If Txt = "2" Then
 If n \> 0 Then
 ActiveSheet.Range("A11", "M11").Copy
 ActiveSheet.Rows(n + 11).Insert xlShiftDown
 ActiveSheet.Range("A" + CStr(n + 11)).Select
 ActiveSheet.Paste
 End If
 Cells(11 + n, po(1)) = Txt
 Line Input #1, Txt
 Cells(11 + n, po(2)) = Txt
 Line Input #1, Txt
 Cells(11 + n, po(3)) = Txt
 n = n + 1
 Else
 Line Input #1, Txt
 Line Input #1, Txt
 End If
 Wend
 Close #1


 Txt = "=SUM(H11:H" + CStr(n + 10) + ")"
 ActiveSheet.Range("H" + CStr(n + 12)).Formula = Txt
 Txt = Replace(Txt, "H", "F")
 ActiveSheet.Range("F" + CStr(n + 12)).Formula = Txt
 Txt = Replace(Txt, "F", "M")
 ActiveSheet.Range("M" + CStr(n + 12)).Formula = Txt


 ActiveSheet.Range("O1").Select
 ActiveSheet.Range("O1").Copy
 End If
End Sub

Gruß Rainer

danke für die Hilfe, nun funktioniert alles wie es soll.

Hallo Rainer,
wenn das funktioniert hast du Massel :smile:
Ich kenne Vb nicht und schon gar nicht so gut, aber in Vba kenne ich halt ein zwei Dinge mehr.

Du hast wie ich annehme und wie es auch richtig ist den Code von
Private Sub Worksheet_Activate()
in das Modul des Tabellenblatts gepackt.

Jetzt erwartest du daß beim Aktivieren dieses Tabellenblattes auch dieser Code ausgeführt wird ?

Das geschieht auch, aber leider nicht immer.

Um mir zu glauben, schreib mal in einer leeren Testdatei in „DieseArbeitsmappe“

Private Sub Workbook_Open()
Worksheets(„Tabelle1“).Activate
End Sub

und in das Modul von Tabelle1:

Private Sub Worksheet_Activate()
MsgBox „ich wurde aktiviert“
End Sub

und schließe die Datei und öffne sie, die MsgBox kommt nicht!

Abhilfe ist zum Beispiel so:

Private Sub Workbook_Open()
Worksheets(„Tabelle2“).Activate
Worksheets(„Tabelle1“).Activate
End Sub

dann klappts. frach mich nicht warum.

Soweit mein Kommentar zur ersten Zeile deines Codes, jetzt schau ich mir mal den restlichen Code an, der garantiert VB-mäßig korrekt ist, aber Excel tickt da dann doch anders :smile:

Gruß
Reinhard

Hallo Reinhard,

wenn das funktioniert hast du Massel :smile:
Ich kenne Vb nicht und schon gar nicht so gut, aber in Vba
kenne ich halt ein zwei Dinge mehr.

Du hast wie ich annehme und wie es auch richtig ist den Code
von
Private Sub Worksheet_Activate()
in das Modul des Tabellenblatts gepackt.

Jetzt erwartest du daß beim Aktivieren dieses Tabellenblattes
auch dieser Code ausgeführt wird ?

Genau so.

Das geschieht auch, aber leider nicht immer.

Um mir zu glauben, schreib mal in einer leeren Testdatei in
„DieseArbeitsmappe“

Private Sub Workbook_Open()
Worksheets(„Tabelle1“).Activate
End Sub

und in das Modul von Tabelle1:

Private Sub Worksheet_Activate()
MsgBox „ich wurde aktiviert“
End Sub

und schließe die Datei und öffne sie, die MsgBox kommt nicht!

Mist! Dann komme ich um Button im Worksheet nicht herum. Die werden bem Drucken sicher stören. :frowning: Kann nicht auch mal etwas einfach sein?

Abhilfe ist zum Beispiel so:

Private Sub Workbook_Open()
Worksheets(„Tabelle2“).Activate
Worksheets(„Tabelle1“).Activate
End Sub

dann klappts. frach mich nicht warum.

Soweit mein Kommentar zur ersten Zeile deines Codes, jetzt
schau ich mir mal den restlichen Code an, der garantiert
VB-mäßig korrekt ist, aber Excel tickt da dann doch anders :smile:

Workbook Open ist der falsche Zeitpunkt, da hat es noch den falschen Namen.

Das Dokument wird geöffnet umbenannt und danach müssen die Daten an Hand des neuen Namens des Dokuments jeweils beim öffnen der einzelnen Blätter geladen werden.

Der Sinn ist klar, oder? Es existiert ein Dokument vom Mai, ich maile Daten vom Juni. Nun wird das Dokument ‚Mai‘ geladen und per ‚Speichern unter‘ der Juni erzeugt, ohne den Mai zu verlieren.

Nach ‚save as‘ wird das Dokument nicht geschlossen, Workbook open ist also nicht mein Ereignis. Wann wird ‚Befor Save‘ ausgelöst? Doch sicher bevor der neue Name eingegeben wurde, oder?
… (Gerade getestet, wie vermutet bevor der neue Name eingetippt ist. :smile:) … *ärger*

Gruß Rainer

Hallo Reinhard,

wenn das funktioniert hast du Massel :smile:

*grummel* … Ich bau um.
Dabei entsteht gerade ein neues Problem, es gibt Unterschiede in den einzelnen Sheets. (Sonst wär’s ja auch zu einfach)

PNR = Right(ActiveSheet.Range(„H7“), 7)

Passt nicht, die Personalnummer steht nicht immer an der selben Stelle.
Ich müsste also mit ‚Like "Pers.Nr*‘ (oder ‚%‘ statt ‚*‘?) die Zelle im Worksheet ‚suchen‘. Wie ging Suchen doch gleich? :smile:

… schön, daß ich ändern darf. :smile:

Ich gehe jetzt die 12 Spalten (Zeile ist immer gleich) in einer Schleife durch und suche mit Left() … :smile: Geht.

Gruß Rainer

Hallo Rainer,

PNR = Right(ActiveSheet.Range(„H7“), 7)
Passt nicht, die Personalnummer steht nicht immer an der
selben Stelle.

aber sie steht immer in H ? Oder kann sie auch pro Zeile in verschiedenen Spalten stehen?

Wie erkenne ich denn die Personalnummer in einem Zelltext?

Ich gehe jetzt die 12 Spalten (Zeile ist immer gleich) in
einer Schleife durch und suche mit Left() … :smile: Geht.

Also steht die Personalnummer doch immer links?

Ich hab das nicht so ganz kapiert -(

Gruß
Reinhard

Hallo Reinhard,

aber sie steht immer in H ? Oder kann sie auch pro Zeile in
verschiedenen Spalten stehen?

sie steht immer in der selben Zeile aber in verschiedenen Spalten, je nach Platzangebot. :smile: Als das Dokument gebaut wurde, hat Niemand an automatisieren gedacht.

Wie erkenne ich denn die Personalnummer in einem Zelltext?

Es steht ‚Pers.Nr.‘ davor.

Ich gehe jetzt die 12 Spalten (Zeile ist immer gleich) in
einer Schleife durch und suche mit Left() … :smile: Geht.

Also steht die Personalnummer doch immer links?

Ich hab das nicht so ganz kapiert -(

Egal, ist schon ausgeliefert. :smile:
Wenn ich Glück habe, sehe ich das Dokument nie wieder, ich schicke nur monatlich eine Mail, die Daten als Futter dafür enthält.

Nun muss das Dokument eben doch erst unter neuem Namen gespeichert werden, geschlossen und neu geöffnet. Das ist immer noch einfacher, als rund 1500 Zeilen abtippen. :smile:

Gruß Rainer

Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

Private Sub Workbook\_Open()
 Dim PNR As String, Datei As String, Txt As String
 Dim MoString As String, Monat As String, Jahr As String
 Dim pos As Long, i As Integer, n As Integer, c As Integer
 Dim po(3), sh As Long

 Txt = Trim(Right(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 23))
 pos = InStr(Txt, " ")
 MoString = Trim(Left(Txt, pos))

 Select Case MoString
 Case "Januar"
 Monat = "01"
 Case "Februar"
 Monat = "02"
 Case "März"
 Monat = "03"
 Case "April"
 Monat = "04"
 Case "Mai"
 Monat = "05"
 Case "Juni"
 Monat = "06"
 Case "Juli"
 Monat = "07"
 Case "August"
 Monat = "08"
 Case "September"
 Monat = "09"
 Case "Oktober"
 Monat = "10"
 Case "Novenber"
 Monat = "11"
 Case "Dezember"
 Monat = "12"
 Case Else
 MsgBox "Tippfehler bei Monat!", vbCritical
 Exit Sub
 End Select
 Txt = Trim(Right(Txt, Len(Txt) - pos))
 Jahr = Left(Txt, 4)

 If Not IsNumeric(Jahr) Then
 MsgBox "Das Jahr wurde nicht an der erwarteten Stelle im Dateinamen gefunden! " + Chr(13) + "Es wird der Name: 'Prämienlohneinzelabrechnung Monat Jahr für Monat Jahr' erwartet!", vbCritical
 End If

 Datei = ThisWorkbook.Path + "\" + "SBS-Akkord-" + Jahr + "-" + Monat + ".txt"

 For sh = 1 To ThisWorkbook.Sheets.Count
 ThisWorkbook.Sheets(sh).Activate
 ThisWorkbook.Sheets(sh).Range("B5") = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4)

 For c = 1 To 14
 If Left(Cells(7, c), 7) = "Pers.Nr" Then
 PNR = Right(Cells(7, c), 7)
 End If
 Next

 po(1) = 3
 po(2) = 7
 po(3) = 5

 Cells(11, 3) = 0
 Cells(11, 5) = 0
 Cells(11, 7) = 0
 n = 12
 While Cells(n, 1) = 494
 n = n + 1
 Wend
 For i = n - 1 To 12 Step -1
 Rows(i).Delete
 Next

 n = 0
 If PathFileExists(Datei) Then
 Open Datei For Input As #1
 While EOF(1) = False
 Line Input #1, Txt
 If Txt = PNR Then
 Line Input #1, Txt
 If Txt = "2" Then
 If n \> 0 Then
 ThisWorkbook.Sheets(sh).Range("A11", "M11").Copy
 ThisWorkbook.Sheets(sh).Rows(n + 11).Insert xlShiftDown
 ThisWorkbook.Sheets(sh).Range("A" + CStr(n + 11)).Select
 ThisWorkbook.Sheets(sh).Paste
 End If
 Cells(11 + n, po(1)) = Txt
 Line Input #1, Txt
 Cells(11 + n, po(2)) = Txt
 Line Input #1, Txt
 Cells(11 + n, po(3)) = Txt
 n = n + 1
 Else
 Line Input #1, Txt
 Line Input #1, Txt
 End If
 Else
 For i = 1 To 3
 Line Input #1, Txt
 Next
 End If
 Wend
 Close #1

 If n \> 0 Then
 Txt = "=SUM(H11:H" + CStr(n + 10) + ")"
 ThisWorkbook.Sheets(sh).Range("H" + CStr(n + 12)).Formula = Txt
 Txt = Replace(Txt, "H", "F")
 ThisWorkbook.Sheets(sh).Range("F" + CStr(n + 12)).Formula = Txt
 Txt = Replace(Txt, "F", "M")
 ThisWorkbook.Sheets(sh).Range("M" + CStr(n + 12)).Formula = Txt
 End If


 ThisWorkbook.Sheets(sh).Range("O1").Select
 ThisWorkbook.Sheets(sh).Range("O1").Copy
 End If

 Next
End Sub

Hallo Rainer,

Mist! Dann komme ich um Button im Worksheet nicht herum. Die
werden bem Drucken sicher stören. :frowning: Kann nicht auch mal
etwas einfach sein?

Rechtsklick auf den Button, dann kannst du festlegen ob er mitgedruckt wird.

Alternativ und viel besser sind Buttons oben in der menuleiste
Buttons im Blatt verschwinden beim Scrollen. Dem kann man mit vba gegensteueren (Auswertung von Activewindow.Visiblerange und jeweils Neupositionierung des CB), aber Buttons oben sind besser.

Sag Bescheid wenn du da Code brauchst um Buttons in der Menuleiste und/oder auch einen neuen ausklappbaren Menupunkt anzulegen brauchst.

Workbook Open ist der falsche Zeitpunkt, da hat es noch den
falschen Namen.

Das Dokument wird geöffnet umbenannt und danach müssen
die Daten an Hand des neuen Namens des Dokuments jeweils beim
öffnen der einzelnen Blätter geladen werden.

Schon mal daran gedacht eine Vorlage zu öffnen? Einfcah eine neue Mappe anlegen und bei Speichern unter als Vorlage abzuspeichern.

Der Sinn ist klar, oder? Es existiert ein Dokument vom Mai,
ich maile Daten vom Juni. Nun wird das Dokument ‚Mai‘ geladen
und per ‚Speichern unter‘ der Juni erzeugt, ohne den Mai zu
verlieren.

Klingt doch machbar.

Nach ‚save as‘ wird das Dokument nicht geschlossen, Workbook
open ist also nicht mein Ereignis. Wann wird ‚Befor Save‘
ausgelöst? Doch sicher bevor der neue Name eingegeben wurde,
oder?
… (Gerade getestet, wie vermutet bevor der neue Name
eingetippt ist. :smile:) … *ärger*

Es gibt auch SaveCopyAs, hilft das weiter?

Gruß
Reinhard

Hallo Rainer,

aber sie steht immer in H ? Oder kann sie auch pro Zeile in
verschiedenen Spalten stehen?

sie steht immer in der selben Zeile aber in verschiedenen
Spalten, je nach Platzangebot. :smile: Als das Dokument gebaut
wurde, hat Niemand an automatisieren gedacht.

Find ist recht schnell:

Option Explicit
'
Sub tt()
Dim c As Range, Zei As Long
For Zei = 1 To Cells(Rows.Count, 1).End(xlUp).Row
With Rows(Zei)
 Set c = .Find("Pers", LookIn:=xlPart)
 If Not c Is Nothing Then
 MsgBox c.Address
 MsgBox InStr(c, "Pers")
 End If
End With
Next Zei
End Sub

Und CStr braucht man nicht, ja ich weiß, sicher ist sicher, grad bei Excel :smile:

Txt = „=SUM(H11:H“ & n + 10 & „)“
ActiveSheet.Range(„H“ & n + 12).Formula = Txt

Gruß
Reinhard

Hallo Reinhard,

Alternativ und viel besser sind Buttons oben in der menuleiste

das wäre auch eine schöne Variante gewesen.

Sag Bescheid wenn du da Code brauchst um Buttons in der
Menuleiste und/oder auch einen neuen ausklappbaren Menupunkt
anzulegen brauchst.

Für das Projekt jetzt nicht mehr, das Dokument ist schon beim Empfänger. Das ist nich bei uns in der Firma, sondern in der Konzernzentrale. Jetzt frag aber nicht, wieso die mich dafür gebraucht haben. :smile: Eventuell hat mich unser GF zu sehr gelobt. Na gut, 1 1/2 Tage Entwicklungszeit sind ja auch noch OK.

Workbook Open ist der falsche Zeitpunkt, da hat es noch den
falschen Namen.

Das Dokument wird geöffnet umbenannt und danach müssen
die Daten an Hand des neuen Namens des Dokuments jeweils beim
öffnen der einzelnen Blätter geladen werden.

Schon mal daran gedacht eine Vorlage zu öffnen? Einfcah eine
neue Mappe anlegen und bei Speichern unter als Vorlage
abzuspeichern.

Über Vorlagen weiß ich nichts, die Leute dort scheinbar auch nicht. :smile:
Ich kann ja schlecht anfangen und den Arbeitsablauf in einer anderen Firma umzukrempeln. Ich hätte hier gar nicht erst Excel genommen und noch viel mehr daran automatisiert, denn so wie es jetzt ist, wird immer noch manuell daran gearbeitet, aber das wird so verlangt.

Der Sinn ist klar, oder? Es existiert ein Dokument vom Mai,
ich maile Daten vom Juni. Nun wird das Dokument ‚Mai‘ geladen
und per ‚Speichern unter‘ der Juni erzeugt, ohne den Mai zu
verlieren.

Klingt doch machbar.

Nach ‚save as‘ wird das Dokument nicht geschlossen, Workbook
open ist also nicht mein Ereignis. Wann wird ‚Befor Save‘
ausgelöst? Doch sicher bevor der neue Name eingegeben wurde,
oder?
… (Gerade getestet, wie vermutet bevor der neue Name
eingetippt ist. :smile:) … *ärger*

Es gibt auch SaveCopyAs, hilft das weiter?

Genau das passiert ja, aber das Dokument muss trotzdem erst geschlossen und neu geöffnet werden, weil Jahr und Monat aus dem Dateinamen des Dokuments genommen werden. Das muss so nur ein mal getippt werden und nicht mehr in jedem Tabellenblatt einzeln, wie bisher.

Das waren bisher rund 50 Arbeisstunden pro Monat, für die einfach Niemand mehr die Zeit hat. (Und Lust zu der stupiden Tipperei wohl auch nicht. :smile:)

Gruß Rainer

Hallo Reinhard,

Find ist recht schnell:

Option Explicit

Sub tt()
Dim c As Range, Zei As Long
For Zei = 1 To Cells(Rows.Count, 1).End(xlUp).Row
With Rows(Zei)
Set c = .Find(„Pers“, LookIn:=xlPart)
If Not c Is Nothing Then
MsgBox c.Address
MsgBox InStr(c, „Pers“)
End If
End With
Next Zei
End Sub

ahhhh, so wär’s gegangen. OK, nun hab ich halt 'ne Schleife über 11 Zellen, ist auch noch schnell.

Und CStr braucht man nicht, ja ich weiß, sicher ist sicher,
grad bei Excel :smile:

Txt = „=SUM(H11:H“ & n + 10 & „)“
ActiveSheet.Range(„H“ & n + 12).Formula = Txt

Wenn ich eine Zahl an einen String übergebe verwende ich zur Sicherheit immer CStr(). Gewohnheit und vermutlich nicht die Schlechteste. :smile:

Gruß Rainer