[VBA] einzelnes Arbeitsblatt abspeichern
#1
Hallo,

ich will ein einzelnes Arbeitsblatt mit VBA in einer neuen Mappe abspeichern und die neue Mappe ohne Rückfrage schließen.

In K23 steht eine Rechnungsnummer und damit der Name des einzelnen Blattes und der neuen Mappe.
Mit diesem Code kommt eine Fehlermeldung ("Index außerhalb des gültigen Bereichs") in der Move-Zeile:
   With Sheets("RechnungsVorlage")
     .ExportAsFixedFormat 0, "C:\Temp\" & .[K23] & ".pdf"          'Definition des Datei-/Blattnamens, Pfad anpassen!
     
     ActiveSheet.Copy After:=Sheets(Sheets.Count)                  'Rechnung wird ans Ende der Tabellen kopiert
     ActiveSheet.Name = .[K23]                                     'Die Kopie wird benannt nach der Rechnungsnummer
     ActiveSheet.Shapes("Button 1").Delete                         'Schaltfläche in der Kopie wird gelöscht
     
     strDatei = "C:\Temp\" & .[K23] & ".xlsb"                      'Definition des Datei-/Blattnamens, Pfad anpassen!
     MsgBox (.[K23])                                               'Anzeige des Datei-Namens
     ActiveWorkbook.Sheets(.[K23]).Move                            'hier kommt Fehler "Index außerhalb des gültigen Bereichs"
     ActiveWorkbook.SaveAs Filename:="C:\Temp\" & .[K23] & ".xlsb", FileFormat:= _
         xlExcel12, CreateBackup:=False                            'Abspeichern der neuen Arbeitsmappe
     ActiveWindow.Close                                            'Schließen der neuen Arbeitsmappe
     Sheets("RechnungsVorlage").Activate
Was mache ich falsch?
Wie wird das richtig formuliert?
Gibt es eine einfachere Lösung?
Top
#2
Hallo Ralf,

aus wieviel Blättern besteht denn deine Datei?
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#3
Hi Edgar,

(12.02.2016, 13:30)BoskoBiati schrieb: aus wieviel Blättern besteht denn deine Datei?

3: RechnungsVorlage, Kundendaten, Datenbankliste.
Top
#4
Hallo,

ich würde das so machen:


Code:
Dim StrDatei As String
Dim neueDatei as String
neueDatei=sheets("Rechnungsvorlage").Range("K32")

StrDatei = ThisWorkbook.Path & "diese Datei.xlsm"
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ThisWorkbook.Save
Sheets("Kundendaten").delete
sheets("Datenbankliste").delete
VBA_Code_entfernen
ThisWorkbook.SaveAs Filename:="D:\" & neueDatei & ".xlsx", FileFormat:=xlOpenXMLWorkbook, ConflictResolution:=xlLocalSessionChanges
Workbooks.Open StrDatei
ThisWorkbook.Close savechanges = True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End If
End Sub


Sub VBA_Code_entfernen()
Dim Ding As Object
Dim Zeile As Long

  For Each Ding In ActiveWorkbook.VBProject.vbcomponents

   'Type 100 = DieseArbeitsmappe und alle Tabellen
    If Ding.Type = 100 Then

      With ActiveWorkbook.VBProject.vbcomponents(Ding.Name).CodeModule
        For Zeile = 1 To .CountOfLines
          .DeleteLines 1
        Next Zeile
      End With

   'Type 1 = Modul, Type 2 = Klassenmodul, Type 3 = UserForm
    Else
      ActiveWorkbook.VBProject.vbcomponents.Remove Ding
    End If

  Next
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#5
Hallo zusammen,

Edgar zu umständlich.

Bin am Handy, deshalb nur eine Kurzanleitung.

Per Code:
Tabellenblatt kopieren
Das kopierte Blatt ist in dem Moment das Activeworkbook
Activeworkbook.save mit Benennung im .xlsx Format
Vorher unter Umständen Warnmeldungen aus
Ein Löschen des Codes ist dann nicht erforderlich.

Passenden Code gibt es im www zu genüge
Gruß Atilla
Top
#6
Hallo atilla,

der Löschcode ist z.B. aus dem Netz. Der ist tatsächlich überflüssig, der war noch in meiner Datei, weil ich als .xls speichern musste. Dann reicht das:


Code:
Dim StrDatei As String
Dim neueDatei as String
neueDatei=sheets("Rechnungsvorlage").Range("K32")

StrDatei = ThisWorkbook.Path & "diese Datei.xlsm"
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ThisWorkbook.Save
Sheets("Kundendaten").delete
sheets("Datenbankliste").delete
ThisWorkbook.SaveAs Filename:="D:\" & neueDatei & ".xlsx", FileFormat:=xlOpenXMLWorkbook, ConflictResolution:=xlLocalSessionChanges
Workbooks.Open StrDatei
ThisWorkbook.Close savechanges = True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End If
End Sub
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#7
Hallo Edgar,

Das Löschen von einzelnen Blättern kannst Du auch sparen,
wenn Du das Blatt kopierst und speicherst.
Gruß Atilla
Top
#8
Hallo atilla,

hast wohl recht, habe ich aber noch nicht getestet, daher kann ich dazu keinen Code liefern.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#9
Auch Hallo,

bei der SaveAs-Methode kann man auch ein Worksheet verwenden oder habe ich da was falsch verstanden?

Zitat:Worksheet.SaveAs-Methode

Speichert Änderungen am Diagramm oder Arbeitsblatt in einer anderen Datei.
Gruß Stefan
Win 10 / Office 2016
Top
#10
Hi,

(12.02.2016, 15:22)atilla schrieb: Das Löschen von einzelnen Blättern kannst Du auch sparen,
wenn Du das Blatt kopierst und speicherst.

das war ja mein ursprünglicher Versuch im eingestellten Code und da kam die Fehlermeldung, weil ich wohl den falschen Code verwendet habe!
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste