Anzeige
Archiv - Navigation
1816to1820
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Application.FileDialog(msoFileDialogSave

Application.FileDialog(msoFileDialogSave
26.02.2021 15:13:23
Michael
Hallo Zusammen,
derzeit komme ich bei einem kleinen Projekt nicht weiter.
Folgende Aufgabe soll das Makro erledigen (Start des Makro durch Klick auf Button):
Aktuelles Arbeitsblatt ("30-60") kopieren - eine 8 stellige Nummer (SAP-Nr. erfragen) - den Speichern unter Dialog für das neue Arbeitsblatt aufrufen - dort schon den Pfad ausgewählt haben und den Namen nach einem Schema (Datum & SAP-Nr & Tabellenblattname) vorgeben - nach dem Klick auf speichern die neue Datei und die ggf. noch geöffnete Mappe (kopiertes Arbeitsblatt) schließen und den Fokus wieder auf die Ursprungsdatei setzen.
Mein Problem ist im Bereich - nach dem klick auf speichern die neue Datei und die ggf. noch geöffnete Mappe (kopiertes Arbeitsblatt) schließen und den Fokus wieder auf die Ursprungsdatei setzen.
Ich versuche auch das Klicken von Abbruch statt okay im Speichern unter Dialog abzufangen, dadurch passieren aber Dinge, die ich nicht nachvollziehen kann. Sie passieren für mich nicht sichtbar innerhalb von "Application.FileDialog(msoFileDialogSave)" diese Funktion verstehe ich offensichtlich nicht richtig.
Vielleicht kann mir jemand helfen. Anbei die Datei (https://www.herber.de/bbs/user/144266.xlsm)
Den Button / die Makrofunktion habe ich derzeit nur auf Tabellen(Arbeits-)blatt 30 - 60 implementiert. Wenn der Code einmal läuft, soll er für alle Arbeitsblätter gebutz werden (Anpassung der Bezeichnung 30-60 an den jeweiligen Namen des Blatts.
Passwort für den Arbeitsmappenschutz ist Probe (steht aber auch im Makro) ;-)
Vielen Dank schon einmal.
Grüße Micha

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Application.FileDialog(msoFileDialogSave
26.02.2021 23:58:25
Yal
Hallo Michael,
Refaktorisierung, also Code unter die Lupe nehmen, und umgestalten. Amazing.
Dein Code lässt sich wie folgt kürzen/stützen. Die Teilung in Subs soll zu einer besseren thematischen Übersicht führen. Weniger verschachtelte Struktur.
Der Aufruf von FileDialog(msoFileDialogSaveAs) erlaubt die Auswahl einer Zieldatei, zwingt aber nicht damit zu speichern. Sogar besser separat zu handeln.
Der Aufruf der Makro machst Du am besten mit Alt+F8 anstatt Knopf. Sonst hast Du im gespeicherte Blatt ein Knopf ohne Code. Sollte Blatt unabhängig funktionieren.
Const cNetzLW = "N:"
Const cInitPfad = "N:\TE\Produkte\"
Public Sub AktuellesBlatt_speichern()
Dim SAPNummer As String
Dim DateiName As String
WorkbookSperre_setzen False
If Not Netzlaufwerk_testen(cNetzLW) Then Exit Function
SAPNummer = SAPNummer_abfragen(ActiveSheet.Name)
If SAPNummer = "" Then Exit Sub
DateiName = DateiName_abfragen(ActiveSheet.Name, SAPNummer)
If DateiName = "" Then Exit Sub
Tabelle_speichern ActiveSheet, DateiName
WorkbookSperre_setzen True
End Sub
Private Sub WorkbookSperre_setzen(Status As Boolean)
If Status Then
ThisWorkbook.Protect Password:="Probe", Structure:=True, Windows:=False 'aktiviert den  _
Arbeitsmappenschutz mit Passwort
Else
ThisWorkbook.Unprotect Password:="Probe"
End If
End Sub
Private Function Netzlaufwerk_testen(Netzlaufwerk As String) As Boolean
'Unter "Early Binding": Extra >> Verweise, "Microsoft Scripting Runtime"
Dim fs As newFileSystemObject
If fs.DriveExists(Netzlaufwerk) Then
Netzlaufwerk_testen = True
Else
MsgBox "Netzlaufwerk >" & Netzlaufwerk & "
Ungefragte Meinung: es wird viele bunte Elemente mit sehr wenige Information in unzählige Dateien gespeichert. Digitale Vermüllung von teueren Netzlaufwerk-Festplatten?
VG
Yal

Anzeige
Erratum
27.02.2021 00:05:08
Yal
in
Private Function Netzlaufwerk_testen(Netzlaufwerk As String) As Boolean
'Unter "Early Binding": Extra >> Verweise, "Microsoft Scripting Runtime"
Dim fs As newFileSystemObject
Leerzeichen zwischen new und FileSystemObject.
Verweis auf Scripting Runtime nicht vergessen, sonst gibt es Meldung.
Da ich nicht getestet habe und es spät ist, könnte mehrere solche Flüchtigkeitsfehler geben.
VG
Yal

AW: Erratum
03.03.2021 12:05:01
Michael
Hallo Yal,
vielen Dank für Deine Arbeit.
Ein Typo war noch drin (bei der Funktion DateiName_abfragen) ->
DateiName_abfragen = IIf(Left(.SelectedItems(1), Len(cInitPfad)) = cInitPfad, _
cInitPfad, "") & .SelectedItems(1)
Da die Tabellenblattnamen ein Sonderzeichen enthalten, habe ich noch eine Funktion eingefügt, die das prüft und das Sonderzeichen ersetzt:

Private Function BlattName_abfragen(BlattName) As String
'Auslesen des Tabellenblattnames, prüfen auf Sonderzeichen und Übernahme als Variable BlattName
Dim BlattNameZeichen As String
Dim i As Integer
Dim Gültig As Boolean
BlattName = ActiveSheet.Name
Debug.Print BlattName
'Schleife, die unerlaubtes Zeichen entfernt
For i = 1 To Len(BlattName)
BlattNameZeichen = Mid(BlattName, i, 1)
If BlattNameZeichen = "[" Or BlattNameZeichen = "]" Or BlattNameZeichen = "/" _
Or BlattNameZeichen = "\" Or BlattNameZeichen = ">" Or BlattNameZeichen = ":" _
Or BlattNameZeichen = "*" Then
BlattName = Left(BlattName, i - 1) & "-" & Right(BlattName, Len(BlattName) - i)
End If
Next 'i
Debug.Print BlattName
BlattName_abfragen = BlattName
End Function

Ein ganz großes Dankeschön für die große Mühe. Bei mir läuft es aktuell.
Grüße Micha

Anzeige
AW: Erratum
03.03.2021 14:35:35
Yal
Hallo Michael,
da BlattName als Parameter übergeben wird, sollte es nicht innerhalb der Funktion durch der Name der ActiveSheet ersetzt werden. Es ist eine potentielle Fehlerquelle.
Ich schlage folgende Code-Optimierung vor. Da es nicht mehr nur um Abfragen geht, habe ich die Funktionsname in BlattName_korrigieren angepasst.
Private Function BlattName_korrigieren(ByVal BlattName) As String
'Auslesen des Tabellenblattnames, prüfen auf Sonderzeichen und Übernahme als Variable BlattName
Dim i As Integer
Const ListeVerbotenen = "[]/\>: debug.print blattname die unerlaubtes zeichen entfernt for i="i" to len mid next blattname_abfragen="Trim(BlattName)" end function>
VG
Yal

Anzeige
AW: Erratum
03.03.2021 15:17:22
Michael
Hallo Yal,
er wirft mir bei deinem Code
BlattName = Replace(BlattName, Mid(ListeVerbotenen, i, 1), "-")

folgenden Fehler raus:
Fehler Br. 5 "ungültiger Prozeduraufruf oder ungültiges Argument"
habe mir direkt vor der Code-Zeile die Variable
BlattName
ListeVerbotenen

im Direktbereich ausgeben lassen
"00->10"
[]/\>:>
Ich würde auf den Bereich Mid beim Fehler tippen, habe aber bei google aktuell nicht gefunden, woran genau es liegt.
Trotzdem danke für deinen Tipp.
Grüße Micha

Anzeige
AW: Erratum
03.03.2021 17:35:18
Yal
Hallo Micheal,
lege den Cursor auf Mid und drücke Strg+F1, dann kommst Du auf die MS-Online Hilfe für Mid (na ja, ein bischen nach unten Scrollen, dann Mid funKtion anklicken)
Alternativ drückst Du F2 (="Ansicht", "Objekt-Katalog") und gibst mid in der Such-Schlitz.
Aber der Fehler liegt bei
For i = i To Len(ListeVerbotenen)
Warum das so falsch ist und wie es richtig sein soll, lasse ich dich selber entdecken ;-)
Und Frage Nummer 2: warum kommt daraus Fehler Nr. 5 "ungültiger Prozeduraufruf oder ungültiges Argument"?
Viel Erfolg beim gut werden
Yal

Anzeige
AW: Application.FileDialog(msoFileDialogSave
01.03.2021 09:33:41
Michael
Hallo Zusammen,
ich habe heute Morgen erst gemerkt, dass die Mails aus dem Forum in meinen SPAM Ordner gelaufen sind. Hatte deshalb noch gar nicht ins Forum geschaut.
Vielen herzlichen Dank für die Tipps und eure Mühen. Ich werde die Vorschläge die Woche über ausprobieren und gebe dann natürlich eine Rückmeldung.
Bis dahin nochmals vielen Dank.
Grüße Micha

284 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige