joerg18470
Goto Top

Möchte per Button meine Tabelle mit automatisch generierten Namen speichern

Ich habe mir ein Makro geschrieben welches per Klick meine Tabelle in einen fest zugewiesenen Ordner speichert.

Jetzt möchte ich dieses Makro :

Sub Save()
'
' Save Makro
'

'
ActiveWorkbook.SaveAs Filename:="C:\Users\#####\Documents\Stunden.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub

aber so verändern, das man sich einen Speicherort in einer Zelle hinterlegen kann unter dem dann die Datei gespeichert wird. Der Name soll generiert werden indem :

- man in dem Dokument welches 13 Tabellen enthällt in 12 Tabellen jeweils eine Zelle prüft und das der Reihe nach von Januar -Dezember
- ist z.B in der Tabelle vom April die Zelle auf 0 dann soll der Name " Stunden-März-[Jahreszahl aus einer anderen Zelle].xlsm generiert werden

Wie müßte man die Variable definieren und wie die Variable dann in den Namen einsetzen ? Dachte an irgendwelche Platzhalter
Würde dieses auch gerne mit Excel üblichen Formeln realisieren, aber ich denke das sprengt den Rahmen von Excel, sodas es mit VBA besser realisierbar wäre. Bin diesbezüglich für alle Vorschläge offen.

Content-ID: 183255

Url: https://administrator.de/contentid/183255

Ausgedruckt am: 25.11.2024 um 23:11 Uhr

mak-xxl
mak-xxl 08.04.2012 um 15:11:54 Uhr
Goto Top
Moin Joerg18470,

Unter der Annahme, dass:

1. Deine Mappe 12 oder mehr Blätter enthält,
2. diese je einen Monatsnamen tragen,
2. die ersten 12 Blätter der Mappe sind,
3. jeweils in Zelle 'A1' eine Null oder eine 1 steht,

kann das etwa so aussehen:
Sub MappeSpeichern()                ' nicht 'Save', das ist ein reserviertes Wort  
    MsgBox VZName                   ' nur zur Kontrolle, dann auskomm. oder löschen  
    ActiveWorkbook.SaveAs Filename:="C:\Users\" & VZName & "\Documents\Stunden.xlsm", _  
                          FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub

Private Function VZName() As String
    Dim i As Integer
    With ThisWorkbook
        For i = 1 To 12
            If .Sheets(i).Cells(1, 1).Value = 0 Then
                If i = 1 Then
                    VZName = .Sheets(i).Name
'                    VZName = "Keiner"  
                    Exit Function
                Else
                    VZName = .Sheets(i - 1).Name
                    Exit Function
                End If
            End If
        Next i
    End With
End Function

Die Funktion gibt den Namen des Blattes zurück, das in 'A1' einen Wert >0 enthält und auf das ein Blatt mit dem Wert '0' (in dieser Zelle) folgt. Ist bereits der Januar = 0, dann siehe Zeile 13-14.

Das Ganze im Modulblatt 'Diese Arbeitsmappe' einfügen.

Für einen Dateinamen mit Monat kann das so aussehen (ohne das Jahr):
Sub MappeSpeichern()
    MsgBox "C:\Users\#####\Documents\Stunden " & FileNameToken & ".xlsm"  
    ActiveWorkbook.SaveAs Filename:="C:\Users\#####\Documents\Stunden " & FileNameToken & ".xlsm", _  
                            FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub

Private Function FileNameToken() As String
    Dim i As Integer
    With ThisWorkbook
        For i = 1 To 12
            If .Sheets(i).Cells(1, 1).Value = 0 Then
                FileNameToken = IIf(i = 1, .Sheets(i).Name, .Sheets(i - 1).Name)     ' wie oben, kürzere Schreibweise  
                Exit Function
            End If
        Next i
    End With
End Function

Und wenn aus dem aktiven Tabellenblatt heraus gespeichert wird:
ActiveWorkbook.SaveAs Filename:="C:\Users\#####\Documents\Stunden " & ActiveSheet.Name & ".xlsm"  
Frohe Ostern und freundliche Grüße von der Insel - Mario

PS: Guten Tag oder ein Hallo sind hier durchaus gern gesehen!
Joerg18470
Joerg18470 08.04.2012 um 15:56:23 Uhr
Goto Top
Dafür entzschuldige ich mich natürlich in höchster Form, Ein Hallo oder guten Tag muß einfach wirklich drin sein !!!

Also erstmal nachträglich Hallo und frohe Ostern zusammen !

Wow so schnell ein solches Script zusammen gebaut ....Hut zieh...
In der Zelle A1 steht immer ein Datum und die Tabellen beginnen ab der 2. Tabelle. Die erste ist allgemeines wie Feiertagskalender, Jahreszahl die für alle Tabellen zur Berechnung benötigt wird und noch verschiedenes anderes allgemeines.
Werde es gleich mal testen, sage dir dann ob es funktioniert hat, Danke eins zwein

Grüße aus dem tiefsten Sachsen
mak-xxl
mak-xxl 08.04.2012 um 16:03:13 Uhr
Goto Top
Moin Joerg18470,

Du darfst die KoTau-Stellung wieder verlassen face-smile

Wenn ab Blatt 2 der fragliche Rümpel steht, dann:
For i = 2 To 13                  ' Zeile 10  
If i = 2 Then                    ' Zeile 12  

Freundliche Grüße von der Insel - Mario
Joerg18470
Joerg18470 08.04.2012 um 17:53:32 Uhr
Goto Top
Gehe ich richtig in der Annahme, das ich in Zeile 11 bei Cells(1,1) für die Zelle C44, Cells(3,44) eingeben muß ?
mak-xxl
mak-xxl 08.04.2012 um 17:59:29 Uhr
Goto Top
Moin Joerg18470,

