Autor
|
Thema: Files in ein Verz kopieren (Fehler wenn Verz. vorhanden) (991 mal gelesen)
|
thewolff Mitglied
Beiträge: 140 Registriert: 03.06.2003
|
erstellt am: 30. Nov. 2009 20:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, habe nachstehenden Code um ein Verzeichnis im Datumsformat zu erstellen und anschl. werden dort alle Files hineinverschoben. Das funktioniert ganz gut solange das Zielverz. nicht existiert. -------------------------------------------------------------- Dim OName$ VZ01 = "C:\Kunden\Anfragen\" bName = Format(Date, "yyyymmdd") MkDir VZ01 & bName Dim objFSO2 As Object, objFile As Object Set objFSO2 = CreateObject("Scripting.FileSystemObject") For Each objFile In objFSO2.GetFolder(VZ01).Files objFile.Move VZ01 & bName & "\" Next -------------------------------------------------------------- Wie muss ich den Code abändern damit mein Makro nicht abbricht wenn das Verz. bereits vorhanden ist?
------------------ Gruß Marco Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 30. Nov. 2009 20:43 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Hallo Marco, habs nicht 1:1 probiert und deswegen die Hochkommas, aber das Prinzip sollte rüberkommen: Code:
Sub y() Dim objFSO2 As Object, objFile As Object Set objFSO2 = CreateObject("Scripting.FileSystemObject") If Not objFSO2.folderexists("d:\cad\1") Then Debug.Print "nö, gibts nich" 'MkDir VZ01 & bName Else Debug.Print "mich gibts bereits" ' For Each objFile In objFSO2.GetFolder(VZ01).Files ' objFile.Move VZ01 & bName & "\" ' Next End If End Sub
HTH Nancy [trekkedi: Eigentlich brauchst du nur die IF-Abfrage, ohne then-else. In obigen Code legt er zwar ein Verzeichnis an, kopiert wird aber erst ab else. Blödes Beispiel gewählt. Also kurz so:
Code:
if not folderexists then mkdir folder
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thewolff Mitglied
Beiträge: 140 Registriert: 03.06.2003
|
erstellt am: 30. Nov. 2009 21:03 <-- editieren / zitieren --> Unities abgeben:
Hallo Nancy, sorry, aber wenn ich das so einfüge, dann klappt es nicht. Ich habe auch zu wenig Wissen in VBA um da einen Fehler zu erkennen. Fehlermeldung: Fehler beim Kompilieren Else ohne If ------------------ Gruß Marco Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 30. Nov. 2009 22:13 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Nun wäre es u.U. wichtig zu sehen wie dein eingefügter Text aussieht... ansonsten bleibt nur Rätselraten... Unter der Vorraussetzung das <C:\Kunden\Anfragen\> 'im Quelltext hart verdrahtet' immer gleich bleibt und das MkDir immer nur ein Verzeichnis aufbauen kann und nicht eine Teil-Struktur -think i so... Ungeprüft meine Zusammenschnippelung .debug.print habe ich mal in msgbox geändert, falls man das Direktfenster nicht kennt.
Code: Sub yy() Dim OName$ VZ01 = "C:\Kunden\Anfragen\" bname = Format(Date, "yyyymmdd") 'MkDir VZ01 & bname Dim objFSO2 As Object, objFile As Object Set objFSO2 = CreateObject("Scripting.FileSystemObject") If Not objFSO2.folderexists(VZ01 & bname) Then MsgBox "nö, gibts nich" ChDir VZ01 MkDir bname Else MsgBox "atschebärschegäbele "& VZ01 & bname & " mich gibts bereits" End If For Each objFile In objFSO2.GetFolder(VZ01).Files objFile.Move VZ01 & bname & "\" Next End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 30. Nov. 2009 22:28 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Hallo Marco, Else ohne IF: If-Then geht als Einzeiler durch, ohne Else und End If
Code:
if 1<2 then debug.print "ja"
Sobald ein Zweizeiler draus wird, ist End If oder else oder je nachdem gefordert
Code:
if 1<2 then debug.print "ja" msgbox "noch mehr Anweisungen?" else msgbox "Else kommt" end if
Irgendwo ist also deine IF-Abfrage nicht korrekt.Aber hier nochmal getestet, musst aber die Pfade noch anpassen:
Code:
Sub y() Dim objFSO2 As Object, objFile As Object Set objFSO2 = CreateObject("Scripting.FileSystemObject") If Not objFSO2.folderexists("d:\test\1\") Then MkDir "d:\test\1\" For Each objFile In objFSO2.GetFolder("d:\test\").Files objFile.Move "d:\test\1\" Next End Sub
HTH Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thewolff Mitglied
Beiträge: 140 Registriert: 03.06.2003
|
erstellt am: 01. Dez. 2009 07:29 <-- editieren / zitieren --> Unities abgeben:
Moin Excel-Profis, hier meine kompletten Infos aus dem "Makro" Private Sub CommandButton1_Click() CommandButton1.Visible = False VZ00 = "C:\Daten\Dummy\" VZ01 = "C:\Kunden\Anfragen\" Sheets("Testblatt1").Select Columns("I:K").Select Selection.EntireColumn.Hidden = True Columns("Q:W").Select Selection.Delete Shift:=xlToLeft Range("L3:L7").Select Application.CutCopyMode = False Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("D1:E1").Select Application.CutCopyMode = False Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.DisplayAlerts = False Sheets("P").Select ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True If Worksheets("Testblatt1").Range("L1").Value = "" Then Worksheets("Testblatt1").Range("L1").Value = "=NOW()" End If Dim OName$ bName = Format(Date, "yyyymmdd") MkDir VZ01 & bName Sheets("Testblatt1").Select Range("N1").Select ActiveCell.FormulaR1C1 = "Info !" Range("N2").Select Dim dName$ eName = "tw_" & Format(Date, "yyyymmdd") & ".XLS" dName = "C:\Kunden\Anfragen\" & bName & "\" & _ eName ActiveWorkbook.SaveAs dName End Sub Ich stehe im Verz. C:\Kunden\Anfragen und starte meine Exceldatei, anschl. Trage ich die aktuellen Werte ein. Wenn alles eingetragen starte ich das "Makro" und möchte diese Datei im Ordner C:\Kunden\Anfragen\"AKTUELLES-DATUM-IM-FORMAT-YYYYMMDD" speichern. Das funktioniert auch so mit dem Makro solange ich es nur einmal am Tag ausführ. Wenn es das zweite Mal gestartet wird kommt eine Fehlermeldung und in VBA wird die Zeile: MkDir VZ01 & bName hervorgehoben. Wenn ich eure Vorschläge eingebracht habe, habe ich es trotzdem nicht hinbekommen. Es kann sein das der Fehler auch zwischen Bürostuhl und Tastatur liegt..... Könnt Ihr mir bitte nochmal einen Tipp geben wie ich diese Thematik abstellen kann? ------------------ Gruß Marco Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thömu Mitglied Konstrukteur
Beiträge: 283 Registriert: 09.04.2003 SolidWorks 09 SP3 Catia V5 R18 Pro/E WF3 Hardeware, je nach PC... Zuhause das gute alte OSM PE und OSD 15.5D als Demo
|
erstellt am: 01. Dez. 2009 08:43 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Meinst du soetwas??? Zitat: Original erstellt von thewolff:.... Dim OName$ bName = Format(Date, "yyyymmdd") If Dir(VZ01 & bName, vbDirectory) = "" then MkDir VZ01 & bName End If Sheets("Testblatt1").Select Range("N1").Select ActiveCell.FormulaR1C1 = "Info !" Range("N2").Select Dim dName$ eName = "tw_" & Format(Date, "yyyymmdd") & ".XLS" dName = "C:\Kunden\Anfragen\" & bName & "\" & _ eName ActiveWorkbook.SaveAs dName End Sub
Wenn ich den Code richtig sehe, überschreibst du dir aber eine bestehende Datei, da diese ja auch immer nach dem Datum benannt wurde -> tw_20091201.xls
Ohne die Funktion genau zu kennen, würde ich mal behaupten, da braucht es noch einen "Tages-Zähler" ;-) ------------------ mfg Thömu [Diese Nachricht wurde von Thömu am 01. Dez. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 01. Dez. 2009 14:28 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Hallo zusammen, Zitat: Das funktioniert auch so mit dem Makro solange ich es nur einmal am Tag ausführ.
Bei der ersten Ausführung wird Dein Verzeichnis via MkDir erstellt - Code: MkDir VZ01 & bName, wobei in bName das Datum enthalten ist. Beim zweiten ausführen am gleichen Tag wird erneut versucht, das gleiche Verzeichnis zu erstellen ;) . Am nächsten Tag klappt es wieder, denn - oh Wunder: Anderes Datum = anderer Verzeichnisname. So etwas klappt nicht einmal im Windows-Explorer, da kommt dann auch der Warnhinweis: "Datei (Verzeichnis) namens... ist bereits vorhanden" o. ä. Was Du tun musst - wie trekki schon mehrfach angedeutet hat: Prüfe vor dem Erstellen des Verzeichnisses, ob es vorhanden ist. Entweder, Du machst das mit dem Einzeiler von oben oder dem (geänderten) Mehrzeiler von Thömu. Code:
'1. startrek If Not objFSO2.folderexists("d:\test\1\") Then MkDir "d:\test\1\" 'nur Erstellen, falls nicht vorhanden '2. Thömu If Dir(VZ01 & bName, vbDirectory) = "" then MkDir VZ01 & bName 'via Dir, sonst gleichwertig
Fazit: Ändere Deine Zeile MkDir VZ01 & bName --> If Not objFSO2.folderexists("d:\test\1\") Then MkDir "d:\test\1\" Alles ungetestet - HTH. ------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nepumuk Mitglied Entwicklungsleiter
Beiträge: 351 Registriert: 16.10.2004
|
erstellt am: 01. Dez. 2009 21:40 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Hallo, einfach so: Code: Option ExplicitPrivate Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" ( _ ByVal DirPath As String) As Long Public Sub Test() If MakeSureDirectoryPathExists(VZ01 & bName) = 0 Then MsgBox "Fehler beim erstellen des Ordners: " & VZ01 & bName & vbLf & _ "Prüen Sie die Zugriffsrechte für das Laufwerk " & _ "und den übergeordneten Ordner.", vbCritical, "Zugriffsfehler" Exit Sub End If 'Hier gehts mit deinem Code weiter. End Sub
Der DLL ist es nämlich schnurtzpiep, ob das Verzeichnis schon besteht oder nicht. Wenn's schon da ist, macht sie nix, wenn's noch nicht da ist, wird's angelegt. Einziges Hindernis: Keine Schreibrechte im übergeordneten Verzeichnis, oder das entsprechende Netzlaufwerk ist nicht verbunden. Wenn du willst, können wir vorher auslesen, ob das Laufwerk ansprechbar und Schreibrechte vorhanden sind. Schreibrechte prüfen kann aber durch restriktive Maßnahmen des Admins verhindert werden. Dann hilft nur noch Try and Error.------------------ Gruß Nepumuk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 01. Dez. 2009 22:29 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Hallo Marco, erstmal vorweg, Frederik hat das auf den Punkt gebracht. irgendwie versuchst du da irgendwelche Codeparts in einen reinen Makrorecordercode einzubasteln. Oder ist dieser ganze Rattenschwanz an 'selects' nur zufällig entstanden? Beschränke dich erstmal auf das wesentliche, nämlich die paar Zeilen Code zu anfangs ans Laufen zu bringen. Wie prüfe ich, ob ein Ordner vorhanden ist oder nicht, wenn nicht > erstellen und dann umschaufeln und wenn nicht > gleich nur umschaufeln. Entweder mit dem Filesystemobject oder klassisch ohne FSO nur mit (Mk)Dir. Beides funktioniert unabhängig voneinander, aber dieser Einzeiler (von Paulchen) ist unerlässlich. Versuche das bitte erstmal als Standalone-Sub, ohne Recordermüll drumrum ZB (WDH von gestern) Ergänzungen von heute:
Code:
Sub y() dim vz01 as string, vz02 as string Dim objFSO2 As Object, objFile As Object vz01="string01" 'der ohne Date vz02="string02" 'der mit dem Date Set objFSO2 = CreateObject("Scripting.FileSystemObject") If Not objFSO2.folderexists(vz02) Then MkDir vz02 For Each objFile In objFSO2.GetFolder(vz01).Files objFile.Move vz02 Next End Sub
Und mache mal im VB-Editor unter Extras > Optionen nen Haken bei 'Variablendeklaration erforderlich', damit steht dann immer 'Option explicit' obendrüber, soll aber nicht stören. Hilft dem 'wüsten querbeet-einfachmalso-Dim irgendwas' vorzubeugen und du bist auf der sichereren Seite. lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 01. Dez. 2009 23:58 <-- editieren / zitieren --> Unities abgeben: Nur für thewolff
Hallo Nepumuk, par excellent wie immer :-) Mir stellt sich nur alleine die Frage, ob er das hinbekommt? Ich meine, das Reinbasteln in Recordercode scheint schon schwer zu fallen alleine nur mit dem FSO oder MkDir bzw. mit simplen If-then Abfragen gibts Probleme beim Einbinden. Keeeene Ahnung, was bei rauskommt, wenn er das mit API erschlagen soll? ;-) Aber wurschti, egal - schön dich zu lesen! Liebe Grüße, Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thewolff Mitglied
Beiträge: 140 Registriert: 03.06.2003
|
erstellt am: 02. Dez. 2009 06:50 <-- editieren / zitieren --> Unities abgeben:
Moin, moin, jetzt hab ich es verstanden. Ich habe ein "zusammengebasteltes Makro" was auch bislang funktioniert hat und dieses wollte ich um diese Option erweitern. Ich muus dann mit einigen Zeilen die neue Möglichkeit testen und nicht immer mit dem kompletten Makro alles versuchen. Ich gelobe Bessreung. Vielen Dank. ------------------ Gruß Marco Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|