Speicherdialog Excel-Datei bei doppeltem Namen

Hallo Community,

ich habe ein Exceltabelle, die ich per Knopfdruck an einer bestimmten Stelle speichern möchte. Dies klappt auch soweit alles.
Mein Problem nun ist, dass ich bei gleichen Dateinamen (wenn eine Datei mehrmals gespeichert wird) eine Meldung bekomme, dass es diese Datei schon gibt, ob ich überschreiben möchte Ja, Nein oder Abbrechen.
Wenn ich ja anwähle, überschreibt er die Datei logischerweise einfach. Sobald ich aber Nein anwähle, bekomme ich einen Fehler:
Beim debuggen bleibt er immer beim .saveas fest, wenn ich den Nein Button auswähle!

Hier ein Ausschnitt des Codes:

With ActiveWorkbook
Bereich.Copy Destination:=.Worksheets(1).Range(„A1“)
.SaveAs „c:\test\test.xlsx“
AWS = .FullName
.Close savechanges:=False
End With

Es gibt nun zwei Möglichkeiten:

  1. ich gebe dem Anwender die Möglichkeit einen neuen Namen einzugeben
  2. man hängt einfach z.B. test_1 an

Ich habe mir schon etliche Gedanken gemacht, wie ich dieses Problem lösen kann, komme allerdings nicht wirklich zu einer Lösung. Hoffe mir kann jemand helfen, wäre super nett :smile:

Mit freundlichen Grüßen

Star

Beim debuggen bleibt er immer beim .saveas fest, wenn ich den
Nein Button auswähle!

Hallo Star,

sicher du könntest erst mit Dir(…) abfragen ob es die datei schon gibt, dann dem User eine Userform mit InputBox voresetzen, wo er wählen kann, Datei überschreiben, speichern untern neuen namen, wo du den namen schon vorgeben kannst, so daß er den übernimmt oder abändert, oder abbrechen.

Oder so:

Sub tt()
Dim Eing As Long, Mldg As String
Const PfadDat As String = "c:\test\meinetests.xls"
Mldg = vbCr & vbCr & "schon vorhanden." & vbCr & vbCr & "ÜBERSCHREIBEN Ja/Nein?"
With ActiveWorkbook
 If Dir(PfadDat) "" Then
 Eing = MsgBox(PfadDat & Mldg, vbYesNo, "Abfrage")
 If Eing vbOK Then Exit Sub
 End If
 Application.DisplayAlerts = False
 .SaveAs "c:\test\meinetests.xls"
 .Close savechanges:=False
 Application.DisplayAlerts = True
End With
End Sub

Gruß
Reinhard

Speicherdialog Excel-Datei bei doppeltem Namen
Guten Tag,

soweit sieht das gut aus, jedoch komm ich als VBA-Anfänger an einer Stelle mal wieder nicht weiter!
Ich frage mich nun, wie ein bei der Nein-Aktion (von dem Script was Reinhard geschrieben hat) eine Aktion auslöse die das Speicherproblem löst undzwar einfach eine Zahl z.B. immer Anhängt oder einen anderen Namen erwartet! …
Grüße

Hallo nocheinmal,

ich hab nun das eine Problem gelöst, nun folgt jedoch das nächste!
Ich habe nun einen Programmcode, mit welchen ich einen „Speichern-Unter Dialog“ aufrufe. Jedoch soll nicht die komplette Exceldatei abgespeicher werden, sondern nur ein Bereich!

Hier meine Gedanken dazu:

Private Sub CommandButton3_Click()
Dim strVerzeichnis As String
Dim strDateiname As String
strVerzeichnis = „C:\Temp“
strDateiname = Application.GetSaveAsFilename(InitialFileName:=strVerzeichnis & _
„.xls“, FileFilter:=„Microsoft Excel-Arbeitsmappe (*.xls), *.xls“)
Select Case strDateiname
Case False
Exit Sub
Case Else
ThisWorkbook.Worksheets(„Ablehnung“).Range(„A1:G48“).SaveAs Filename:=strDateiname
End Select
End Sub

Bei dieser Zeile wirft er mir den Fehler( ThisWorkbook.Worksheets(„Ablehnung“).Range(„A1:G48“).SaveAs ), weil ich vermute, dass ich ihm den Bereich nicht so einfach mitgeben kann…

Bitte um einen Ratschlag, wie ich dies anderer schreiben kann, damit es funktioniert.
Ihr seid die Besten :smile:

Grüße und danke im Vorraus

Ich habe nun einen Programmcode, mit welchen ich einen
„Speichern-Unter Dialog“ aufrufe. Jedoch soll nicht die
komplette Exceldatei abgespeicher werden, sondern nur ein
Bereich!

Hallo Star,

ungeteste, baue da die Codezeilen mit in deinen Code ein:

Sub BereichAlsXls()
Dim Merker As Integer
Merker = SheetsInNewWorkbook
SheetsInNewWorkbook = 1
Workbooks.Add
With ActiveWorkbook.Worksheets(1)
 ThisWorkbook.Worksheets("Ablehnung").Range("A1:G48").Copy Destination:=.Range("A1")
 .Name = "AblehnungA1\_G48"
 .Parent.SaveAs "c:\Pfad\NeuerName.xls"
 .Parent.Close savechanges:=False
End With
SheetsInNewWorkbook = Merker
End Sub

Gruß
Reinhard

Dankeschön, hab das gerade hinbekommen:

Der Code sieht nun so aus:

Private Sub CommandButton3_Click()
Dim Merker As Integer
Dim strVerzeichnis As String
Dim strDateiname As String

