![]() |
Excel nach Access ...
hallo wieder mal bin ich auf eure Hilfe angewiesen
Folgendes Problem eine bestehende Tabelle soll mittels Script um diverse Feldnamen erweitert werden, die immer mittels Excel File definiert werden mit VBA Code bin ich auf Kriegsfuß, dennoch habe eine Lösung für mein Problem - zumindest zum Teil gebastelt Private Sub StartImport(FileName As String) On Error GoTo fehler Dim xls As Object Dim fld As Field Set xls = GetObject(FileName) Dim i As Integer Dim fldName As String i = 2 fldName = xls.Application.sheets("Felder für Import").range("A" & i) While Nz(fldName, "") <> "" Set fld = CurrentDb.TableDefs("Element").CreateField(fldName , dbText, 50) CurrentDb.TableDefs("Element").Fields.Append fld i = i + 1 fldName = xls.Application.sheets("Felder für Import").range("A" & i) Wend xls.Close Set xls = Nothing fehler: If Err.Description = "" Then MsgBox "Daten erfolgreich importiert" Else MsgBox "Fehler: " & Err.Description End If End Sub zumindest werden die Feldnamen importiert - aber es gelingt mir nicht die dazu passendes Beschreibungen (2. Spalte im Excel File) unter Beschreibung zu importieren Kann mir jemand von euch helfen??? Danke |
Hi!
Falls du die Beschreibung zu einem Feld, die in der Entwurfsansicht der Tabelle angezeigt und bearbeitet wird, per Code erstellen willst, solltest du dir CreateProperty und Description ansehen. mfg WB |
danke für die Hilfe
komme allerdings auch damit nicht weiter hab irgendwie ein Knopf im Hirn sorry |
Was willst du genau machen?
mfg WB |
ich möchte als Ergebnis nicht nur die neuen Felder mit den Feldnamen aus der 1.Spalte im Excel, sondern zudem noch die Beschreibungen der neu eingefügten Felder in der Access-Datenbank aus der 2. spalte im Excel nach Access übernehmen
also zB Excelspalte 1 2 Bemerkung enthält Bemerkungen über Anwender . . . . im Access sollte das ganze dann so aussehen Feldname "Bemerkung" Beschreibung "enthält Bemerkungen über Anwender" ... |
hi,
und wieso erstellt das ganze nicht gleich in access.. wäre sehr viel einfacher. |
wollte ich auch
ABER es muss über Excel funktionieren da immer verschiedene Felder deklariert werden müssen und für jedesmal 30 bis 50 Feldnamen eintippen g'freut mich nicht :-) nein im ernst es muss über Excel laufen |
Dann hab ich's eh richtig erkannt.
Diese Beschreibung ist in der Description-Eigenschaft gespeichert. Um die zu Erstellen braucht man CreateProperty. Das ist in der Hilfe ziemlich umfangreich beschrieben. Ein paar Fehlversuche werden dir aber erfahrungsgemäß nicht erspart bleiben. (Da bin ich wieder froh, daß ich kein Access mehr verwende.) mfg WB |
hattest recht - Dank
damit gehts einwandfrei nun zur Krönung des ganzen sollten noch die Formate mit übernommen werden, bzw. es würde Text, Zahl, Ja/Nein genügen Ideen? Danke |
Meinst du jetzt den Datentyp oder das Ein- Ausgsbeformat für das Feld?
|
den Datentyp damit ich die Tabelle komplett definiert habe
Feldname Format Beschreibung |
Der Typ kann bereits bei der Erstellung mit CreateField festgelegt werden.
Wenn das Feld mit Append zu Auflistung hinzugefügt wurde, ist die Type-Eigenschaft schreibgeschützt. mfg WB |
genau dieses Problem - schreibgeschützt
nun ist guter Rat teuer mein Code Do Until rs.EOF Set fld = tbl.CreateField(rs.Fields(0), dbText, 255) tbl.Fields.Append fld rs.MoveNext Loop db.TableDefs.Append tbl rs.MoveFirst Set tbl = db.TableDefs("neue Felder") Do Until rs.EOF Set fld = tbl.Fields(rs.AbsolutePosition) If Not IsNull(rs.Fields(1)) Then fld.Properties.Append fld.CreateProperty("Description", dbText, rs.Fields(1)) End If rs.MoveNext Loop Do Until rs.EOF Set fld = tbl.Fields(rs.AbsolutePosition) If Not IsNull(rs.Fields(1)) Then fld.Properties.Append fld.CreateProperty("Felddatentyp", dbText, rs.Fields(2)) End If rs.MoveNext Loop rs.Close Set db = Nothing End Sub die 2. Schleife kann ich mir sparen denn ab der 1. Schleife das neue Feld einen Schreibschutz |
Wie ich schon sagte:
Der Typ kann bereits bei der Erstellung mit CreateField festgelegt werden. Oder du änderst den Typ bevor das Feld zu Auflistung hinzugefügt wird. mfg WB |
so nun hats geklappt
für die's interessiert Private Sub StartImport(FileName As String) Dim db As DAO.Database Dim tbl As DAO.TableDef Dim fld As DAO.Field Dim rs As DAO.Recordset Dim Format As Byte Set db = CurrentDb Set rs = db.OpenRecordset("Felder für RC-Plant", dbOpenDynaset) 'zuerst die neuen Felder inkl. Beschreibung nach Access importieren - Felder für RC-Plant Set tbl = db.CreateTableDef("neue Felder für RC-Plant") 'in der Datenbank sind die neuen Feldnamen inkl. Beschreibungen enthalten und können dann 'mittels kopieren einfügen direkt in die Tabelle Element übernommen werden Do Until rs.EOF Select Case rs.Fields(2) Case "Text" Format = 10 Case "Zahl" Format = 3 Case "Ja/Nein" Format = 1 Case Else Format = 10 End Select Set fld = tbl.CreateField(rs.Fields(0), Format) tbl.Fields.Append fld rs.MoveNext Loop db.TableDefs.Append tbl rs.MoveFirst Set tbl = db.TableDefs("neue Felder") Do Until rs.EOF Set fld = tbl.Fields(rs.AbsolutePosition) If Not IsNull(rs.Fields(1)) Then fld.Properties.Append fld.CreateProperty("Description", dbText, rs.Fields(1)) End If rs.MoveNext Loop 'Do Until rs.EOF ' Set fld = tbl.Fields(rs.AbsolutePosition) ' If Not IsNull(rs.Fields(1)) Then ' fld.Properties.Append fld.CreateProperty("Format", dbText, rs.Fields(2)) ' End If 'rs.MoveNext 'Loop rs.Close Set db = Nothing MsgBox ("Fertig!") End Sub und anschließend kopieren und einfügen im Entwurfsmodus vielleicht nicht elegant aber es löst mein Problem Danke |
Gratulation!
Ich kann mir nicht vorstellen, daß das Anfügen dieser Felder an die "echte" Tabelle nicht funktioniert. Entscheidend ist wahrscheinlich die Reihenfolge der Operationen. Wahrscheinlich läßt sich alles in einem Schleifendurchlauf erledigen. Jetzt bin ich echt neugierig. Ich glaube ich muß das mal ausprobieren. EDIT: Wie ich's mir dachte. Es funktioniert tadellos. mfg WB |
Die Zeit zum Editieren war leider schon abgelaufen
Hier der Code mit dem ich's probiert habe. Tabelle1 ehält vorher bereits 3 Felder. Set tbl = db.TableDefs("Tabelle1") Do Until rs.EOF Select Case rs.Fields(1) Case "Text" Format = 10 Case "Zahl" Format = 3 Case "Ja/Nein" Format = 1 Case Else Format = 10 End Select Set fld = tbl.CreateField(rs.Fields(0), Format) tbl.Fields.Append fld fld.Properties.Append fld.CreateProperty("Description", dbText, rs.Fields(2)) rs.MoveNext Loop Mit der kleinen Änderung ersparst du dir kopieren/einfügen. mfg WB |
danke
was ein db.CreateTablDef so alles ausmacht nun steht db.TableDefs und es funktioniert es gibt nur noch einen Hacken es kommt der Fehler "zuviele Felder definiert" hängt aber vielleicht mit der Länge der Feldnamen zusammen |
Alle Zeitangaben in WEZ +2. Es ist jetzt 17:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag