Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
788to792
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
788to792
788to792
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Datei speichen - Name vorgeben

Datei speichen - Name vorgeben
15.08.2006 11:50:22
mtremer
Moin,
ich würde gerne mit einem CommandButton die Exceldatei speichern.
Problem1: der Name soll mit dem Wert der Zelle A1 vorgegeben werden.
Problem2: der Speicherort ist mit dem Anfangsbuchstaben der Dateinamens variabel...
Gibt es hierzu eine Lösung?
Danke.
Viele Grüße
Marco

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei speichen - Name vorgeben
15.08.2006 20:52:08
ingUR
Hallo, Marco,
sofern nicht bereits der Anfangsbuchtabe das zu wählende Unterverteichnis Verzeichnis beschreibt (z.B C:\temp\Verwaltung\G_ExcelArbeitsmappen\ ) dann bietet sich die Select-Anwiesung an:

Sub CommandButton1_Click()
Dim strFName As String, strRootPath As String, strPathName As String
strRootPath = "C:\xxxxxxx\" ' xxxxxx durch gleichbleibenden Vorspann des Path ersetzen
strFName = Worksheet("Tabelle1").Range("A1")
Select Case Left(UCase(strFName), 1)
Case "A": strPathName = "Verz1"
Case "B": strPathName = "Verz2"
Case Else
MsgBox "Unzulässiger Kennbuchstabe, Datei wird nicht gesichert"
Exit Sub
End Select
strFName = strRootPath + strPathName + "\" + strFName
... speicherroutine mit Sicherheits- und/oder Fehlerbehandlung
End Sub

Konnte Dir damit geholfen werden, oder ist ews etwas anderes was Du wissen wolltest?
Gruß,
Uwe
Anzeige
AW: Datei speichen - Name vorgeben
16.08.2006 09:21:53
mtremer
Hallo Uwe,
das Ding ist, dass ich kaum Ahnung von VBA habe.
Lass uns bitte erstmal auf den Dateinamen beschränken:
Excel soll den Namen aus A1 holen, das Dialogfeld "speichern unter" öffnen und den Namen mit .xls vorbereiten.
Wenn ich das verstanden habe, dann soll Excel auch den Speicherort im besagten Dialogfeld vorschlagen.
Danke für Deine Geduld.
Viele Grüße
Marco
AW: Datei speichen - Name vorgeben
16.08.2006 11:23:22
ingUR
Hallo, Marco,
Argumente zum Aufruf Application.Dialogs(xlDialogSaveAs).Show sind (aus Hilfe kopiert): document_text, type_num, prot_pwd, backup, write_res_pwd, read_only_rec
Hier ist als erstes das Argument document_text von Interesse, wenn es bereits den vollständigen Pfadnamen enthält.
Das Beispiel erfordert das Verzeichnis temp im Laufwerk C:. Dort sind die Verzeichnisse Verz1 und Verz2 angelegt werden.
Wir nun ein Dateiname in Adresse A1 eingegeben, der mit B anfängt, so wird das Verzeichnis C:\temp\Verz1 angesteuert.
Von mir unausgeprobt ergänzt:

Sub CommandButton1_Click()
Dim strFName As String, strRootPath As String, strPathName As String
strRootPath = "C:\TEMP\" ' TEMP ggf. durch gleichbleibenden Vorspann des Path
' ersetzen, unter denen sich die Unterverzeichnisse
' Verz1 und Verz2 befinden.
strFName = Worksheet("Tabelle1").Range("A1")
Select Case Left(UCase(strFName), 1)
Case "A": strPathName = "Verz1"
Case "B": strPathName = "Verz2"
Case "C": strPathName = "Verz3"
Case Else
MsgBox "Unzulässiger Kennbuchstabe, Datei wird nicht gesichert"
Exit Sub
End Select
strFName = strRootPath + strPathName + "\" + strFName
Application.Dialogs(xlDialogSaveAs).Show (strFName)
End Sub

Soweit zur ersten Erweiterung und Ergänzung.
Gruß,
Uwe
Anzeige
AW: Datei speichen - Name vorgeben
16.08.2006 11:34:40
mtremer
Hallo Uwe,
leider kommt eine Fehlermeldung:
"Fehler beim Kompilieren: Sub oder Function nicht definiert"
Zusätzlich markiert er Worksheet bei strFName = Worksheet("Tabelle1").Range("A1")
Was nun?
Viele Grüße
Marco
AW: Datei speichen - Name vorgeben
16.08.2006 11:58:52
ingUR
Hallo, Marco,
da fehlt das englische Plural-'s', denn es wir das Worksheet aus der Liste der Worksheets der Mappe ausgewählt.
strFName = Worksheets("Tabelle1").Range("A1")
Gruß,
Uwe
AW: Datei speichen - Name vorgeben
16.08.2006 12:08:10
mtremer
Hallo Uwe,
hm, den Dateinamen bereitet er zwar vor und führt die Prüfung des ersten Buchstabens aus, jedoch wählt er den angegebenen Ordner nicht aus.
Woran liegt das?
Viele Grüße
Marco
Anzeige
AW: Datei speichen - Name vorgeben
16.08.2006 14:19:49
ingUR
Am didaktisch gewähltem Aufbau, Marco! ;)
Ja, der Standarddialog aus der Auswahl der Application.Dialgos verarbeitet nur den Filename mit dem aktuellem Verzeichnis.
Ich werde erst morgen dazu kommen, die Angelegenheit weiter aufzubauen.
Doch es stellt sich die Frage, warum in den Dialog, wenn eh der volle Pfad- und Dateiname feststeht?
ActiveWorkbook.SaveAs strFName, der anstelle von Applicat...).Show ... gesetzt wird, sollte doch ebenso, nur im verdeckten, die Aufgabe erledigen können, oder?
Gruß,
Uwe
AW: Datei speichen - Name vorgeben
17.08.2006 09:30:59
ingUR
Hallo, Marco,
schon in meinem ersten Antwortbeitrag auf Deine Eröffnunsfrage, deutete ich an, indem ich den "Platzhalter "Speicherroutine..." im Programmcode benutzte, dass mehrere Vorgehensweisen zur Verwaltung von Verzeichnissen und Dateien in VBA-Codes gibt.
Der Weg über den Standarddialog-Nummer xlDialogSaveAs der Application-Dialogliste führt bei der Vorbelegung zu den festgestellten Schwierigkeiten, da der Dialog nicht das in Übergabeparameter enthaltene Verzeichnis mit der Show-Methode öffnet.
Daran ändert auch nichts der Einsatz der VB-Befehle ChDrive "E" (wechselt z.B. zum Laufwerk E) und ChDir "C:\temp\verz2" (wechselt zum angegeben Verzeichnis) die man vor der Eröffnung einsetzt, obwohl dieses Vorgehensweise in der Literatur und im Internet beschreiben wird.
Also gilt es eine andere Möglichkeit zu nutzen und da bietet sich, will man nicht mit einem FileSystemObject arbeiten, die Workbook-eigene Speicherfunktion SaveAs einzuseten. Diese alledings eröffne kein Dialog, so dass dieser zuvor über die Applications-Methode GetSaveAs ausgeführt werdden muß. Im Gegensatz zum Standarddialog xlDialogSaveAs, der das Speichern bei Bestätigung sofort erledigt, liefert die GetSaveAs-Methode nur die gewählten Parameter an den aufrufer zurück ohne dass der Speichervorgang ausgeführt wird.
Die Enscheidung, was mit diesem Rückabewert geschieht, erfolgt dan in der weiteren Programmroutine, wo das Ereignis Abbruch mit dem Rückgabestring "Falsch" beantwortet wird, womit die Prozedur sprachabhängig wird.
Vor dem Einsatz der GetSaveAs-Methode sind jedoch die Verzeichnisse einzustellen.
Soll die Verzeichnisswahl nicht im Dialog erfolgen, dann ist nun festzustellen, ob der gewählte Pfad existiert.

If Dir(strPathName, vbDirectory) = "" Then
Der VB-Dir-Befehl liefert bei gültigem Pfadname (1.Parameter) diesen wieder zurück, wenn er als Pfad (2. Parameterwert:= vbDirectory) geöffent werden kann. Wird ein Leer-String zurückgefoefert ist, nach positiven Enscheid der Vergehensabfrage beim Benutzer, der Pfad mit dem VB-Befehl MkDir(strPathName) anzulegen, andernfalls ist die Routine zu beenden.
Wird die Sub-Proczdur fortgesetzt, werden nun in den nächsten beiden Programmzeilen der aktuelle Pfadname und der daraus ermittelbare aktuelle Laufwerksbuchstabe zwischengespeichert, um nach Abschluß des Speicherblocks die vorgefundene Einstellung wieder herzustellen.
Anschliessend wird auf das gewählte Laufwerk und dort in den gewählten Pfad gewechselt.
Da die folgende Woorkbook-Methode GetSaveAs, wie oben bereits erwähnt nur einen Rückgabe wert liefert, ohne eigentlich zu Speichen, muß das in die Stringvariabel strReturnPathFName zurückgelieferte Ereignis ausgewertet werden.
Die nachfolgende Fehelrbehandlungsoption dient dazu, dass bei Abbruch des Speichervorganges (z.B. Meldung: "Datei existiert bereits, soll sie überschrieben werden?" Antwort "nein" oder "Abbruch", daraus folgt Fehlernummer, die in mit der Eigenschaftsabfrage Err.Number ermittelt wird) bei der nächsten Programmzeile, die die Fehlernummer auswertet, fortgefahren wird.
Abschließen werden die bei Eintrit in die Speicherroutine vorgefundenen Laufwer- und Pfadeinstellungen wiederhergestellt.
Das ganze als Programmcode:

Option Explicit
Private Sub CommandButton1_Click()
Dim strFName As String, strRootPath As String, strPathName As String
strRootPath = "C:\TEMP\" ' TEMP ggf. durch gleichbleibenden Vorspann des Path
' ersetzen, unter denen sich die Unterverzeichnisse
' Verz1 und Verz2 befinden.
strFName = Worksheets("Tabelle1").Range("A1")
Select Case Left(UCase(strFName), 1)
Case "A": strPathName = "Verz1"
Case "B": strPathName = "Verz2"
Case "C": strPathName = "Verz3"
Case "D": strPathName = "Verz4"
Case "E": strPathName = "Verz5"
Case Else
MsgBox "Unzulässiger Kennbuchstabe, Datei wird nicht gesichert"
Exit Sub
End Select
strPathName = strRootPath + strPathName + "\"
Dim OldDir As String, OldDrive As String
Dim strReturnPathFName As String, strMsg As String, antw As VbMsgBoxStyle
If Dir(strPathName, vbDirectory) = "" Then
strMsg = "Verzeichnis " & vbLf & _
strPathName & vbLf & _
"nicht vorhanden" & vbLf & _
"Soll es angelegt werden?"
antw = MsgBox(strMsg, vbYesNo + vbDefaultButton1, "Verzeichnisverwaltung")
If antw Then
MkDir (strPathName)
Else
Exit Sub
End If
End If
OldDir = CurDir
OldDrive = Left(OldDir, 1)
ChDrive (strPathName)
ChDir strPathName
strReturnPathFName = Application.GetSaveAsFilename(strFName, "Excel-File (*.xls), *.xls", , "MySave")
If Not (strReturnPathFName = "Falsch") Then
On Error Resume Next
ActiveWorkbook.SaveAs (strReturnPathFName)
If Err.Number <> 0 Then
strMsg = "Speichern von" & vbLf & _
strPathName & strFName & vbLf & _
"ist fehlgeschlagen oder wurde abgebrochen!"
MsgBox strMsg
End If
End If
ChDrive (OldDrive)
ChDir (OldDir)
End Sub
Die Auswahl der Verzeichnisse im vorgesteltem Programmcode, die ja nach dem Anfangsbuchstaben des Dateinamens über die Selectschleife erfolgt, kann in dem vorgestellten Fall auch einfacher gestalltet werden, da sich der Unterverzeichnisname Verz+Ordnungszahl auch berechnen läßt, da der Buchstabe A durch den Zahlcode 65 dargestellt wird:

VNr = Asc(Left(UCase(strFName), 1))-64 'Bei A=1, B=2,C=3....
strPathName=""
if VNr > 0 and VNr < 27 then strPathName="Verz" & VNr
if len(strPathName)=0 then ... Hinweis-/Ausstiegsroutine wie unter "Case Else"
Möglicherweise ergibt sich bei Dir eine ähnliche Formelmäßigkeit der Verzeichnisnamenbildung, die dann an Stelle des "Select Case"-Blocks treten könnte.
Gruß,
Uwe
Anzeige
AW: Datei speichen - Name vorgeben
17.08.2006 11:08:57
mtremer
Hallo Uwe,
Meine Güte, Du hast Dir richtig Zeit genommen.
Klasse.
Bisher hatte ich keine Ahnung von VBA. Mit Deinen Informationen jedoch habe ich begonnen, VBA zu verstehen. Also ein grosser Schritt für mich...
Den Code habe ich nur noch auf meine Verzeichnisse abgestimmt und "auf meine Datei losgelassen".
Und siehe da: es klappt!
Lieber Uwe, ich danke Dir.
Viele Grüße
Marco
AW: Datei speichen - Name vorgeben
17.08.2006 11:58:46
mtremer
Hallo Uwe,
eine Frage hierzu habe ich doch noch.
Meine Ursprungsdatei ist mit einem Schreibschutz versehen, damit diese niemand überspeichert.
Nachdem die Datei bearbeitet wurde wird diese mit Deinem Code gespeichert.
Leider übernimmt er auch den Schreibschutz, sodass die Datei nicht weiter überarbeitet werden kann.
Wie kann ich den Schreibschutz aufheben?
Viele Grüße
Marco
Anzeige
AW: Datei speichen - Name vorgeben
17.08.2006 17:02:20
ingUR
Hallo, Marco,
erst einmal freut es mich, dass Du den Einstieg in VBA gut gemeistert hast, was rückwirkend auch Ansprorn ist, für weitere Erläuterungen.
Sinn macht die ganze Aktion in der Tat nur, wenn das CommondButton-Ereignis CommondButton1_Click auf eine Datei angewendet wird, die nicht schreibgeschützt ist, also im ReadWrite-Modus bearbeit wird.
Daher wir in die Private Sub-Prozedur als erste ausführbare Anweisung die Prüfung eingebaut, die ermittelt, ob diese Arbeitsmappe (ThisWorkbook) den File-Modus-Eigenschaftswert xlReadOnly oder xlReadWrite besitzt. Den ensprechenden Programmcode kann man nun in dei vorliegende Worksheet-Sub-Prozedur einbinden.
Jedoch eignet sich diese Teil-Prozedur auch für eine separate Modul-Function-Prozedur, der z.B. der Name FileIsReadOnly frei zugeteilt wird.
Auf Modul-Ebene wird also eine Funktion aufgebaut:

Function FileIsReadOnly() As Boolean
End Function

FileIsReadOnly ist also der Funktionsname und gleichzeitg eine ("Return")Variable vom Datentyp Boolean, deren Inhalt der diese funktionaufrufenden Programmstelle zurückgeliefert wird. Wie dieser Wert innerhalb der Funktion ermittelt und gesetzt wird bleibt allein Sache des Programmcodes innerlb der Funktion. Eine Funktion mit Rückgabewert ist also quasi eine "intelligente" Variable.

Function FileIsReadOnly() As Boolean
FileIsReadOnly = ThisWorkbook.ReadOnly
End Function
Mit diesem Funktionskörper FileIsReadOnly = ThisWorkbook.ReadOnly wird also dem Rückgabewert der Funktionsvariablen - immer gleich dem Namen der Funktion, sie Erläuterung zur Erklärung Funktionsname = Variablenname - der Wert übergeben, der für die Eigenschft ThisWorkbook.ReadOnly gesetzt ist.
Da keine weiteren Befehl in der Funktion durchgeführt werden, wird an die funktionsaufrufende Stelle mit dem Wert von FileIsReadOnly (hier vom Typ Boolean) zurückgesprungen.
Der entscheidene Wirkungsunterschied zwischen Sub- und Function-Prozeduren in VB(A):
Der Aufruf selber wird hier und nur jetzt durch den Funktions-Rückabewert ersetzt(!)
Da die Abfrage vor der eigentlichen Auswertung des Dateinamens und der Pfadbildung sinnvol ist, wird die aufrufende Stelle als erste ausführbare Anweisung plaziert:

