Hallo Gemeinde,
bin VBA Anfänger und habe ein Problem mit einem VBA-Code.
Ich möchte in einer Access-Datenbank gerne Fileverzeichnisse auslesen. Habe ich soweit auch schon mit ein paar zusammengeklaubten VBA Codes hinbekommen.
Jetzt habe ich das Problem, das mir das Verzeichnis in einem Tabellenfeld steht.
zum Beispiel:
c:\EPA\Mandant_393\scan\images\Test.pdf
Ich möchte jetzt dass er mir in eine andere Tabelle in die Felder 1,2,3,4,5,.....
1= C:
2= EPA
3= Mandant_393
4= scan
.....
schreibt.
Irgendwie bringt mir der VBA-Script aber einen Fehler mit der Variable "i" ?????
Dim dbs, rst, rst1
Dim werte() As String
Dim i() As String
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tbl_files")
Set rst1 = dbs.OpenRecordset("tbl_verzeichnis")
If Not rst.EOF Then
rst.MoveFirst
Do Until rst.EOF
werte = Split(rst("Datei").Value, "\", -1, 1)
rst1.AddNew
For i = LBound(werte()) To UBound(werte())
rst1.Fields(x).Value = CStr(werte(x))
Next
rst1.Update
rst.MoveNext
Loop
End If
rst.Close
rst1.Close
Set dbs = Nothing
End Sub
Wenn Du i als Laufvariable der Schleife verwenden willst, solltest Du nicht plötzlich auf x umspringen.
Mit Option Explicit würden Dir solche Dinge sehr schnell bewusst gemacht.
Stimmt da war von i auf x gewechselt worden.
Aber trotzdem kommt die Fehlermeldung:
Typen unverträglich .... aber es ist doch ein String ... spricht Text
Hallo Thomas,
Deklariere doch erstmal deine Variablen richtig; - ein Variant für ein Objekt ist
eigentlich nicht so der Bringer
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim rst1 As DAO.Recordset
Ein Array für eine Laufvariable auch nicht
Dim i As Integer
Des Weiteren halte ich auch die Umwandlung eines Strings in einen String nicht
für sinnvoll
rst1.Fields(i).Value = werte(i)
Ich persönlich würde auch die Recordsets nicht nur schliessen, sondern zusätzl.
terminieren
Set rst = Nothing
Set rst1 = Nothing
gruss ekkehard
ZitatAber trotzdem kommt die Fehlermeldung
Nicht trotzdem. Die Neutralisierung eines Fehlers ermöglicht, dass der nächste wirken kann.
Hinsichtlich Fehler würde ich mich an Deiner Stelle für die Zeile interessieren, die der Debugger kennzeichnet.
Dass Du andere über alles raten lassen willst, könnte man als Zumutung werten.
Tschuldigung ... habe mich bisher immer mit Makros durchgehangelt und wenig VBA Ahnung.
Der Fehler springt direkt auf das "i" bei
For i =
Option Compare Database
Option Explicit
Sub trennen()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim rst1 As DAO.Recordset
Dim werte() As String
Dim i() As Integer
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tbl_Files")
Set rst1 = dbs.OpenRecordset("tbl_verzeichnis")
If Not rst.EOF Then
rst.MoveFirst
Do Until rst.EOF
werte = Split(rst("Datei").Value, "\", -1, 1)
rst1.AddNew
For i = LBound(werte()) To UBound(werte())
rst1.Fields(i).Value = werte(i)
Next
rst1.Update
rst.MoveNext
Loop
End If
rst.Close
rst1.Close
Set rst = Nothing
Set rst1 = Nothing
Set dbs = Nothing
End Sub
ZitatDim i() As Integer
Mit den Klammern wird ein Integer-Array deklariert. Dieses ist dann als Laufvariable ungeeignet.
Da bräuchte man ein einfaches Integer oder besser gleich Long.
Danke für eure Mithilfe für einen Anfänger .... mit der Wegname der () macht es jetzt was es machen soll. Super nett und schnell ;)
Ich hätte nochmal eine Frage. Der Trenner hat ja so funktioniert, dass er mir die Werte in eine neue Tabelle schreibt.
Wäre es auch möglich in der gleichen Tabelle zu bleiben und dann zu sagen dass die Trennfunktion einfach das Feld [Pfad] in die Felder P01,P02,P03,P04 ..... im gleichen Datensatz schreibt. Also so ähnlich wie eine Aktualisierungsabfrage.
Hallo,
Zitatin die Felder P01,P02,P03,P04 ..... im gleichen Datensatz schreibt.
das ist zwar möglich, aber für eine Datenbank der völlig falsche Weg. Das sind Aufzählungsfelder die in einer Datenbank zu vermeiden sind. Lasse es bei der extra Tabelle.
Ich wollte nachher halt gerne eine Kreuztabelleabfrage erstellen basieren auf der einen Tabelle, weil ich ja in der neuen Tabelle keinen Verknüpfer zu der Urtabelle habe :(
Hallo,
Du musst noch ein Schlüsselfeld in die neue Tabelle übertragen, dann geht auch die Kreuztabelle. In die neue Tabelle so wie Du das jetzt hast, gehört ohne ein Fremdschlüsselfeld wenn es eine übergeordnete Tabelle gibt.
Dass Schlüsselfeld hätte in der Urtabelle den Feldname: [dateipfad] den den ich mit trennen ja aufteile. Wie muss ich das Skript anpassen, damit in der neuen Tabelle auch das Feld Dateipfad angelegt wird? Dann könnte ich es ja verknüpfen.
Hallo,
kannst Du der Urtabelle keinen Autowert als Primärschlüssel verpassen ?
Wozu brauchst Du diese Aufteileung überhaupt ?
Ich möchte nacher wenn das fileverzeichnis eingelesen und aufgesplittelt ist so eine Auswertung erzeugen.
Dann kann die Fachabteilung direkt sehen ob für alle Mandanten alles gut ist oder ob bei irgend einem Mandanten
etwas unklar oder zu tun ist.
Hintergrund:
Eine Verarbeitung erzeugt Dateien in ein Fileverzeichnis pro Mandant.
Daher auch der Aufbau:
T:\EPA\Mandant_XXX\Scan\... und dort vier Verzeichnisse done,error,images,index1
Hallo,
Du hast doch jetzt alles was Du brauchst für die Kreuztabellenabfrage.
Der Mandant ist das gemeinsame Schlüsselfeld. Wobei die Ausgangstabelle ja gar nicht benötigt wird. Die Kreuztabellenabfrage kann direkt aus der neuen Tabelle erzeugt werden. Außerdem könnte der Mandant als "Verknüpfer" verwendet werden.
Eine Kreuztabellenabfrage wäre mit der von Dir angedachten Version (alles in einer Zeile) nicht möglich. Die Funktion "Anzahl" könnte nicht verwendet werden.
PS:
Bitte verwende für Codedarstellungen die Codetags des Forums und vermeide Leerzeilen im Code, sonst wird der Code ja länger als nötig und die Übersicht im Forum geht verloren. Ich habe die Codetags in Deinen Beiträgen eingebaut.