Nein: .Cells(Zeile, Spalte) -> .Cells(44, 3) = 'C44'.

Du kannst aber notfalls auch mit der 'Range'-Angabe arbeiten:

If .Sheets(i).Range("C44").Value = 0 Then  

Freundliche Grüße von der Insel - Mario
Joerg18470
Joerg18470 08.04.2012 um 18:44:48 Uhr
Goto Top
Irgendwie geht das nicht so wie ich das möchte, der Code ist mir einleuchtend. Da wird auch was angemarkert, ich stelle mal ein Bild zur Verfügung.

[URL=http://www.pic-upload.de/view-13686377/Ashampoo_Snap_2012.04.08_18h34m0 ...][IMG]http://www10.pic-upload.de/08.04.12/wjal7qdgm3ah.png[/IMG][/URL]

Der "Speichern " Button liegt mit in der ersten allgemeinen Tabelle. Ich denke mal das ich da irgendwo einen Fehler mit der Makrozuweisung gemacht habe. Hier nochmal ein Bild des Codes von "DieseMappe"

[URL=http://www.pic-upload.de/view-13686477/Ashampoo_Snap_2012.04.08_18h41m0 ...][IMG]http://www7.pic-upload.de/08.04.12/ajsq5lsf8491.png[/IMG][/URL]

Hoffe du kannst damit etwas anfangen.
mak-xxl
mak-xxl 08.04.2012 um 18:55:47 Uhr
Goto Top
Moin Joerg18470,

Du hast jetzt beide Versionen in den Quelltext übernommen - für eine musst Du Dich entscheiden.

Angenommen, es soll die zweite Version werden, dann muss die Zeile:
MsgBox "C:\Users\Joerg\Documents\Stunden " & FileNameToken & ".xlsm"  
erstmal gültige Dateinamen (i.e. <C:\...\Stunden März.xlsm>) anzeigen.

Die Zeile danach kommentierst Du (vorerst) komplett aus, da haben sich bei Dir Fehler eingeschlichen, muss so aussehen:
Sub MappeSpeichern()
    MsgBox "C:\Users\Joerg\Documents\Stunden " & FileNameToken & ".xlsm"  
'    ActiveWorkbook.SaveAs Filename:="C:\Users\Joerg\Documents\Stunden " & FileNameToken & ".xlsm", _  
                            FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub

Und wenn das Ganze per Button gestartet wird:
Private Sub CommandButton1_Click()
    Call MappeSpeichern
End Sub

dann muss der gesamte Code in dem Modul des Tabellenblattes stehen, das den Button trägt - oder auch (evtl. besser, weil sachlich zusammenhängender), auf einem extra eingefügten Modul.

Freundliche Grüße von der Insel - Mario
Joerg18470
Joerg18470 08.04.2012 um 19:38:17 Uhr
Goto Top
Jippie...
die Messagebox öffnet und sagt mir den Speicherpfad. Natürlich speichert diese nicht, aber sie gibt mir den Namen Stunden Januar, da kommt auch bestimmt gleich das nächste Problem mit, da im Februar auf Grund der wenigeren Tage als Ausnahme die zu prüfende Zelle in C42 ist. Aber das würde ich erstmal nach hinten schieben um eines erstmal richtig zu machen.
Habe die 2. Version genommen und diese als seperates Modul gespeichert. "DieseArbeitsmappe" habe ich komplett geleert, hoffe das war kein Fehler. Dann bin ich auf den Button und habe dieses Modul zugewiesen. Soweit geht es prima, worin könnte jetzt der Fehler in der auskommentierten Zeile liegen, kann es sein das er da keinen Wert für definieren kann ?

PS.: Habe die Zeile wieder rein genommen und er speichert....PRIMA...
bastla
bastla 08.04.2012 um 19:50:35 Uhr
Goto Top
... bzw als Bezug auf eine Zelle für Schleifen besser als "Range()" und etwas leichter lesbar:
If .Sheets(i).Cells(44, "C").Value = 0 Then
Grüße
bastla

[Edit] Im Thread etwas ungünstig einsortiert, aber der Bezug (zum Zell-Bezug face-wink) dürfte klar sein ... [/Edit]
mak-xxl
mak-xxl 08.04.2012 um 20:11:33 Uhr
Goto Top
Moin Joerg18470,

Erfreulich - das Problem mit dem Tabellenblatt 'Februar' könntest Du per Formel lösen: also in Zelle 'C44' als Formel '=C42' eintragen, dann braucht VBA keine Verrenkungen machen.

Freundliche Grüße von der Insel - Mario
Joerg18470
Joerg18470 08.04.2012 um 20:34:26 Uhr
Goto Top
Habe die Tabelle im Februar angepasst und es funktioniert bombastisch !
Sorry wenn ich mich etwas blöd angestellt habe, aber ich sehe hier sind die echten Meister am werkeln !
Danke !!!

Jetzt geh ich erstmal meinen lecker Osterhasen verputzen, schön mit Rotkohl und Klößen face-smile
Biber
Biber 09.04.2012 um 01:02:04 Uhr
Goto Top
Moin Joerg18470,

Zitat von @Joerg18470:
Jetzt geh ich erstmal meinen lecker Osterhasen verputzen, schön mit Rotkohl und Klößen face-smile
Mach aber bitte vorher die Löffel ab und an diesen Beitrag das, was die Hoppler immer schlagen in einem satten Waldmeisterton..

Danke und Mahlzeit
Biber