Merker = SheetsInNewWorkbook
SheetsInNewWorkbook = 1
Workbooks.Add
With ActiveWorkbook.Worksheets(1)
ThisWorkbook.Worksheets(„Ablehnung“).Range(„A1:G48“).Copy Destination:=.Range(„A1“)
.Name = „AblehnungA1_G48“
strDateiname = Application.GetSaveAsFilename(InitialFileName:=strVerzeichnis & _
„.xls“, FileFilter:=„Microsoft Excel-Arbeitsmappe (*.xls), *.xls“)
.Parent.SaveAs strDateiname
.Parent.Close savechanges:=False
End With
SheetsInNewWorkbook = Merker

End Sub

Dieser Dialog soll allerdings nur ausgeführt werden, wenn der Anwender die Datei nicht überspeichern möchte.
Für diesen Fall, habe ich folgenden Code(Danke an Reinard):

Dim Eing As Long, Mldg As String
Const PfadDat As String = „c:\DATA\Hansi.xls“
Mldg = vbCr & vbCr & „Schon vorhanden.“ & vbCr & vbCr & „Überschreiben?“
With ActiveWorkbook
If Dir(PfadDat) „“ Then
Eing = MsgBox(PfadDat & Mldg, vbYesNo, „Abfrage“)
If Eing vbYes Then Call CommandButton3_Click
Else: MsgBox („Überschreiben“)
End If

If Dir(PfadDat) „“ Then
'Eing = MsgBox(PfadDat & Mldg, vbYesNo, „Abfrage“)
If Eing vbNo Then
MsgBox („Speichern unter“)
Application.DisplayAlerts = False
.SaveAs „c:\DATA\Hansi.xls“
.Close savechanges:=False
Application.DisplayAlerts = True
End If
End If
End With

Dieser Code wird sozusagen vorangestellt und bietet mir 2 Schaltflächen: Ja oder Nein. Bei Ja soll die Datei einfach überschreiben werden & bei Nein soll „Call CommandButton3_Click“ ausgeführt werden und der Speicherdialog sich öffnen. Problem ist allerdings, dass ich irgendwo noch einen kleinen Fehler in der Fallunterscheidung (ob User Ja oder Nein) anklickt habe und ich deswegen noch ein Problem hab… Find ihn allerdings nicht, bin warscheinlich schon blind ^^ Bitte euch noch ein letzes mal um Rat!

Grüße Star

Dieser Code wird sozusagen vorangestellt und bietet mir 2
Schaltflächen: Ja oder Nein. Bei Ja soll die Datei einfach
überschreiben werden & bei Nein soll „Call
CommandButton3_Click“ ausgeführt werden und der Speicherdialog
sich öffnen. Problem ist allerdings, dass ich irgendwo noch
einen kleinen Fehler in der Fallunterscheidung (ob User Ja
oder Nein) anklickt habe und ich deswegen noch ein Problem
hab… Find ihn allerdings nicht, bin warscheinlich schon
blind ^^ Bitte euch noch ein letzes mal um Rat!

Hallo Star,

so Blindheit kenne ich. Mach den Rechner aus. Geh raus, vielleicht hat ja schon ein Eiscafe mit Tischen draußen auf, setz dich da hin.
Setz dich da hin, schalt ab.
Oder nimm einen großen Zettel und skizziere mal ein Struktogramm oder PAP (Programmablaufpülan des Codes, was da eigentlich geschehen soll.

Geht nicht um Schönheitspunkte. Und du hast ja nur IF-Abfrage(n).
Warum eigentlich zwiemal If Dir(PfadDat) „“ Then? Irritiert mich sehr.
Dafür brauchste nur die Raute vom PAP. Für das andere reichen Rechtecke.

Und die zwei Dinge haste ruckzuck kapiert wenn du dir im Inet so PAPs anschaust mit Rauten für J/N und Rechtecke.

Wenn das sitzt, gehste nach Hause und codierst das in 3 min fertig :smile:

Noch etwas, was jetzt beim Problem keine Rolle spielt für dich aber für später sehr wichtig ist daß auch so zu handeln.

Sicher kann man CommandButton1_Click() wie eine normale Sub benutzen.
Macht man aber nicht. Die Regel ist, in so Ereigniscodes wie den vom CommandButton1 möglichst wenig reinschreiben.
Also so
Sub CommandButton1_Click()
Call BereichAlsWorkbookSpeichern
End Sub

Und aus anderen Codes heraus startest du da nicht CommandButton1_Click sondern BereichAlsWorkbookSpeichern.
Ich weiß, schwierig, bei Kleincodes wie hier den tieferen Sinn zu erahnen, machs einfach bzw. gewöhne es dir an.

Noch eine Winzigkeit die ich sah. Die MsgBox liefert vbYes oder vbNo, Gut.
Und wenn du danach abfragst
IF Eing = vbYes then…
so ist das in Ordnung.

Im Zweiten Fall fragst du aber ab
IF Eing vbNo then…

was m.E. nicht so okay ist. Sicher, in dem Spezialfall kann das dann nur vbYes gewesen sein. ABER, wieder mal die Annahme es handelt sich um längeren Code, dann habe ich doch längst vergessen ob Eing aus einer MsgBox stammt oder einer Inputbox, wo es ja mehr Möglichkeiten als zwei Antworten gibt.

Dann halt auch hier
IF Eing = vbYes then…
oder aber, wenn dann wenn bei allen Antworten außer vbYes etwas passieren soll:
IF Not Eing = vbYes then…

Das ist natürlich immer davon abhängig was der Code machen oder nicht machen soll.

Äh, wenn ich dich mit meinen Infos nerve, sag Bescheid, dann pack ich meinen Zweit nick aus, schweigsame Elster :smile:

Den „Fehler“ im Code hab ich jetzt nicht groß genug, der Code an sich irritiert mich wie gesagt. Verbessere das bitte und sag dann auch genauer welcher Fehler, wo usw.

Gruß
Reinhard