SaveAs in Makro funktioniert nicht

Hallo Excelperten!

Ich hab ein relativ großes Makro aus dem Teillisten in neuen Dateien gespeichert werden sollen.

Das Makro an sich ist in meiner Personal.-Datei unsichtbar und funktiniert mittlerwiele gut. :smile:

Jetzt mein Problem:
Sobald das Makro aus einer Excel-Datei die Teillisten in das neue Workbook kopieren soll und dann die „kleine Liste“ speichern soll bekomme ich folgenden Fehler:

Fehler in Sub Fehler:
Fehlernummer 1004
Fehlerbeschreibung:Die Methode „SaveAs“ für das Objekt’_Workbook’ ist fehlgeschlagen.

Mache ich die Personal-Mappe sichtbar und kopiere die Urliste (große) darein läuft das Makro durch.

Hier der Auszug der Probleme bereitet:

Do
    zBis = WorksheetFunction.Min(.Cells(zVon, 1).End(xlDown).Row - 1, letzte)

'neue Mappe erstellen

Workbooks.Add

'Überschriften

Range(„B1“) = „Auftragsnummer“
Range(„C1“) = „Kunde“
Range(„D1“) = „Unternehmes-ID“
Range(„E1“) = „Geschäftsjahr bis“
Range(„F1“) = „Ergebnis“

'Ergebnisliste erstellen

Range(„K3“) = „war bereits angepasst“
Range(„K4“) = „neu angepasst“
Range(„K5“) = „ohne RN gelöscht“
Range(„K6“) = „Insolvenz“
Range(„K7“) = „erweiterte Recherche“

’ Spalte „K“ ausblenden

Columns(„K:K“).Hidden = True

’ Dropdownmenue erstellen (Ergebnis)

With Range(„F2“)
With .Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$K$3:$K$8"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = „“
.ErrorTitle = „“
.InputMessage = „Ergebnis“
.ErrorMessage = „“
.ShowInput = True
.ShowError = True
End With
.Copy Destination:=Range(„F3:F“ & zBis - zVon + 2)
End With

’ entsprechende Zeilen in die neue Mappe einfügen

.Range(„A“ & zVon & „:E“ & zBis).Copy Destination:=Range(„A2“)

Columns("A:F").EntireColumn.AutoFit

’ bedingte Formatierung für den Status hinzufügen

ActiveSheet.Range(„F2:F38“).Select
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="="„erweiterte Recherche“""
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="="„ohne RN gelöscht“""
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 13551615
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False

Range("G2").Select

ActiveCell.FormulaR1C1 = "=IF(RC[-1]=""erweiterte Recherche"",""Grund:"","""")"
    Range("G2").Select
    Selection.Copy
    Range("G3:G38").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
 
Columns("F:F").ColumnWidth = 20

Range("F2").Select

’ Als neue Mappe speichern

ActiveWorkbook.SaveAs filename:=pfad & Range(„A2“) & .Range(„G1“) & „.xlsx“
ActiveWorkbook.Close
zVon = zBis + 1
Loop Until zBis = letzte
End With

Ich hoffe Ihr könnt mir verraten wo ich da den Denkfehler habe… :frowning:
Vielen Dank schonmal

René

Hallo René

Du schreibst: Fehlerbeschreibung: Die Methode „SaveAs“ für das Objekt’_Workbook’ ist fehlgeschlagen. Das betrifft wohl die Zeile ganz am Schluss Deines Makros:
ActiveWorkbook.SaveAs filename:=pfad & Range(„A2“) & .Range(„G1“) & „.xlsx“

Da fällt mir auf: & .Range(„G1“). – Ist der Punkt vor Range richtig? – Du stellst hier ja nur einen Auszug Deines Makros vor. Ich sehe darin nicht, wie das zu diesem Punkt gehörige With heisst.
Weiter: Wie lautet der Inhalt der Variablen pfad? Und welchen Inhalt haben A2 und G1?
Grüsse Niclaus

Also er kopiert schon nicht mehr die Zeilen in die neue Arbeitsmappe rein.

Das Dropdownfeld wird erstellt, die Überschriften geschrieben.

Dann erfolgt der Kopiervorgang schon nicht mehr und er bricht mit genannter Fehlermeldung ab.

Da komische ist nur, wenn ich die Personal.XLSB sichtbar mache und die urdatei (also die große Liste) da reinkopiere läuft das Makro komplett durch und funktioniert 1A. :frowning:

Zu Deinen Fragen:
A2 ist eine laufende Zahl die vom Makro gesetzt wurde. Bei einem Eintrag in Spalte A bis zum nächsten Eintrag in Spalte A soll gestückelt werden und der entsprechende EIntrag an den Dateinamen vorne angestellt werden.
In G1 ist ein in einer Userform eingegebener Name gesetzt, der ebenfalls teil des Dateinamens werden soll.

Der Punkt ist da wenn ich das richtig sehe falsch - hab ihn weggenommen mit gleichem ergebnis.

Was das Makro machen soll:

Aus einer Userform bekommt er diverse informationen wie er eine große Liste in mehrere kleine zerlegen soll.

Funktioniert sehr gut - auch die Auswahl des Speicherortes klappt.

Dann soll er ein neue Workbook erstellen und eine definierte Anzahl an Reihen in das neue WB kopieren, anschließend speichern.

Die Daten zum Dateinamen liegen in der großen Liste.

Meine Idee war schon, dass er sich die Daten aus der kleinen Liste holen will - da sind die entsprechenden Zellen leer und es würde ein leerer Dateiname erzeugt.

Aber was mich am meisten Wundert ist, dass das Kopieren nicht klappt wenn die Urliste nicht in der Personal sondern als andere Datei geöffnet wird.

Hoffe Du kannst mir folgen :smile:
Gruß
René

Hallo René

Hast Du schon einmal versucht, das oder die entsprechenden Makros aus der Personal.xlsb in die Urliste hinein zu kopieren? Diese Urliste müsstest Du dann als xlsm-Datei abspeichern.

Die Userforms, die Du anwendest, müsstest Du unbedingt anpassen: Sie dürfen nicht mehr Bezug nehmen auf die Personal.xlsb sondern müssen an die neue xlsm-Datei angepasst werden.

Es ist schwierig, dem Ablauf zu folgen, wenn man die verschiedenen Dateien nicht zur Verfügung hat und die Makros nur auszugsweise kennt.

Viele Grüsse
Niclaus

Hallo Niclaus,

also das mit dem kopieren möchte ich ja gerne umgehen. :smile:

Bisher mache ich das so:

Ich bekomme eine Exportierte Datei aus unserem Auftragsprogramm.
Ich habe die gesamte Liste in meine Personal kopiert und das Makro läuft.

Diese Listen bekomme ich wöchentlich per Mail zugesandt.

Nun hatte ich gehofft, dass ich die Liste öffne und das Userform nutze um das Makro dann laufen zu lassen. :frowning:

Ich habe hier leider keine Möglichkeit die Datei bzw. die Personal mal hochzuladen um das Makro im Ganzen zu zeigen…

Gruß

René

Hallo René
Das verstehe ich. Mir ging es auch nur darum, das einmal als Test zu machen. Wenn es so klappen würde, wüsste man, wo man weiter suchen kann.

Du kannst das gesamte Makro kopieren und hier in w-w-w einfügen, ohne dass Du die Datei hochladen musst. - Vielleicht sieht man irgendeine „Schwachstelle“. Versprechen kann ich Dir allerdings nichts.

Grüsse Niclaus

Hallo Niclaus,

also wie gesagt, das Makro funktioniert, wenn die Urliste (also die ich per Mail erhalte) in der gleichen Arbeitsmappe ist, wie das Makro läuft.

Das Makro wird durch einen Button in einer Userform gestartet.

Folgende Infos vorab:

In der ComboBox1 und zwei sind die Spaltenüberschriften drin (füllen sich beim Start).

Die Eingabe (vorgabe vorhanden) txtBox2 wird in G1 geschrieben
Die EIngabe (vorgabe vorhanden) txtBox1 wird zur Ermittlung der Größe (Anzahl der Zeilen) der „neuen“ Listen genutzt. (vorgabe 25)

Hier nun das Makro:

Public Sub CommandButton1_Click()

Dim dubletten As String
Dim sortieren As String
Dim spdublett As Variant
Dim spsortier As Variant
Dim letztezeile As Integer
Dim aktzeile As Integer
Dim Mappennummer As Integer
Dim maximal As Integer
Dim laenge As Integer
Dim sp As Integer
Dim dublettenanz As Integer
Dim zeilenalt As Integer
Dim weite As Long
Dim pfad As String
Dim zVon As Long, zBis As Long, letzte As Long

spdublett = 1
spsortier = 1

On Error GoTo Errorhandler

'Auslesen der Userform

ActiveSheet.Range(„G1“) = txtBox2

dubletten = UserForm1.ComboBox1.Value
sortieren = UserForm1.ComboBox2.Value
laenge = UserForm1.txtBox1.Value

'prüfen ob „laenge“ einen gültigen Wert enthält

If laenge < 1 Then
MsgBox „Bitte die Größe der Listen eingeben“, vbOKOnly
GoTo ausgang
End If

'prüfen ob Dubletten und Sortierung angegeben wurden

If dubletten = „“ Then
dubletten = „keine Dublettensuche“
spdublett = 1
If sortieren = „“ Then
sortieren = „keine Sortierung“
spsortier = 1

MsgBox "Sortierung: " & sortieren & ". ; Dublettensuche: " & dubletten & ".", vbCritical

GoTo weiter

'Spalte wo Dubletten entfernt werden sollen

Do Until ActiveCell = dubletten
spdublett = spdublett + 1
ActiveSheet.Cells(1, spdublett).Activate

Loop

’ Herausfinden der letzten Zeile

Range(„A:E“).Select
letztezeile = Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Row
zeilenalt = letztezeile

'Dubletten entfernen

Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select

ActiveSheet.Range("$A$2:$E$" & letztezeile).RemoveDuplicates Columns:=spdublett, Header:=xlNo

’ Herausfinden der letzten Zeile

letztezeile = Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Row

'Info wieviele Dubletten entfernt wurden

dublettenanz = zeilenalt - letztezeile
MsgBox „Es wurden " & dublettenanz & " Dubletten bei " & dubletten & " gefunden und entfernt.“, vbOKOnly + vbCritical, „Dubletten entfernt“

sort:
'Spalte die sortiert werden soll

Do Until ActiveCell = sortieren
spsortier = spsortier + 1
ActiveSheet.Cells(1, spsortier).Activate
Loop

'Sortierung

Columns(„A:E“).Select
ActiveSheet.sort.SortFields.Clear
ActiveSheet.sort.SortFields.Add Key:=Range(Cells(2, spsortier), Cells(letztezeile, spsortier)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveSheet.sort
.SetRange Range(„A1:E“ & letztezeile)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

weiter:
Columns(„A:E“).EntireColumn.AutoFit

'Einteilung der Liste

aktzeile = 2
Mappennummer = 1
maximal = (letztezeile - 1) / laenge

If maximal > Int(maximal) + 0.5 Then maximal = maximal + 1

Do

Range(„A“ & aktzeile) = Mappennummer
aktzeile = aktzeile + laenge
Mappennummer = Mappennummer + 1

Loop Until Mappennummer > maximal

MsgBox „Es werden " & maximal & " Listen erzeugt“, vbOKOnly

'Listen stückeln

’ Pfad erfragen

With Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect = False
.Title = „Wohin sollen die Teil-Listen gespeichert weden?“
.InitialView = msoFileDialogViewDetails
.InitialFileName = „C:“
weite = .Show
If weite = 0 Then Exit Sub
pfad = .SelectedItems(1) & „“
End With

With Tabelle1
    zVon = 2
    letzte = .Cells(.Rows.Count, 2).End(xlUp).Row

'Schleife zum Speichern der Listen

Do
zBis = WorksheetFunction.Min(.Cells(zVon, 1).End(xlDown).Row - 1, letzte)

'neue Mappe erstellen

Workbooks.Add

'Überschriften

Range(„B1“) = „Auftragsnummer“
Range(„C1“) = „Kunde“
Range(„D1“) = „Unternehmes-ID“
Range(„E1“) = „Geschäftsjahr bis“
Range(„F1“) = „Ergebnis“

'Ergebnisliste erstellen

Range(„K3“) = „war bereits angepasst“
Range(„K4“) = „neu angepasst“
Range(„K5“) = „ohne RN gelöscht“
Range(„K6“) = „Insolvenz“
Range(„K7“) = „erweiterte Recherche“

’ Spalte „K“ ausblenden

Columns(„K:K“).Hidden = True

’ Dropdownmenue erstellen (Ergebnis)

With Range(„F2“)
With .Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$K$3:$K$8"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = „“
.ErrorTitle = „“
.InputMessage = „Ergebnis“
.ErrorMessage = „“
.ShowInput = True
.ShowError = True
End With
.Copy Destination:=Range(„F3:F“ & zBis - zVon + 2)
End With

’ entsprechende Zeilen in die neue Mappe einfügen

.Range(„A“ & zVon & „:E“ & zBis).Copy Destination:=Range(„A2“)

Columns("A:F").EntireColumn.AutoFit

’ bedingte Formatierung für den Status hinzufügen

ActiveSheet.Range(„F2:F38“).Select
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="="„erweiterte Recherche“""
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False

Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="="„ohne RN gelöscht“""
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 13551615
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False

Range("G2").Select

ActiveCell.FormulaR1C1 = "=IF(RC[-1]=""erweiterte Recherche"",""Grund:"","""")"
    Range("G2").Select
    Selection.Copy
    Range("G3:G38").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
 
