PDA

Vollständige Version anzeigen : Access über Excel


chrissy
24.09.2001, 11:05
Hallo

ich versuche gerade an meine Accesstabelle ein Feld mit Autowerten anzufügen, hat jemand einen plan wie man das über VBA macht?

thanx

<p align="left"><font size="1" face="Century Gothic"><font color="#000000">Moderatorenanmerkung: die Überarbeitung dieses Beitrages ist im Zuge der Arbeiten zu sehen, die durch den Wechsel der Forensoftware zum 01.01.2003 verursacht wurden.

Es wurde in diesem Beitrag ein Link entfernt.</font>

Stema
24.09.2001, 11:28
Hallo chrissy,

Auszug aus der Access-Hilfe:
<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">Zitat:</font><HR>The following example defines a new Field object and appends it to the Fields collection of a TableDef object:

Sub NewField()
Dim dbs As Database, tdf As TableDef, fld As Field

' Return reference to current database.
Set dbs = CurrentDb
Set tdf = dbs.TableDefs!Employees
' Create new field in Employees table.
Set fld = tdf.CreateField("SocialSecurity#", dbText, 11)
' Append field and refresh collection.
tdf.Fields.Append fld
tdf.Fields.Refresh
Set dbs = Nothing
End Sub[/quote]

Wenn ich es richtig sehe muß dbText durch dbAutoIncrField ersetzt werden.

In den Verweisen mußt Du "Mircosoft Access 8.0" aktivieren.

------------------

Gruß Stema
------------------

[Dieser Beitrag wurde von Stema am 24.09.2001 editiert.]

chrissy
24.09.2001, 11:50
hm... jetzt kommt die Fehlermeldung:
Laufzeitfehler 3259
Ungültiger Felddatentyp

Mein Code sieht so aus:

Public DBName As Field
Public DBVorname As Field
Public DBTelefon As Field
Public DBPasswort As Field
Public DBIndex As Field

Sub datenbank_erzeugen()

Dim MitarbeiterDB As Database
Dim MitarbeiterTab As TableDef

'On Error GoTo fehler
Set MitarbeiterDB = DBEngine.CreateDatabase("Mitarbeiter", dbLangGeneral)
Set MitarbeiterTab = MitarbeiterDB.CreateTableDef("Mitarbeiter")

With MitarbeiterTab

Set DBIndex = .CreateField("Index", dbAutoIncrField)
MitarbeiterTab.Fields.Append DBIndex
Set DBName = .CreateField("Name", dbText, 50)
MitarbeiterTab.Fields.Append DBName
Set DBVorname = .CreateField("Vorname", dbText, 50)
MitarbeiterTab.Fields.Append DBVorname
Set DBTelefon = .CreateField("Telefon", dbText, 20)
MitarbeiterTab.Fields.Append DBTelefon
Set DBPasswort = .CreateField("Passwort", dbText, 8)
MitarbeiterTab.Fields.Append DBPasswort
Set DBGruppe = .CreateField("Gruppe", dbText, 30)
MitarbeiterTab.Fields.Append DBGruppe


MsgBox ("Neue Datenbank angelegt")
End With

MitarbeiterDB.TableDefs.Append MitarbeiterTab
MitarbeiterDB.Close
GoTo ende

'fehler: MsgBox ("Mit Bestehender Datenbank arbeiten?")
ende:
End Sub

Hat einer nen Plan wieso?
Kann es daran liegen das ich mit Office97 arbeite??

thanx

[Dieser Beitrag wurde von chrissy am 25.09.2001 editiert.]

chrissy
25.09.2001, 10:52
Hm... komme nicht drauf... hat keiner nen plan?

Stema
25.09.2001, 12:11
Deleted, muß noch mal drüber nachdenken.

Im markierten Bereich unten steht die richtige Syntax für die Append-Methode.
------------------

Gruß Stema
------------------

[Dieser Beitrag wurde von Stema am 25.09.2001 editiert.]

[Dieser Beitrag wurde von Stema am 25.09.2001 editiert.]

