Supportnet / Forum / Tabellenkalkulation
Makro für „Speichern unter“ mit Abfrage Dateiname
Frage
Hallo liebe Excel Spezialisten,
ich bin mit VBA nicht sehr vertraut, mache meine Makros immer mit dem Makrorecorder. Nun habe ich ein Problem, das ich auf diese Weise nicht lösen kann. Ich möchte eine Datei - Stundenaufstellung / Arbeitszeitkonto - am Monatsende speichern, dann die Daten löschen sodass nur noch die leere Maske mit dem Übertrag für den Folgemonat vorliegt und dann diese mit „Speichern unter“ unter einem neuen Namen abspeichern. Dies ist soweit alles problemlos, nur sollte die Abarbeitung des Makros an der Stelle stehen bleiben, an der nach dem neuen Dateinamen gefragt wird und dies ist mit dem Makrorecorder nicht zu bewerkstelligen. Ich hab mir schon einige Tipps aus diesem Forum geholt und bin sicher, dass mir einer von Euch helfen kann.
Grüße an alle und danke schön
Bernyzz
Antwort 1 von coros
Nabend ,
versuch es mal mit nachfolgender Anweisung. Diese öffnet das Speichern unter Fenster und speichert dann die Datei unter dem Namen, den Du da eingibst.
Ich hoffe, Dir hilft´s. Bei Fragen melde Dich.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
versuch es mal mit nachfolgender Anweisung. Diese öffnet das Speichern unter Fenster und speichert dann die Datei unter dem Namen, den Du da eingibst.
Sub Speichern_unter_neuem_Namen()
Dim Neuer_Dateiname
Neuer_Dateiname = Application.GetSaveAsFilename(InitialFileName:="", fileFilter:="Excel-Arbeitsmappe, *.xls")
If Neuer_Dateiname = False Then Exit Sub
ActiveWorkbook.SaveAs Filename:=Neuer_Dateiname
End Sub
Ich hoffe, Dir hilft´s. Bei Fragen melde Dich.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von bernyzz
Hallo coros,
vielen Dank für die schnelle Antwort. Werde mich erst am Feierabend bzw. am Wochenende damit befassen können.
Schönen Tag
Bernyzz
vielen Dank für die schnelle Antwort. Werde mich erst am Feierabend bzw. am Wochenende damit befassen können.
Schönen Tag
Bernyzz
Antwort 3 von bernyzz
Hallo coros,
danke für den Tipp, läuft einwandfrei. Wäre ich früher schon auf dieses Forum gestoßen, ich hätte mir jahrelang viel Arbeit gespart.
Ein weiteres Problem würde ich gerne mit Deiner Hilfe, oder mit der eines anderen Spezialisten lösen: Gibt es eine Möglichkeit, Spalten bei Erfüllung einer Bedingung auszublenden oder schreibzuschützen? Es geht darum, im monatlichen Stundenerfassungsblatt in Monaten mit 30 Tagen, die Spalte mit dem 31. in Abhängikeit des Datums auszublenden oder zu sperren. Bislang behelfe ich mich mit der benutzerdefinierten Formatierung ";;;", die jedoch niemanden daran hindert, in die so formatierten Zellen Daten einzugeben, die dann zu allem Überdruß nicht zu sehen sind und in die Absummierung laufen. Habe schon im Forum nach einer Lösung gesucht, jedoch nichts gefunden.
Also, wenn jemand was weiß, bitte antworten.
Schöne Grüße von
Bernyzz
danke für den Tipp, läuft einwandfrei. Wäre ich früher schon auf dieses Forum gestoßen, ich hätte mir jahrelang viel Arbeit gespart.
Ein weiteres Problem würde ich gerne mit Deiner Hilfe, oder mit der eines anderen Spezialisten lösen: Gibt es eine Möglichkeit, Spalten bei Erfüllung einer Bedingung auszublenden oder schreibzuschützen? Es geht darum, im monatlichen Stundenerfassungsblatt in Monaten mit 30 Tagen, die Spalte mit dem 31. in Abhängikeit des Datums auszublenden oder zu sperren. Bislang behelfe ich mich mit der benutzerdefinierten Formatierung ";;;", die jedoch niemanden daran hindert, in die so formatierten Zellen Daten einzugeben, die dann zu allem Überdruß nicht zu sehen sind und in die Absummierung laufen. Habe schon im Forum nach einer Lösung gesucht, jedoch nichts gefunden.
Also, wenn jemand was weiß, bitte antworten.
Schöne Grüße von
Bernyzz
Antwort 4 von coros
Moin,
kopiere nachfolgende VBA Code in das VBA Projekt "DieseArbeitsmappe" der Datei, in der Du die Spalte ausbelnden möchtest.
Bei obigen Code wird in Tabellenblatt "Tabelle1" die Spalte 31 (Spalte AE) ausgeblendet, wenn der aktuelle Monat 30 Tage hat. Ansonsten, also bei 31 Tagen, bleibt die Spalte eingeblendet.
Den Blattnamen und die Spaltenindexnummer musst Du eventuell noch auf Deine Datei anpassen.
Ich hoffe, Du kommst klar. Wenn nicht oder bei Fragen zu dem Code melde Dich.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
kopiere nachfolgende VBA Code in das VBA Projekt "DieseArbeitsmappe" der Datei, in der Du die Spalte ausbelnden möchtest.
Private Sub Workbook_Open()
If Day(DateSerial(Year(Date), Month(Date) + 1, 0)) = 31 Then
Sheets("Tabelle1").Columns(31).EntireColumn.Hidden = False
Else
Sheets("Tabelle1").Columns(31).EntireColumn.Hidden = True
End If
End SubBei obigen Code wird in Tabellenblatt "Tabelle1" die Spalte 31 (Spalte AE) ausgeblendet, wenn der aktuelle Monat 30 Tage hat. Ansonsten, also bei 31 Tagen, bleibt die Spalte eingeblendet.
Den Blattnamen und die Spaltenindexnummer musst Du eventuell noch auf Deine Datei anpassen.
Ich hoffe, Du kommst klar. Wenn nicht oder bei Fragen zu dem Code melde Dich.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 5 von bernyzz
Hallo coros,
wie nicht anders zu erwarten war, hat Dein Tipp funktioniert.. Die Spalte - bei mir ist es die 32 - wird beim Öffnen der Datei in Abhängigkeit des Systemdatums aus- bzw. eingeblendet. Dies ist jedoch nicht ganz das was ich wollte. Die Spalte soll in Abhängigkeit des in einem Feld -B2- eingetragenen Datums aus- oder eingeblendet werden. In diesem Feld steht immer das Datum des Monatsersten. Die Erfassungsblätter werden ja nicht immer im laufenden Monat ausgefüllt und schon gar nicht ausgewertet. Wenn ich im Juni die Blätter des Monats Mai abrechnen soll, fehlt die Spalte für den 31. Mai. Wenn auch die Daten dieser Spalte in die Absummierung einfließen, so ist es doch nicht praktisch den 31 nicht zu sehen.
Bin gespannt, ob Du dazu auch eine Lösung hast. Läßt es sich bewerkstelligen, dass im Februar auch der 30. ausgeblendet wird (Schaltjahre unberücksichtigt)?
Grüße und Dank von
Bernyzz
wie nicht anders zu erwarten war, hat Dein Tipp funktioniert.. Die Spalte - bei mir ist es die 32 - wird beim Öffnen der Datei in Abhängigkeit des Systemdatums aus- bzw. eingeblendet. Dies ist jedoch nicht ganz das was ich wollte. Die Spalte soll in Abhängigkeit des in einem Feld -B2- eingetragenen Datums aus- oder eingeblendet werden. In diesem Feld steht immer das Datum des Monatsersten. Die Erfassungsblätter werden ja nicht immer im laufenden Monat ausgefüllt und schon gar nicht ausgewertet. Wenn ich im Juni die Blätter des Monats Mai abrechnen soll, fehlt die Spalte für den 31. Mai. Wenn auch die Daten dieser Spalte in die Absummierung einfließen, so ist es doch nicht praktisch den 31 nicht zu sehen.
Bin gespannt, ob Du dazu auch eine Lösung hast. Läßt es sich bewerkstelligen, dass im Februar auch der 30. ausgeblendet wird (Schaltjahre unberücksichtigt)?
Grüße und Dank von
Bernyzz
Antwort 6 von coros
Hi Bernyzz,
warum schreibst Du erst jetzt, dass es sich nicht um den aktuellen Monat handelt, sondern dass der Datumswert sich in einer Zelle befindet, auf das sich der VBA Code beziehen soll? Je genauer die Angaben bei der Fragestellung, desto schneller und genauer das Ergebnis.
Kopiere nachfolgenden VBA Code in das VBA Projekt der Tabelle, in dem sich Dein Datum befindet und in dem dann auch die Spalten ausgeblendet werden sollen - ich hoffe, Datum und auszublendende Spalten befinden sich in ein und dem gleichen Tabellenblatt ?- und lösche den alten VBA Code aus dem VBA Projekt "DieseArbeitsmappe", der wird nicht mehr benötigt.
Bei dem Code werden je nachdem welches Datum in Zelle B2 eingetragen wird die entsprechenden Spalten ausgeblendet. Dabei spielt es keine Rolle, ob in die Zelle der Erste des Monats oder ein anderer Tag des Monats eingetragen werden, da sich der Code nur auf den Monat bezieht. Wenn der Monat n30 Tage hat, wird Spalte AF (Spalte 32) ausgeblendet, bei 28 Tagen wird Spalte AC:AF ausgeblendet und bei einem Schaltjahr wird Spalte AD:AF ausgeblendet. Ansonsten, also bei 31 tagen sind alle Spalten eingeblendet.
So, das wars. Ich hoffe, es ist so, wie Du es Dir gedacht hast. Wenn nicht oder wenn der Code Probleme machen sollte, dann melde Dich.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
warum schreibst Du erst jetzt, dass es sich nicht um den aktuellen Monat handelt, sondern dass der Datumswert sich in einer Zelle befindet, auf das sich der VBA Code beziehen soll? Je genauer die Angaben bei der Fragestellung, desto schneller und genauer das Ergebnis.
Kopiere nachfolgenden VBA Code in das VBA Projekt der Tabelle, in dem sich Dein Datum befindet und in dem dann auch die Spalten ausgeblendet werden sollen - ich hoffe, Datum und auszublendende Spalten befinden sich in ein und dem gleichen Tabellenblatt ?- und lösche den alten VBA Code aus dem VBA Projekt "DieseArbeitsmappe", der wird nicht mehr benötigt.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Datum As Date
Application.ScreenUpdating = False
Datum = Range("B2")
If Target.Address = "$B$2" Then
Sheets("Tabelle1").Columns("AC:AF").EntireColumn.Hidden = False
If Day(DateSerial(Year(Datum), Month(Datum) + 1, 0)) = 30 Then
Sheets("Tabelle1").Columns("AF").EntireColumn.Hidden = True
Else
If Day(DateSerial(Year(Datum), Month(Datum) + 1, 0)) = 29 Then
Sheets("Tabelle1").Columns("AD:AF").EntireColumn.Hidden = True
Else
If Day(DateSerial(Year(Datum), Month(Datum) + 1, 0)) = 28 Then
Sheets("Tabelle1").Columns("AC:AF").EntireColumn.Hidden = True
End If
End If
End If
End If
End SubBei dem Code werden je nachdem welches Datum in Zelle B2 eingetragen wird die entsprechenden Spalten ausgeblendet. Dabei spielt es keine Rolle, ob in die Zelle der Erste des Monats oder ein anderer Tag des Monats eingetragen werden, da sich der Code nur auf den Monat bezieht. Wenn der Monat n30 Tage hat, wird Spalte AF (Spalte 32) ausgeblendet, bei 28 Tagen wird Spalte AC:AF ausgeblendet und bei einem Schaltjahr wird Spalte AD:AF ausgeblendet. Ansonsten, also bei 31 tagen sind alle Spalten eingeblendet.
So, das wars. Ich hoffe, es ist so, wie Du es Dir gedacht hast. Wenn nicht oder wenn der Code Probleme machen sollte, dann melde Dich.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 7 von bernyzz
Hallo coros,
toll es läuft wie erhofft. Danke. Mußte nur bei 29 Tagen von AD:AF auf AE:AF, bei 28 Tagen von AC:AF auf AD:AF korrigieren, damit die richtigen Spalten ausgeblendet werden. Nun ergibt sich ein anderes Problem: Die Tabelle ist schreibgeschützt, allerdings ohne Paßwort, damit der Anwender nicht versehentlich Formeln überschreibt. Ich habe in die Zeile nach "Private Sub .....“ den Befehl "ActiveSheet.Unprotect“ und nach dem letzten "End If“ "AktiveSheet.Protect DrawingObjects:=True, Contentes:=True, Scenarios:=True“eingefügt. Bei Änderung des Datums in B2 wir wohl der Schreibschutz aufgehoben, jedoch bei der Zeile für die Aktivierung des Schreibschutzes bleibt die Prozedur stehen, mit der Fehlermeldung "Laufzeitfehler 424 Objekt erforderlich". Beim"Debuggen“ ist die Zeile mit dem Befehl für den Schreibschutz gelb markiert. Was hab ich da falsch gemacht?
Wegen der ungenauen Fragestellung: der Schreiber liest seinen Text meistens anders als der Leser. Ich werde mich bemühen, wenn ich wiedereinmal Fragen habe. Kannst Du mir ein nicht zu teueres Werk zur VBA-Programmierung empfehlen? Im Original-Handbuch für Visual Basic mit Excel 95 wird die deutsche Version beschrieben, die es ja seit Excel 97 nicht mehr gibt.
Also nochmals vielen Dank und schönen Tag
Benyzz
toll es läuft wie erhofft. Danke. Mußte nur bei 29 Tagen von AD:AF auf AE:AF, bei 28 Tagen von AC:AF auf AD:AF korrigieren, damit die richtigen Spalten ausgeblendet werden. Nun ergibt sich ein anderes Problem: Die Tabelle ist schreibgeschützt, allerdings ohne Paßwort, damit der Anwender nicht versehentlich Formeln überschreibt. Ich habe in die Zeile nach "Private Sub .....“ den Befehl "ActiveSheet.Unprotect“ und nach dem letzten "End If“ "AktiveSheet.Protect DrawingObjects:=True, Contentes:=True, Scenarios:=True“eingefügt. Bei Änderung des Datums in B2 wir wohl der Schreibschutz aufgehoben, jedoch bei der Zeile für die Aktivierung des Schreibschutzes bleibt die Prozedur stehen, mit der Fehlermeldung "Laufzeitfehler 424 Objekt erforderlich". Beim"Debuggen“ ist die Zeile mit dem Befehl für den Schreibschutz gelb markiert. Was hab ich da falsch gemacht?
Wegen der ungenauen Fragestellung: der Schreiber liest seinen Text meistens anders als der Leser. Ich werde mich bemühen, wenn ich wiedereinmal Fragen habe. Kannst Du mir ein nicht zu teueres Werk zur VBA-Programmierung empfehlen? Im Original-Handbuch für Visual Basic mit Excel 95 wird die deutsche Version beschrieben, die es ja seit Excel 97 nicht mehr gibt.
Also nochmals vielen Dank und schönen Tag
Benyzz
Antwort 8 von coros
Hi,
nachfolgenden Code habe ich bei mir laufen lassen und er funktioniert.
Es wird der Schreibschutz aufgehoben und am Ende wieder gesetzt.
Wenn das bei Dir nicht funktionieren sollte, dann schreib mal bitte Deinen im Moment verwendeten VBA Code hier in, damit man mal nachscheuen kann, ob Du da irgendwo einen Fehler eingebaut hast.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
nachfolgenden Code habe ich bei mir laufen lassen und er funktioniert.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Datum As Date
Application.ScreenUpdating = False
ActiveSheet.Unprotect
Datum = Range("B2")
If Target.Address = "$B$2" Then
Sheets("Tabelle1").Columns("AC:AF").EntireColumn.Hidden = False
If Day(DateSerial(Year(Datum), Month(Datum) + 1, 0)) = 30 Then
Sheets("Tabelle1").Columns("AF").EntireColumn.Hidden = True
Else
If Day(DateSerial(Year(Datum), Month(Datum) + 1, 0)) = 29 Then
Sheets("Tabelle1").Columns("AE:AF").EntireColumn.Hidden = True
Else
If Day(DateSerial(Year(Datum), Month(Datum) + 1, 0)) = 28 Then
Sheets("Tabelle1").Columns("AD:AF").EntireColumn.Hidden = True
End If
End If
End If
End If
ActiveSheet.Protect
End SubEs wird der Schreibschutz aufgehoben und am Ende wieder gesetzt.
Wenn das bei Dir nicht funktionieren sollte, dann schreib mal bitte Deinen im Moment verwendeten VBA Code hier in, damit man mal nachscheuen kann, ob Du da irgendwo einen Fehler eingebaut hast.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 9 von coros
Hi,
ich noch mal. Nun habe ich doch glatt vergessen, auf die Frage mit der VBA Lektüre einzugehen. Sorry, da kann ich Dir leider nichts empfehlen, da ich selber keine Lektüre über VBA in Excel habe. Ich bin da, bedingt durch meinen Beruf, etwas vorbelastet, was Visual Baic angeht. Das VBA (Visual Basic for Application) habe ich mir dann durch viel lesen in Foren und probieren angeeignet.
MfG,
coros
Jeder macht was er will, keiner macht was er soll, aber alle machen mit.
ich noch mal. Nun habe ich doch glatt vergessen, auf die Frage mit der VBA Lektüre einzugehen. Sorry, da kann ich Dir leider nichts empfehlen, da ich selber keine Lektüre über VBA in Excel habe. Ich bin da, bedingt durch meinen Beruf, etwas vorbelastet, was Visual Baic angeht. Das VBA (Visual Basic for Application) habe ich mir dann durch viel lesen in Foren und probieren angeeignet.
MfG,
coros
Jeder macht was er will, keiner macht was er soll, aber alle machen mit.
Antwort 10 von bernyzz
Hallo coros,
alles bestens, Danke.
Bis vielleicht ein andermal wieder.
bernyzz
alles bestens, Danke.
Bis vielleicht ein andermal wieder.
bernyzz

