Neuigkeiten:

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

Mobiles Hauptmenü

Brauche hilfe mit Variable die Feld nach "\" in Tabellenfelder schiebe soll.

Begonnen von Thomas_Klee, Oktober 27, 2019, 17:27:01

⏪ vorheriges - nächstes ⏩

Thomas_Klee

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




ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Thomas_Klee

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Thomas_Klee

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


ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Thomas_Klee

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 ;)

Thomas_Klee

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.

MzKlMu

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.

Gruß Klaus

Thomas_Klee

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  :(

MzKlMu

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.
Gruß Klaus

Thomas_Klee

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.

MzKlMu

Hallo,
kannst Du der Urtabelle keinen Autowert als Primärschlüssel verpassen ?

Wozu brauchst Du diese Aufteileung überhaupt ?
Gruß Klaus

Thomas_Klee

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