Columns("F:F").ColumnWidth = 20

Range("F2").Select

’ Als neue Mappe speichern

ActiveWorkbook.SaveAs filename:=pfad & Range(„A2“) & Range(„G1“) & „.xlsx“
ActiveWorkbook.Close
zVon = zBis + 1
Loop Until zBis = letzte
End With

GoTo ausgang

'Errorhandling
Errorhandler:

MsgBox „Fehler in Sub Fehler:“ & vbCrLf & "Fehlernummer: " & Err.Number & vbCrLf & "Fehlerbeschreibung: " & Err.Description

'Ausgang

ausgang:

Unload UserForm1

End Sub

Hoffe das mein Programmierstil nicht zu chaotisch ist! :smile:

Danke schonmal und Liebe Grüße

René

Hallo René

Ich habe Dein Makro durchgesehen. Es ist nicht einfach :persevere:
Warum es funkt, wenn du die Daten in die Personal-Datei kopierst, sonst aber nicht, kann ich nicht erklären. - Eine Vermutung: Du schreibst ganz am Schluss:

Ich würde mal das „ActiveWorkbook.Close“ auskommentieren. Es kommt mir vor, wie wenn das Makro sich damit den Ast absägt, auf dem es sitzt. - Dagegen spricht, dass es aus der Personal-Datei heraus klappt.

Wenn das nichts nützt, würde ich mal ganz am Anfang den Fehler-Handler ausschalten:

Mit Debuggen sieht man, wo genau der Fehler steckt.

Eine Frage habe ich noch: Ich habe Dir vorgeschlagen, das Makro samt der UserForm in die Urliste zu kopieren, statt die Urliste in die Personal-Datei. Hat das auch nichts gebracht?

Ich vermute, das alles wird Dir nicht helfen. Tut mir leid! Trotzdem viele Grüsse
Niclaus