Stema
25.09.2001, 12:16
Hab' noch folgendes Beispiel gefunden:
This example creates a new TableDef object in the Northwind database.

Sub CreateTableDefX()

Dim dbsNorthwind As Database
Dim tdfNew As TableDef
Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Northwind.mdb")

' Create a new TableDef object.
Set tdfNew = dbsNorthwind.CreateTableDef("Contacts")

With tdfNew
' Create fields and append them to the new TableDef
' object. This must be done before appending the
' TableDef object to the TableDefs collection of the
' Northwind database.

.Fields.Append .CreateField("FirstName", dbText)
.Fields.Append .CreateField("LastName", dbText)
.Fields.Append .CreateField("Phone", dbText)
.Fields.Append .CreateField("Notes", dbMemo)

Debug.Print "Properties of new TableDef object " & _
"before appending to collection:"

' Enumerate Properties collection of new TableDef
' object.
For Each prpLoop In .Properties
On Error Resume Next
If prpLoop <> "" Then Debug.Print " " & _

prpLoop.Name & " = " & prpLoop
On Error GoTo 0
Next prpLoop

' Append the new TableDef object to the Northwind
' database.
dbsNorthwind.TableDefs.Append tdfNew

Debug.Print "Properties of new TableDef object " & _
"after appending to collection:"

' Enumerate Properties collection of new TableDef
' object.
For Each prpLoop In .Properties
On Error Resume Next
If prpLoop <> "" Then Debug.Print " " & _

prpLoop.Name & " = " & prpLoop
On Error GoTo 0
Next prpLoop

End With

' Delete new TableDef object since this is a
' demonstration.
dbsNorthwind.TableDefs.Delete "Contacts"

dbsNorthwind.Close

End Sub


------------------

Gruß Stema
------------------

chrissy
25.09.2001, 12:30
hm...

sorry aber ich sehe bis auf die Schreibweise von:

Set DBIndex = .CreateField("Index", dbAutoIncrField)
MitarbeiterTab.Fields.Append DBIndex

im vergleich zu:

