Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Testen ob eine Spaltenname existiert mit VBA

737 views
Skip to first unread message

Jens Wichmann

unread,
Nov 28, 2002, 4:20:15 AM11/28/02
to
Hallo,
ich möchte per VBA überprüfen ob ein Feld-Name in eine Tabelle bereits
existiert.

Mit dem Code CurrentDb.TableDef("Adr").Fields(1).Name
kann man die Namen der Felder auslesen.
Wenn ich aber mit CurrentDb.TableDef("Adr").Fields("Vorname").Name
auf ein Feld zugreifen will das es noch nicht giebt kommt ein Fehler.
Nun möchte ich das aber nicht über eine Fehlerroutine abfragen.

Deshalb meine Frage:
Wie kann ich in der Fields-Auflistung prüfen ob ein Feld Namens "Vorname"
bereits enthalten ist?

Gruß Jens Wichmann


Jürgen Volke

unread,
Nov 28, 2002, 4:39:19 AM11/28/02
to
Hallo Jens

public function fktFeldVorhanden(txtTable as string, txtField as string) as boolean
dim db as database
dim tdf as tabledef
dim fld as field
fktFeldVorhanden=False
set db=currentdb
set tdf=db.TableDefs(txtTable)
for each fld in tdf.fields
if fld.Name=txtField then
fktFeldVorhanden=True
exit For
end if
next
set tdf=nothing
set db=nothing
end Function

aufrufen mit If fktFeldVorhanden("adr","Vorname") Then

HTH Jürgen


Frank Hammerschmidt

unread,
Nov 28, 2002, 5:41:23 AM11/28/02
to
Hallo Jürgen,

Jürgen Volke schrieb:

>> ich möchte per VBA überprüfen ob ein Feld-Name in eine Tabelle
>> bereits existiert.

> public function fktFeldVorhanden(txtTable as string, txtField as
[14 Zeilen]
> end Function

Schaut schön aus, ist aber IMHO zu lang für den Zweck. Hier mal
zwei kurze Versionen.

Function FeldDa(TabName As String, FldName As String) As Boolean
On Error Resume Next
Call DMin(FldName, TabName)
FeldDa = Not (Err.Number = 64479 Or Err.Number = 2428)
End Function

Function FeldDa2(TabName As String, FldName As String) As Boolean
Dim f As DAO.Field
On Error Resume Next
Set f = CurrentDb.TableDefs(TabName).Fields(FldName)
FeldDa2 = Not (Err.Number = 3265)
End Function

Gruß
Frank

Daniel Bolege

unread,
Nov 28, 2002, 1:11:34 PM11/28/02
to
Hallo,

>> public function fktFeldVorhanden(txtTable as string [...]
> [14 Zeilen]
>> end Function

> Schaut schön aus, ist aber IMHO zu lang für den Zweck. Hier
> mal zwei kurze Versionen.

> [Zwei Funktionen mit absichtlicher "Exception"]

Klar, aber Jens hat (aus welchem Grunde auch immer) ausdrücklich gesagt,
dass er nicht über einen Fehler laufen will.

Und bezügl. Effizienz:

> Set f = CurrentDb.TableDefs(TabName).Fields(FldName)

ist IMHO besser als

> Call DMin(FldName, TabName)

weil im zweiten Falle bei ungünstigen Datentypen und großen Tabellen (und
falls das Feld tatsächlich existiert) eine unnötige aber aufwändige
Berechnung durchgeführt wird.

Ansonsten stimme ich zu, aber eher aus Sicht der Laufzeit, nicht wegen der
Anzahl Codezeilen.

Gruß Daniel

--
http://www.bolege.de


Frank Hammerschmidt

unread,
Nov 28, 2002, 6:28:25 PM11/28/02
to
Hallo Daniel,

Daniel Bolege schrieb:

> Klar, aber Jens hat (aus welchem Grunde auch immer) ausdrücklich gesagt,
> dass er nicht über einen Fehler laufen will.

Offensichtlich hat mein Firmenhamster Jens' Frage gefressen; ich hatte
nur die Antwort von Jürgen. Hier habe ich sie dann wieder, aber ... zu
spät. Allerdings: hätte ich sie gehabt, hätte ich nur noch ein
"warum?" dazu geschrieben.

> Und bezügl. Effizienz:
>
>> Set f = CurrentDb.TableDefs(TabName).Fields(FldName)
>
> ist IMHO besser als
>
>> Call DMin(FldName, TabName)

Ja, unbedingt. Ich setze die zweite Lösung selbst ein.

> Ansonsten stimme ich zu, aber eher aus Sicht der Laufzeit, nicht wegen der
> Anzahl Codezeilen.

Jürgen ist fit genug, dass ich ihm nichts von den Schleifen durch die
Objekte erzählen muss.

Gruß
Frank

Jürgen Volke

unread,
Nov 29, 2002, 1:27:55 AM11/29/02
to
Moin Frank

>
> > Ansonsten stimme ich zu, aber eher aus Sicht der Laufzeit, nicht wegen der
> > Anzahl Codezeilen.
>
> Jürgen ist fit genug, dass ich ihm nichts von den Schleifen durch die
> Objekte erzählen muss.

danke .

Da man die gewünschte Funktion wohl kaum in einer Abfrage von 10000 Sätzen einsetzt,
kommt es auf ein paar Schleifendurchgänge wohl kaum an *bg*

Schönen Tag an alle


Frank Hammerschmidt

unread,
Nov 29, 2002, 4:52:40 PM11/29/02
to
Hallo Jürgen,

Jürgen Volke schrieb:

> Da man die gewünschte Funktion wohl kaum in einer Abfrage von 10000 Sätzen einsetzt,


> kommt es auf ein paar Schleifendurchgänge wohl kaum an *bg*

Richtig. Eine endgültige Version liefert man so aus, dass es einer
solchen Überprüfung nicht bedarf.

Gruß
Frank

Jens Wichmann

unread,
Dec 4, 2002, 5:36:21 AM12/4/02
to
"Daniel Bolege" <dan...@bolege.de>

> Klar, aber Jens hat (aus welchem Grunde auch immer) ausdrücklich gesagt,
> dass er nicht über einen Fehler laufen will.

Ich hatte gehofft das es bereits so eine Funktion gibt die ich nur nicht
kenne.
Und das mit den Fehlern ist eigentlich nur weil ich prinzipiell versuche so
zu programmieren das keine Fehler auftreten.
Ich habe den Vorschlag von Jürgen benutzt da Ihr recht habt, DIESE Tabellen
haben etwa 10-30 Felder und so sollte die Schleife keine relevanten
Verzögerungen verursachen.

Vielen Dank jens Wichmann


Daniel Bolege

unread,
Dec 4, 2002, 7:34:17 AM12/4/02
to
> Und das mit den Fehlern ist eigentlich nur weil ich
> prinzipiell versuche so zu programmieren das keine
> Fehler auftreten.

Das kommt immer wieder vor, in jeder Programmierung, dass man so vorgehen
muss. Auch, vielleicht vor allem, auf der Ebene der Betriebssysteme selbst.
Beispiel für eine der am häufigsten benutzen Funktion der Windows-API:
getSaveFileName. Als Parameter kann man für den
Datei-speichern-unter-Dialog, den es in fast jeder Windows-Anwendung gibt,
angeben, ob Windows prüfen soll, ob die vom Benutzer angegebene Datei auch
beschreibbar ist.

Windows macht das, indem eine Datei mit der Größe 0 Byte temporär angelegt
wird. Schlägt das fehl, so geht's offensichtlich nicht. Es wäre zu
umständlich, zuvor jeden Fall, warum es nicht gehen könnte, einzeln zu
prüfen, z.T., weil man sie nicht alle kennen kann.

Kurz: Ein abgefangener Fehler ist kein Fehler.

Gruß Daniel


0 new messages