Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

VBA reparieren von mehreren Datenbanken Access 2007

Begonnen von thorsten1981, Juli 29, 2013, 16:09:28

⏪ vorheriges - nächstes ⏩

thorsten1981

Hallo Leute,

(Access 2007)
ich habe hier einen Ordner mit mehreren Unterordnern. Ich will mir aus allen Unterordnern die *.mdb ziehen und diese reparieren bzw. komprimieren und reparieren.

Ich habe bereits per cmd und /repair versucht mehrere Dateien anzusprechen, doch Wildcards werden hier ebenso wie UNC-Pfade nicht akzeptiert.

Wenn ich die mdb einzeln per skript aufrufe gelingt ein Reparieren auf jeden Fall, ich will aber alle repaieren und nicht nur eine. Hat einer eine Lösung, welche nicht kostenpflichtig ist?

Danke und Grüße
Thorsten

daolix

Warum sollte auch. Wildcards in dieser Form sind Elemente für das Dateisystem und seinen Funktionen und nicht für Access, d.h du musst dafür sorgen das aus den Wildcards echte Dateinamen werden. In VB(A), was Access verwendet, gib es den Befehl dir, mit welchem du das Dateisystem auslesen kannst.

Code (Ohne Gewähr, luftcode, völlig ungetestet) [Auswählen]


Sub irgendwas()
dim sFile as string

sFile = dir$(Currentproject.path & "/myfolder/*.mdb")
do while len(sFile)
   shell  "msaccess.exe "  &  Currentproject.path & "/myfolder/" & sfile & " /repair"
   sfile = dir$
loop
End Sub

Da Shell asyncron arbeitet weis ich jetzt nicht mit wievielen Accessfenstern dein Desk jetzt zugekleistert wird, evtl mit der Anzahl der Dateien im Folder myfolder.



thorsten1981

Dankeschön, das ist schon mal ein Ansatz. Da muss ich mich wohl was in VBA einarbeiten. Das Skript nimmt er nämlich nicht so. Fehler beim Kompilieren --> Erwartet = Anweisungsende . Aber er erkennt schon irgendwie die Dateien.

Haben wir hier irgendeinen, der das Skript anpassen könnte oder mal bei sich testen könnte? Danke.

LG
Thorsten


thorsten1981

Bekomme immernoch

Erwartet Anweisungsende

Komisch. Er will das nicht so machen!

DF6GL

#5
Hallo,

in WELCHER Zeile tritt der Fehler auf?

zudem heißt der Access-Parameter nicht Repair , eher "compact" und auch die Schrägstriche (im PfadDateinamen) würde ich in "Backslash"es  ändern.

Zusätzlich, sollte der Pfad, bzw. Dateiname Leerzeichen enthalten, das Ganze noch in Gänsefüße einschliessen:

Sub irgendwas()

Dim sFile As String
sFile = Dir(Currentproject.Path  & "\myfolder\" & "*.mdb")
Do While Len(sFile)
Shell "msaccess.exe """ & Currentproject.Path &  "\myfolder\" & sFile & """  /compact"
sFile = Dir()
Loop
End Sub

thorsten1981

Danke es sieht gut aus. Jetzt die Frage wie ich das anspreche wenn ich z.B. das hier haben will:


Sub irgendwas2()

Dim sFile As String
sFile = Dir(CurrentProject.Path & "c:\temp\" & "*.mdb")
Do While Len(sFile)
Shell "msaccess.exe """ & CurrentProject.Path & "C:\temp\" & sFile & """  /compact"
sFile = Dir()
Loop
End Sub



Er hat jetzt mit dem Pfad Probleme. Ich will alle mdb Dateien des Unterordners Temp auf C: komprimieren. Dankeschön.

DF6GL

Hallo,

kannst Du diese Frage nicht selber beantworten  , nachdem Du das Problem ja schon selber ansprichst ???  :o

thorsten1981

Ja

Sub irgendwas2()

Dim sFile As String
sFile = Dir(CurrentProject.Path & "c:" & "*.mdb")
Do While Len(sFile)
Shell "msaccess.exe """ & CurrentProject.Path & "\temp\" & sFile & """  /compact"
sFile = Dir()
Loop
End Sub



Er meldet keinen Fehler. Aber er macht jetzt nix! Das müsste ich ja u.a. am "geändert am" Datum sehen. 

DF6GL

Hallo,

offensichtlich doch nicht..


sFile = Dir(CurrentProject.Path & "c:" & "*.mdb")

Do While Len(sFile)

Shell "msaccess.exe """ & CurrentProject.Path & "\temp\" & sFile & """  /compact"

Was sagen Dir denn die rot markierten Stellen?








sFile = Dir( "c:\temp\" & "*.mdb")     'oder gleich:  Dir( "c:\temp\*.mdb")
...
Shell "msaccess.exe """ &  "c:\temp\" & sFile & """  /compact"
   

daolix

Hallo
da du ja das Eingangspost und damit die Ausgangsbedingungen etwas geändert hast, ist noch anzumerken das du etweder der Sub den Path als Parameter mitgibst und für jeden vollständigen Unterordner diese Sub dann aufrufst, oder du die Sub so umschreibst das diese sich selbst (recursiv) aufruft.