.Fields.Append .CreateField("("Index", dbAutoIncrField)

Keinen Unterschied? Hab ich was übersehen? Und das bringt leider keine Veränderung :-(

Gruß Chris

Stema
25.09.2001, 16:17
Hallo Chris,

stimmt ist praktisch das gleiche, wobei Du zusätzlich Field-Objekte mit Set zuweist. Ich glaube, daß ist auch der Fehler. Auszug aus der Hilfe zu Append Method:
<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">Zitat:</font><HR>
If the object you're appending isn’t complete (such as when you haven’t appended any Field objects to a Fields collection of an Index object before it’s appended to an Indexes collection) or if the properties set in one or more subordinate objects are incorrect, using the Append method causes an error. For example, if you haven’t specified a field type and then try to append the Field object to the Fields collection in a TableDef object, using the Append method triggers a run-time error.[/quote]

Somit passiert hier (denke ich) folgendes:
Set DBIndex = .CreateField("Index", dbAutoIncrField)
Ein neues Feld wird erstellt, aber nicht der Indexes-Collection hinzugefügt. Somit kommt in der folgenden Zeile der Fehler:
MitarbeiterTab.Fields.Append DBIndex

Änder das mal ab in:
.Fields.Append .CreateField("Index", dbAutoIncrField)

Viel Glück... ;)

<font size="1" face="Century Gothic">Moderatorenanmerkung: die Überarbeitung dieses Beitrages ist im Zuge der Arbeiten zu sehen, die durch den Wechsel der Forensoftware zum 01.01.2003 verursacht wurden.

Es wurden in diesem Beitrag Links korrigiert, die auf falsche Adressen zeigten und die Signatur angepasst...</font>

chrissy
26.09.2001, 09:18
Hat leider auch nix gebracht... :-(

Stema
26.09.2001, 09:45
Poste doch nochmal Deinen letzten Code.

------------------

Gruß Stema
------------------

chrissy
26.09.2001, 09:51
Immer noch der:

Sub datenbank_erzeugen()

Dim MitarbeiterDB As Database
Dim MitarbeiterTab As TableDef

'On Error GoTo fehler
Set MitarbeiterDB = DBEngine.CreateDatabase("D:\christian otto\excel\urlaubsplaner\Mitarbeiter", dbLangGeneral)
Set MitarbeiterTab = MitarbeiterDB.CreateTableDef("Mitarbeiter")

With MitarbeiterTab

Set DBIndex = .CreateField("Index", dbAutoIncrField)
MitarbeiterTab.Fields.Append DBIndex
Set DBName = .CreateField("Name", dbText, 50)
MitarbeiterTab.Fields.Append DBName
Set DBVorname = .CreateField("Vorname", dbText, 50)
MitarbeiterTab.Fields.Append DBVorname
Set DBTelefon = .CreateField("Telefon", dbText, 20)
MitarbeiterTab.Fields.Append DBTelefon
Set DBPasswort = .CreateField("Passwort", dbText, 8)
MitarbeiterTab.Fields.Append DBPasswort
Set DBGruppe = .CreateField("Gruppe", dbText, 30)
MitarbeiterTab.Fields.Append DBGruppe


MsgBox ("Neue Datenbank angelegt")
End With

MitarbeiterDB.TableDefs.Append MitarbeiterTab
MitarbeiterDB.Close
GoTo ende

'fehler: MsgBox ("Mit Bestehender Datenbank arbeiten?")
ende:
End Sub

Du musst das OnError wegmachen, damit du den Fehler siehst...

Stema
26.09.2001, 11:13
HURRRRRAAAA, es ist geschafft:

.Fields.Append .CreateField("Index", dbLong)
.Fields("Index").Attributes = dbAutoIncrField

dbAutoIncrField ist keine Datentyp sondern ein Attribut.


------------------

Gruß Stema
------------------

[Dieser Beitrag wurde von Stema am 26.09.2001 editiert.]

chrissy
26.09.2001, 11:32
SAU GEIL!!!

Stema du bist spitze!!! :-D

Stema
26.09.2001, 15:09
Hallo Chris,

falls Du auch den PrimaryKey zuordnen möchtest, dann funktioniert das folgendermaßen:

Option Explicit

Sub DatenbankAnlegen()
Dim MitarbeiterDB As Database
Dim MitarbeiterTab As TableDef
Dim ind As Index

On Error GoTo Fehler

Set MitarbeiterDB = DBEngine.CreateDatabase("D:\Mitarbeiter", dbLangGeneral)
Set MitarbeiterTab = MitarbeiterDB.CreateTableDef("Mitarbeiter")

With MitarbeiterTab
' Tabellenfelder anlegen.
.Fields.Append .CreateField("Index", dbLong)
.Fields("Index").Attributes = dbAutoIncrField
.Fields.Append .CreateField("Name", dbText, 50)
.Fields.Append .CreateField("Vorname", dbText, 50)
.Fields.Append .CreateField("Telefon", dbText, 20)
.Fields.Append .CreateField("Passwort", dbText, 8)
.Fields.Append .CreateField("Gruppe", dbText, 30)

' PrimaryKey für das Tabellen-Feld "Index" festlegen.
Set ind = .CreateIndex("NumIndex")
ind.Fields.Append .CreateField("Index", dbLong)
ind.Primary = True

' Index der Tabelle hinzufügen.
.Indexes.Append ind
End With

' Tabelle der Datenbank hinzufügen.
MitarbeiterDB.TableDefs.Append MitarbeiterTab
MitarbeiterDB.Close

MsgBox ("Neue Datenbank angelegt!")
Exit Sub

Fehler:
MsgBox ("Mit Bestehender Datenbank arbeiten?")
End Sub

:D

<font size="1" face="Century Gothic">Moderatorenanmerkung: die Überarbeitung dieses Beitrages ist im Zuge der Arbeiten zu sehen, die durch den Wechsel der Forensoftware zum 01.01.2003 verursacht wurden.

Es wurden in diesem Beitrag Links korrigiert, die auf falsche Adressen zeigten und die Signatur angepasst...</font>