Private Sub CommandButton1_Click()
Dim strFName As String, strRootPath As String, strPathName As String
'Prüfen ob schreibgeschützte Datei vorliegt und darauf reagieren
If FileIsReadOnly Then Exit Sub
Mit diesen Erweiterungen (Einbindung der aufrufende Stelle und Modul-Function) ist das Programm wieder Lauffähig. In der If-Abfrage wird hier der Funktionsaufruf durch den Function-Name ausgelöst.
An dieser Stelle wird nach dem Abarbeiten der Funktions-Befehle der Rückgabewert stehen, der bis hierher in der Function-Variablen herübergerettet wurde. Der Wert (Funktiontyp deklariert durch Function FuncName(...) as Boolean) ist also "True" oder "false", genau das Ergebnis, was eine Bedingunsabfrage liefern soll.
Ist dei Bedingung "true", dann braucht das Programm nicht weiter abgearbeitet zu werden, da das Überschreiben der Datei auf dem Speichermedium wegen des Vorhandenseins eines Schreibschutzes eh nicht ausgeführt wird, andernfalls, die Bedingung liefert "flase", wird läuft das Programm zu bildung und setzung des Datei- und Pfadnamens ab um mit der Speicherprozedur zu schließen.
Nun wird klar, das in der Function ein Befehl zu setzen ist, der eine ReadOnly-Dateieigenschaft in eine ReadWrite-Eigenschaft wandelt und dann als Rückgavbewert den Wert "false" liefert um eben nichtdie If-Bedingung als "true" zu werrten und dann aus der Sub-Prozedur auszusteigen. Also die Function FileIsReadOnly mit "Intelligenz" gefüllt, damit die entsprechenden Werte nach den Wünschen des Anwenders gesetzt werden können:

Function FileIsReadOnly() As Boolean
Dim msg As String, antw As VbMsgBoxResult
With ThisWorkbook
FileIsReadOnly = .ReadOnly
If FileIsReadOnly Then
msg = "Diese Datei, " & .Name & ", ist" & vbLf & _
"schreibgeschütz!" & vbLf & _
"Soll der Schreibschutz aufgehoben werden?"
antw = MsgBox(msg, vbYesNo, "Schreibschutz entfernen?")
If antw = vbYes Then
.ChangeFileAcess Mode:=xlReadWrite
FileIsReadOnly = False
End If
End If
End With
End Function
Als erstes fällt wohl auf, dass ein With-Block (With .... End With) den Ausführungscode umklammert. Diese Klammer ermöglich es, die mit dem Punkt eingeleiteten Objekte/Methoden/Eigenschaften genau auf das Objekt zu beziehen, das hinter dem With steht.
Es bedeutet also innerhalb des Gültigkeitsbereiches des With-Blocks, .ReadOnly genau das gleiche wie ThisWorkbook.ReadOnly, so wie .Worksheets("Tabelle1") das Arbeitblatt (WorkSheet oder Sheet) mit dem Namen "Tabelle1" aus der Liste der Arbeitsblätter (WorkSheets) direkt benennt.
Der nächste Befehl wurde bereits besprochen, er lifert die Mode-Eigenschaft des Schreibschutzes dieser Arbeitsmappe und schreibt sie in den Funktionsrückgabewert ( = Funktionsname ).
Die Variable, vom Typ Boolean, ist also bereits durch die Function selbst deklariert und gestattet so keine erneute Dim-Anweisung für diesen Namen!
Ist die Eigenschaft .ReadOnly "true", dann soll die Information über diesen Zustand mitgeteilt werden, und es wird gleichzeitig die weitere Vorgehenswese abgefragt.
Wird der Schreibschutz aufgehoben (Antwort: Ja :: [ThisWorkbook].ChangeFileAcess Mode:=xlReadWrite), ist auch gleichzeitig der Funktionsrückgabewert auf "false" entsprechend der vorgegebenen Programmlogik zu setzen.
Das Funktionsprogramm wird verlassen und der Funktionsrückgabewert tritt an die Stelle des Aufrufs, mit den entsprechenden Auswirkungen auf den weiteren Programmverlauf.
Soviel als Einstieg in den Prozedurtyp Function, der hier noch, da nicht anders erforderlich, ohne Übergabeparameter innerhalb des Klammerpaares in der Einleitungszeile der Funktion eingestzt wird.
Viel Erfolg beim Umsetzen. Doch vermutlich ist die nächste Frage vorprogrammiert und lauert bereit: wie kann die gespeicherte Datei wieder für das Betriebssystem als schreibgeschützt markiert werden?
Gruß,
Uwe
Anzeige
AW: Datei speichen - Name vorgeben
18.08.2006 12:46:33
mtremer
Hallo Uwe,
ich bin immer wieder begeistert.
So gut wied Deine Antwort geschrieben ist, es funktioniert leider nicht.
Ich habe nun mehrere Versuche gestartet, Deinen Code in den bestehenden einzuarbeiten.
Meine Frage ist also: an welche Stelle genau füge ich die Funktion ein?
Ich brauch eigentlich auch keine Abfrage, ob der Schreibschutz herausgenommen werden kann. Da der Schreibschutz ja nur bei der zu speichernden Datei gelöscht wird, bleibt dieser in der Ursprungsdatei noch erhalten, oder?
Viele Grüße
Marco
AW: Datei speichen - Name vorgeben
18.08.2006 21:15:55
ingUR
Hallo, Marco,
schade, dass es auf diesem Weg diesmal nicht erfolgreich war, den nächsten Erweiterungsschritt in das Programm zu implimentieren.
Jedoch ist dazu zusagen, dass hier nur ein "Erkenntnisgewinn" zu erwarten war, nämlich der, dass "schreibgeschützt" nicht gleich "schreibgeschützt" ist, denn es ist zu unterscheiden zwischen
  1. dem Aufruf einer schreibgeschützen oder in einem erneuten Aufruf einer in einer weiteren (EXCEL-)Applikation bereits geöffneten Datei, die EXCEL in jedem Fall als [Schreibgeschützt] geöffnet wurde, und
  2. dem Dateien-Schreibshutz auf Dateisystemebene, wie er über die Eigenschaft einer Datei im Dateiexplorer gesetzt bzw. erfahren werden kann.
Programmteschnisch wird der Unterschied in den beiden Befehlsgruppen
  1. ThisWorkbook.ReadOnly / ThisWorkbook.ChangeFileAccess, der Eigenschaft und der Methode zum Setzen der Eigenschaft und
  2. GetAttr / SetAttr, als Funktionen zum Abfragen und Setzen
erkennbar.
Beide Eigenschaften werden unabhängig voneineander zu verwalten und zu bearbeiten sein.
An dieser Stelle wird es allerding von Bedeutung werden, die Arbeitsablauf Deiner Anwendung besonders zu berücksichtigen, denn es gibt nun verschiedenen Scenarien (Abk.: (RO+):=Dateisystemschreibschutz an, (RO-):=Dateisystemschreibschutz aus):
  • 1.1. @muster.xls (RO+) laden :: bearbeiten :: Dmappe.xls speichern
  • 1.2. @muster.xls (RO+) laden :: bearbeiten :: Dmappe.xls speichern :: (RO+) setzen
  • 2.1. Dmappe.xls (RO-) laden :: bearbeiten :: Dmappe.xls speichern
  • 2.2. Dmappe.xls (RO+) laden :: bearbeiten :: Dmappe.xls speichern :: (RO+) setzen
    Eine auf Dateisytemebene mit einem Schreibschutz versehene xls-Datei, wird von der Excel-Instanz mit der Eigenschaft [Schreibschutz] geöffnet. Änderungen in den Tabellen der so als geschützt gekennzeichneten Arbeitsmappe können vorgenommen werden.
    Ein Speichern unter dem gleichen Dateinamen wird verhindert, jedoch kann die Datei unter einem neuen Namen abgespeichert werden. Somit werden in allen Abkömmlingen einer solchen Arbeitsmappe, jeweils der vollständige Programmcode mit gespeichert. Es wäre also zu überlegen, ab man einen Menüpunkt entwickelt, der die Mustermappe als Vorlage bereitstellt und die Spaeichervorgänge verwaltet.
    Hier jedoch erst einmal der veränderte Programmcode für die Bearbeitung der Fälle 1.2. und 2.2.
    
    Option Explicit
    Private Sub CommandButton1_Click()
    Dim strFName As String, strRootPath As String, strPathName As String
    strRootPath = "C:\TEMP\" ' TEMP ggf. durch gleichbleibenden Vorspann des Path
    ' ersetzen, unter denen sich die Unterverzeichnisse
    ' Verz1 und Verz2 befinden.
    strFName = Worksheets("Tabelle1").Range("A1")
    Select Case Left(UCase(strFName), 1)
    Case "A": strPathName = "Verz1"
    Case "B": strPathName = "Verz2"
    Case "C": strPathName = "Verz3"
    Case "D": strPathName = "Verz4"
    Case "E": strPathName = "Verz5"
    Case Else
    MsgBox "Unzulässiger Kennbuchstabe, Datei wird nicht gesichert"
    Exit Sub
    End Select
    strPathName = strRootPath + strPathName + "\"
    Dim OldDir As String, OldDrive As String
    Dim strReturnPathFName As String, strMsg As String, antw As VbMsgBoxStyle
    Dim OldMode As Boolean, OldAttr As Integer
    If Dir(strPathName, vbDirectory) = "" Then
    strMsg = "Verzeichnis " & vbLf & _
    strPathName & vbLf & _
    "nicht vorhanden" & vbLf & _
    "Soll es angelegt werden?"
    antw = MsgBox(strMsg, vbYesNo + vbDefaultButton1, "Verzeichnisverwaltung")
    If antw Then
    MkDir (strPathName)
    Else
    Exit Sub
    End If
    End If
    OldDir = CurDir
    OldDrive = Left(OldDir, 1)
    ChDrive (strPathName)
    ChDir strPathName
    strReturnPathFName = Application.GetSaveAsFilename(strFName, "Excel-File (*.xls), *.xls", , "MySave")
    If Not (strReturnPathFName = "Falsch") Then
    'merke Zustandeinstellung des Schreibschutzes der Datei strReturnPathName(!),
    'sofern diese vorhanden ist, und der aktiven Arbeitsmappe
    OldMode = ThisWorkbook.ReadOnly
    On Error Resume Next
    OldAttr = GetAttr(strReturnPathFName)
    On Error Resume Next
    SetAttr strReturnPathFName, GetAttr(strReturnPathFName) - vbReadOnly
    ThisWorkbook.ChangeFileAccess Mode:=xlReadWrite
    On Error Resume Next
    ActiveWorkbook.SaveAs (strReturnPathFName) 'strPathName & strFName)
    If Err.Number <> 0 Then
    strMsg = "Speichern von" & vbLf & _
    strPathName & strFName & vbLf & _
    "ist fehlgeschlagen oder wurde abgebrochen!"
    MsgBox strMsg
    Else
    'Falle 1.1 und 2.1
    'setzt Attr. der gespeicherten Datei und
    'der Arbeitsmappe auf Stand vor dem Speichern zurück
    'SetAttr strReturnPathFName, OldAttr
    'ThisWorkbook.ChangeFileAccess Mode:=OldMode
    'Fälle 2.1. und 2.2.
    'setzt Attr. der gespeicherten Datei und
    'der Arbeitsmappe auf [Schreibgeschützt]
    On Error Resume Next
    SetAttr strReturnPathFName, GetAttr(strReturnPathFName) + vbReadOnly
    ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly
    End If
    End If
    ChDrive (OldDrive)
    ChDir (OldDir)
    End Sub
    
    Die Anweisungen On Error Resume Next bewirken, dass wenn die Dateioperationen fehlgeschlagen sind (z.B. weil eine Datei noch nicht vorhanden ist, oder aber weil eine Abruchtaste betätigt wurde, mit der nächsten Anweiung fortgefahren wird, ohne den Fehler zu verkünden und die Debuggueranwahl anzufordern.
    Nun hoffe ich, dass Du diese Ergänzungen - frei von der Funktion aus meinen vorherigen Erläuterungen - im Sinne Deines Projektes einsetzen kannst.
    Gruß,
    Uwe
  • Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige