15.08.2019, 10:36
(Dieser Beitrag wurde zuletzt bearbeitet: 15.08.2019, 10:42 von peacescorer.)
Hallo liebe Excel-Freunde
Ich habe ein Problem und hoffe, ihr könnt mir helfen...
Für eine etwas komplexere Bürolösung habe ich verschiedene Workbooks erstellt (Offerten, Rechnungen, etc.). Diese WB´s enthalten wiederum Sheets, von welchen ich einen bestimmten Bereich "sichern" will. (Der komplette Sheetexport ist keine Lösung für mich, da ich die ersten 8 Zeilen verschiedene Objekte, Grafiken, etc. habe und zudem jede Menge VBA-Codes...)
Das Gute: Der Bereich in den Sheets ist mit ("A9:PP" &lnglastrow) bis auf die unterschiedlichen lnglastrow immer identisch...
Das Schlechte: Ich weiß nicht mal im Ansatz, wie ich untenstehenden Code abändern muss, damit ich eine komplette Sicherung erstellen kann...
Die Wkb + Wks-Struktur: (Das erste sind die Wkb´s, der Einzug die Wks)
JB Modul 1 Offerten.xlsm
Offerten
Absagen
Interner Bereich
JB Modul 2 Aufträge[b].xlsm[/b]
Aufträge
Akonto
SR_Pauschal
SR_GemOfferte
Regierechnung
Interner Bereich
JB Modul 5 Rechnungsübersicht[b].xlsm[/b]
Rechnungsübersicht
BezahlteRechnungen
Am liebsten wäre mir, wenn die Prozedur von jedem Workbook eine eigene Sicherungsdatei anlegt in welchem dann die jeweiligen Sheets und deren Bereiche gespeichert sind. D.h. z.B. die Sicherung von "JB Modul 1 Offerten" hat dann 3 Sheets mit den Bereichswerten des Originals. Der Vollständigkeit halber halte ich fest, dass ich auch mit .txt und .csv experimentiert habe... - das Trennzeichen (z.B. Semikolon) macht mir hier Kopfzerbrechen, da dieses Zeichen genauso wie der Beistrich relativ oft vorkommen. Von einer professionellen Datenbank-Lösung (Access) möchte ich ebenfalls absehen, da mir da das notwendige Wissen komplett fehlt.
Hat jemand eine Idee wie ich das realisieren könnte? Mein einziger Ansatz wäre, Wbk´s, Sheets´s und Bereich als Argumente übergeben und das ganze per Schleife abarbeiten... Diese Prozedur dann in einem separaten Workbook auszuführen. Aber leider ist mein VBA-Wissen (immer noch) zu rudimentär um dies umzusetzen...
Hier stehe ich derzeit: Untenstehender Code kopiert die Werte des angegebenen Bereiches meines Origingals in eine neues Wkb... aber eben nur das erste Sheet "Offerten".
Ich habe ein Problem und hoffe, ihr könnt mir helfen...
Für eine etwas komplexere Bürolösung habe ich verschiedene Workbooks erstellt (Offerten, Rechnungen, etc.). Diese WB´s enthalten wiederum Sheets, von welchen ich einen bestimmten Bereich "sichern" will. (Der komplette Sheetexport ist keine Lösung für mich, da ich die ersten 8 Zeilen verschiedene Objekte, Grafiken, etc. habe und zudem jede Menge VBA-Codes...)
Das Gute: Der Bereich in den Sheets ist mit ("A9:PP" &lnglastrow) bis auf die unterschiedlichen lnglastrow immer identisch...
Das Schlechte: Ich weiß nicht mal im Ansatz, wie ich untenstehenden Code abändern muss, damit ich eine komplette Sicherung erstellen kann...
Die Wkb + Wks-Struktur: (Das erste sind die Wkb´s, der Einzug die Wks)
JB Modul 1 Offerten.xlsm
Offerten
Absagen
Interner Bereich
JB Modul 2 Aufträge[b].xlsm[/b]
Aufträge
Akonto
SR_Pauschal
SR_GemOfferte
Regierechnung
Interner Bereich
JB Modul 5 Rechnungsübersicht[b].xlsm[/b]
Rechnungsübersicht
BezahlteRechnungen
Am liebsten wäre mir, wenn die Prozedur von jedem Workbook eine eigene Sicherungsdatei anlegt in welchem dann die jeweiligen Sheets und deren Bereiche gespeichert sind. D.h. z.B. die Sicherung von "JB Modul 1 Offerten" hat dann 3 Sheets mit den Bereichswerten des Originals. Der Vollständigkeit halber halte ich fest, dass ich auch mit .txt und .csv experimentiert habe... - das Trennzeichen (z.B. Semikolon) macht mir hier Kopfzerbrechen, da dieses Zeichen genauso wie der Beistrich relativ oft vorkommen. Von einer professionellen Datenbank-Lösung (Access) möchte ich ebenfalls absehen, da mir da das notwendige Wissen komplett fehlt.
Hat jemand eine Idee wie ich das realisieren könnte? Mein einziger Ansatz wäre, Wbk´s, Sheets´s und Bereich als Argumente übergeben und das ganze per Schleife abarbeiten... Diese Prozedur dann in einem separaten Workbook auszuführen. Aber leider ist mein VBA-Wissen (immer noch) zu rudimentär um dies umzusetzen...
Hier stehe ich derzeit: Untenstehender Code kopiert die Werte des angegebenen Bereiches meines Origingals in eine neues Wkb... aber eben nur das erste Sheet "Offerten".
Code:
Sub Datensicherung()
Dim wbQuelle As Workbook
Dim wksQuelle As Worksheet
Dim wbZiel As Workbook
Dim wksZiel As Worksheet
Dim strPfadZiel As String
Dim lnglastrow As Long
Dim strFileQuelle As String
Dim iFileOpen% 'Argument für Funktion, ob Quelle verfügbar
'Abfrage ob wirklich speichern:
If MsgBox("Möchten Sie eine komplette Datensicherung erstellen?", vbQuestion + vbOKCancel, _
"Datensicherung") = vbCancel Then GoTo Fehler
On Error GoTo Fehler
'Beschleunigen:
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
.DisplayAlerts = False
End With
'********QUELLE**********
strFileQuelle = ThisWorkbook.Path & "\" & "JB Modul 1 Offerten.xlsm"
'Quelle verfügbar?
iFileOpen = FileOpen(strFileQuelle) '(Sep.Funktion)
Select Case iFileOpen
Case 0
'MsgBox "Verfügbar! Es kann weiter gehen!"
Case 1
MsgBox "Die Quelldatei wird von einem Benutzer verwendet! Bitte schliessen und Sicherung nochmals starten!"
Exit Sub
Case 2
MsgBox "Die Quelldatei wurde verschoben bzw. konnte nicht gefunden werden!" & vbNewLine & "Bitte Pfad kontrollieren! Die Quelldatei muss im selben Verzeichnis wie das COCKPIT gespeichert sein."
Exit Sub
End Select
'Wenn verfügbar --> Quelle öffnen und Quellsheet definieren:
Set wbQuelle = Workbooks.Open(strFileQuelle)
Set wksQuelle = wbQuelle.Worksheets("Offerten")
'Letzte Zeile in Quellsheet ermitteln (Für späteren Kopiervorgang):
With wksQuelle
lnglastrow = .Range("A65536").End(xlUp).Row
End With
'***********ZIEL***********
strPfadZiel = ThisWorkbook.Path & "\Database\Backup\" 'Zielpfad
Set wbZiel = Workbooks.Add 'Neues Workbook
wbZiel.SaveAs strPfadZiel & "Offert_Sicherung - " & Format(Now, "ddmmyy_hhmm") & ".xlsx" 'Speichern
wbZiel.Worksheets.Add.Name = "Offert_Sicherung" 'Neues Sheet
wbZiel.Worksheets("Tabelle1").Delete 'Überflüssiges Sheet löschen
Set wksZiel = wbZiel.Worksheets("Offert_Sicherung") 'Zielsheet definieren
'****KOPIERVORGANG****:
With wksZiel
wksQuelle.Range(wksQuelle.Cells(9, 1), wksQuelle.Cells(lnglastrow, 15)).Copy 'A9 bis
.Range("A9").PasteSpecial (xlValues)
End With
'****QUELLE und ZIEL schliessen****:
Application.CutCopyMode = False
wbZiel.Close savechanges:=True
wbQuelle.Close savechanges:=False
MsgBox "Sicherung wurde erfolgreich angelegt!"
'FEHLERTEUFEL:
Fehler:
Application.ScreenUpdating = True
With Err
Select Case .Number
Case 0 'Alles OK
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
'Beschleunigung ausschalten:
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.DisplayAlerts = True
End With
'Bereinigen:
Set wbZiel = Nothing: Set wksZiel = Nothing
Set wbQuelle = Nothing: Set wksQuelle = Nothing
End Sub
'PRÜFUNG, OB DATEI GEÖFFNET IST: (w/Firmennetzwerk)
Function FileOpen(sPath As String) As Integer
'nicht gefunden
If Dir(sPath) = "" Then
FileOpen = 2
'gefunden aber?
Else
On Error GoTo errorhandler
'Fehler bei Write wenn schon geöffnet
'kommt nicht bei schreibgeschützter Datei
Open sPath For Random Access Read Lock Read Write As #1
Close #1
End If
Exit Function
errorhandler:
'Fehler 70 = File offen
If Err = 70 Then FileOpen = 1
End Function