robcomboy
Goto Top

Access - In Wordvorlage mehrere Dropdown-Menüs mit Daten füllen

Sinn und Zweck der Übung ist es ein paar Dropdownlisten in einer Wordvorlage
automatisch mit den aktuellsten Daten zu bestücken, die in einer Access.mdb liegen.

Ich habe hier nach dem folgenden Beispiel:
http://www.fontstuff.com/mailbag/qword02.htm

Werte in eine Wordvorlage eingelesen,
wie kann ich nun mehrere Datensätze auslesen und
mehrere Dropdownfelder aktualisieren lassen?


Danke für jegliche Hilfe,
Grüße, Robcomboy

Content-Key: 165847

Url: https://administrator.de/contentid/165847

Ausgedruckt am: 29.03.2024 um 07:03 Uhr

Mitglied: Biber
Biber 08.05.2011 um 14:02:29 Uhr
Goto Top
Moin Romcomboy,

Zitat von @robcomboy:
Ich habe hier nach dem folgenden Beispiel:
http://www.fontstuff.com/mailbag/qword02.htm

Werte in eine Wordvorlage eingelesen,
wie kann ich nun mehrere Datensätze auslesen und
mehrere Dropdownfelder aktualisieren lassen?
Genauso wie dem Beispiel vorgekaspert.

Grüße
Biber
Mitglied: robcomboy
robcomboy 08.05.2011 um 16:52:19 Uhr
Goto Top
Hi Biber

Danke für deinen Hinweis,
Ich habe den korrekten Syntax leider noch nicht herausgefunden,
habe das hier versucht:

Private Sub Document_New()
     On Error GoTo Document_Open_Err
     Dim cnn As New ADODB.Connection
     Dim rst As New ADODB.Recordset
     Dim abc As New ADODB.Recordset
     Dim DBLocation As String
          

     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
         "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb"  
         rst.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _  
         cnn, adOpenStatic
     rst.MoveFirst
     
     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
        "Data Source=F:\Excel und Formulare\New\Formobjekte.mdb"  
         abc.Open "SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues;", _  
         cnn, adOpenStatic
     abc.MoveFirst
     
     ' Dropdown Referate füllen  
     With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries  
         .Clear
         Do
             .Add rst![Referate]
             rst.MoveNext
         Loop Until rst.EOF
    
    End With
    
     With ActiveDocument.FormFields("DDeml").DropDown.ListEntries  
         .Clear
         Do
             .Add abc![Emailaddys]
             abc.MoveNext
         Loop Until abc.EOF
    End With
    
    
Document_Open_Exit:
     On Error Resume Next
     rst.Close
     cnn.Close
     Set rst = Nothing
     Set cnn = Nothing
    
     Exit Sub

Document_Open_Err:
     MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"  
     Resume Document_Open_Exit
     Return
     
End Sub

Bekomme Fehlermeldungen, die ich nicht
abstellen kann. Bin Neu in VB.

Grüße,
robcomboy
[Edit Biber] Codeformatierung berichtigt. [/Edit]
Mitglied: Biber
Biber 08.05.2011 um 17:27:58 Uhr
Goto Top
Moin robcomboy,

Bekomme Fehlermeldungen, die ich nicht abstellen kann. Bin Neu in VB.
Na ja, vielleicht können wir mit gebündelter Forumskompetenz die Fehlermeldungen abstellen, wenn du sie mal zum Lesen bereitstellst.

Hast du denn denn ersten Stolperstein aus dem Weg geräumt und Word-VBA mitgeteilt, dass es die Referenzen (eingedeutscht "Verweise") zur "Microsoft ActiveX Data Objects 2.x Library" setzen soll?

Du liest nur einmal aus einer Tabelle und füllst damit zwei Dropdownlisten? Ist das inhaltlich richtig?
Was hat denn die Tabelle für Felder und wieviel Datensätze willst du lesen?

Grüße
Biber
Mitglied: robcomboy
robcomboy 08.05.2011 um 18:16:10 Uhr
Goto Top
Hallo Biber,

Wenn ich mir deine Frage so überlege, kann es sein dass
ich falsch angefangen habe.

Der Code an sich läuft in einer Wordvorlage, wenn ein neues Dokument aufgemacht wird.
Der Verweis auf "Microsoft ActiveX Data Objects 2.x Library" ist gesetzt.

Ich habe eine Tabelle mit mehreren Spalten. (Referate,Emailaddys)
in jeder Spalte stehen die Einträge der jeweiligen Dropdownmenüs

Ich will praktisch aus einer Tabelle nur eine definierte Spalte lesen lassen und diese ans "Dropdownmenü" übergeben.

Die Fehlermeldung die ich erhalte:

Error!
3705
Der Vorgang ist für ein geöffnetes Objekt nicht zugelassen.

Der Folgende Code zum schließen des ersten Objekts hat nicht funktioniert.

 With ActiveDocument.FormFields("DDeml").DropDown.ListEntries  
     .Clear
     Do
         .Add abc![Emailaddys]
         abc.MoveNext
     Loop Until abc.EOF

rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End With

Danke für deine Mühe,
Ich bin schon das ganze Wochenende dran.. ;)

Hier noch mal der vollständige Code

 Private Sub Document_New()
 On Error GoTo Document_Open_Err
 Dim cnn As New ADODB.Connection
 Dim rst As New ADODB.Recordset
 Dim abc As New ADODB.Recordset
 Dim DBLocation As String
       

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
     "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb"  
     rst.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _  
     cnn, adOpenStatic
 rst.MoveFirst
  
 ' Dropdown Referate füllen  
 With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries  
     .Clear
     Do
         .Add rst![Referate]
         rst.MoveNext
     Loop Until rst.EOF
 
 rst.Close
 cnn.Close
 Set rst = Nothing
 Set cnn = Nothing
 
End With
 
  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
    "Data Source=F:\Excel und Formulare\New\Formobjekte.mdb"  
     abc.Open "SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues;", _  
     cnn, adOpenStatic
 abc.MoveFirst
 
 ' Dropdown Emailaddys füllen  
 With ActiveDocument.FormFields("DDeml").DropDown.ListEntries  
     .Clear
     Do
         .Add abc![Emailaddys]
         abc.MoveNext
     Loop Until abc.EOF
 
 abc.Close
 cnn.Close
 Set abc = Nothing
 Set cnn = Nothing
 
End With
 

Document_Open_Exit:
 On Error Resume Next
 rst.Close
 cnn.Close
 Set rst = Nothing
 Set cnn = Nothing
 
 Exit Sub
 
Document_Open_Err:
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"  
Resume Document_Open_Exit
Return
      
End Sub
 

Dabei bekomme ich die folgende Meldung:
Error!
94
Unzulässige Verwendung von Null
Mitglied: Biber
Biber 08.05.2011 um 19:08:08 Uhr
Goto Top
Moin robcomboy,

also: du hast zwar zwei RecordSet-Objecte für die beiden unterschiedlichen SELECTs, aber die kannst du über EINE Connection laufen lassen.
Also nimm /offne/destroye nur EIN cnn-Object.

Zweitens. ist denn dieses (geguttenborgte) "TOP 25" schon hinterfragt? Wie viele "Referate" und "Emailadressen" sind denn da?
Und ein TOP 25 würde ja nur Sinn machen, wenn es z.B. 1000 Datensätze gibt, du aber nur die 25 beliebtesten/größten/häufigsten oder whatever haben willst 8dann brauchst du aber ein "ORDER BY sexappeal" oder ähnliches und solltest einen 25ten Dropdowneintrag für "Andere" anlegen.

Du willst das wirklich in eine word-"Vorlage" trümmern oder in ein Word-"Dokument?

Grüße
Biber
Mitglied: robcomboy
robcomboy 08.05.2011 um 19:47:40 Uhr
Goto Top
Hi Biber,

Hier komme ich nicht ganz mit:
/offne/destroye nur EIN cnn-Object.
Ich weiss nicht, wie ich weitere Anfragen an eine
verbundene mdb schicken soll.
Wie würde das in der Umsetzung aussehen?


Das TOP 25 bezieht sich auf die obersten 25 Einträge,
standardmäßig kann ein Word Dropdownmenü nur 25 Einträge
aufnehmen. Es soll da zwar eine Möglichkeit geben um 50
unter zu bringen, aber wie weiss ich nicht.

Ne, das ganze soll und muss schon in eine Wordvorlage (*.dotm)

Danke und Grüße,
Robcomboy
Mitglied: Biber
Biber 08.05.2011 um 20:37:11 Uhr
Goto Top
Moin robcomboy,

ah so, die Restriktion mit max. 25 dropdown-Einträgen kannte ich nicht. Okay, dann ist TOP 25 wohl sinnig.

Zum Connection öffnen:

Zusrand jetzt:
Du offnest ein cnn-Object (Connection)
Mit diesem cnn erschaffst du dir ein rst-Recordset, machst irgendwas damit, machst rst wieder platt (neudeutsch: destroy)
Dann machst du das cnn-Object platt
Du offnest ein cnn-Object (Connection)
Mit diesem cnn erschaffst du dir ein abc-Recordset, machst irgendwas damit, machst abc wieder platt (neudeutsch: destroy)
Dann machst du das cnn-Object platt

Zustand neu:

Du offnest ein cnn-Object (Connection)
Mit diesem cnn erschaffst du dir ein rst-Recordset, machst irgendwas damit, machst rst wieder platt (neudeutsch: destroy)
Mit diesem cnn erschaffst du dir ein abc-Recordset, machst irgendwas damit, machst abc wieder platt (neudeutsch: destroy)
Dann machst du das cnn-Object platt

Siehst du, welche Aktionen du einfach löschen (oder meinetwegen auskommentieren) kannst?

Grüße
Biber
Mitglied: robcomboy
robcomboy 08.05.2011 um 21:59:58 Uhr
Goto Top
Hi Biber

So, ich habe den Code nun noch einmal umgestellt,
hatte das auch vorher schon mal versucht, ohne Erfolg.

Wenn es darum geht die zweite Spalte aus der verbundenen DB zu lesen,
bekomme ich wieder die folgende Fehlermeldung:


Hier ist der aktuelle Code:
Error!
"94 - Unzulässige Verwendung von Null"


 Private Sub Document_New()
 ' Definitionen  
 On Error GoTo Document_Open_Err
 Dim cnn1 As New ADODB.Connection
 'Dim cnn2 As New ADODB.Connection  
 Dim rst1 As New ADODB.Recordset
 Dim ddle As New ADODB.Recordset
 Dim DBLocation As String
       
' Mit Datenbank verbinden  
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
     "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb"  
     rst1.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _  
     cnn1, adOpenStatic
 rst1.MoveFirst
  
 ' Dropdown Referate füllen  
 With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries  
     .Clear
     Do
     .Add rst1![Referate]
     rst1.MoveNext
     Loop Until rst1.EOF
 
 ' Variablen zurück setzen  
 rst1.Close
 Set rst1 = Nothing
 'cnn1.Close  
 'Set cnn1 = Nothing  
 
End With
    
 ' Daten aus zweiter Spalte lesen  
    'cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
    '"Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb"  
     ddle.Open "SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues;", _  
     cnn1, adOpenStatic
 ddle.MoveFirst
 
 ' Dropdown Emailaddys füllen  
 With ActiveDocument.FormFields("DDemls").DropDown.ListEntries  
     .Clear
     Do
     .Add ddle![Emailaddys]
     ddle.MoveNext
     Loop Until ddle.EOF
 
 ddle.Close
 Set ddle = Nothing
 'cnn1.Close  
 'Set cnn1 = Nothing  
 
End With
 

Document_Open_Exit:
 On Error Resume Next
 
 rst1.Close
 cnn1.Close
 Set rst1 = Nothing
 Set cnn1 = Nothing
 
 ddle.Close
 cnn2.Close
 Set ddle = Nothing
 Set cnn2 = Nothing
 
 Exit Sub
 
Document_Open_Err:
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"  
Resume Document_Open_Exit
Return
      
End Sub
 

Ich habe nicht genug VB wissen, liegt es am Syntax?

Grüße,
Robcomboy
Mitglied: Biber
Biber 08.05.2011 um 22:20:57 Uhr
Goto Top
Moin robcomboy,

du hast noch zwei Zeilen zuwenig auskommentiert; cnn2.close und Set cnn2 = nothing.
Die erste davon könnte den Fehler produzieren.

Zweiter Frage: eine Abfrage
SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues
...bringt das gweünschte Ergebnis?

Grüße
Biber
Mitglied: robcomboy
robcomboy 09.05.2011 um 06:52:55 Uhr
Goto Top
Hi Biber
da simma wieder.

Das Auskommentieren der beiden Zeilen hat keinen Einfluss auf das Funktionieren
da ich die Verbindung zwar definiere, aber nicht benutze..
Der obere Teil, also das füllen des ersten Dropdowns funktioniert (Code unten).
Im Fall des Füllens des ersten Dropdownmenüs bringt der Code das gewünschte
Ergebnis.
Was das Füllen des zweiten Dropdownmenüs angeht erhalte ich hier die besagte Fehlermeldung.


 Private Sub Document_New()
 ' Definitionen  
 On Error GoTo Document_Open_Err
 Dim cnn1 As New ADODB.Connection
 'Dim cnn2 As New ADODB.Connection  
 Dim rst1 As New ADODB.Recordset
 Dim ddle As New ADODB.Recordset
 Dim DBLocation As String
       
' Mit Datenbank verbinden  
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _  
     "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb"  
     rst1.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _  
     cnn1, adOpenStatic
 rst1.MoveFirst
  
 ' Dropdown Referate füllen  
 With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries  
     .Clear
     Do
     .Add rst1![Referate]
     rst1.MoveNext
     Loop Until rst1.EOF
 
 ' Variablen zurück setzen  
 rst1.Close
 Set rst1 = Nothing
 'cnn1.Close  
 'Set cnn1 = Nothing  
 
End With


Ich habe auch gerade noch einmal die Bezeichnung der zweiten Spalte "Emailaddys" geändert,
für den Fall, dass es sich daran aufhängt, ohne Erfolg.


Grüße,
Robcomboy
Mitglied: Biber
Biber 09.05.2011 um 07:46:15 Uhr
Goto Top
Moin robcomboy,

tztz, das muss aber zu finden sein.

Nochmal abchecken:
  • Das zweite Dropdownfeld ist vorhanden und heisst auch FormFields("DDemls").?
  • ein SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues im Access bringt 25 Emailadressen?

Grüße
Biber
Mitglied: robcomboy
robcomboy 09.05.2011 um 08:10:58 Uhr
Goto Top
HiHo,

ja, so sehe ich das auch!

Das Dropdownmenü ist vorhanden und heisst auch richtig. (Copy-Paste)
Die Abfrage nach den Mails bringt gar keine Adressen, da ich ja wie gesagt den Fehler bekomme.

Das füllen des ersten Dropdownmenüs funktioniert nach der selben Methode ohne Probleme.

???


Grüße,
Robcomboy
Mitglied: Biber
Biber 09.05.2011 um 08:55:28 Uhr
Goto Top
Sorry, robcomboy,

ich sehe ebensowenig einen offensichtlichen Tippfehler wie du.

Nur noch Varianten zur Fehlereingrenzung fallen mir ein:
a) mal versuchen, NUR das zweite Dropdown mit dem Makro zu füllen (also den rst1-Zweig auskommentieren)
b) mal abwarten, ob eine/r der MitleserInnen etwas sieht.

Grüße
Biber
Mitglied: robcomboy
robcomboy 09.05.2011 um 18:10:17 Uhr
Goto Top
Hi Biber,

Dennoch Danke für deine Hilfe.
Vielleicht hat ja jemand eine Idee, wie man
zwei Abfragen mit einer offenen Verbindung realisiert.


Grüße,
Robcomboy
Mitglied: robcomboy
robcomboy 10.05.2011 um 19:22:54 Uhr
Goto Top
So, Also ich bin ein Schritt weiter .
Der Fehler kommt zustande, wenn aus Access ein Datensatz
ausgelesen wird, bei dem nicht alle "Spalten" gefüllt sind.

Wenn Die Tabelle im Schema so aussieht:
X steht für Wert
"" kein Wert
[Spalte01][Spalte02][Spalte03] 
[X][""][X]  
[X][X][X]
[X][""][""]  

Wenn die Tabelle so aussieht 
[Spalte01][Spalte02][Spalte03] 
[X][X][X]
[X][X][X]
[X][X][X]

Funktioniert die Abfrage.

So, ich habe was gehört von wegen NZ Funktion.
Wenn also jemand weiß, wie ich die SELECT-Abfrage
in eine NZ-Funktion packe, wäre mir sehr geholfen.

Grüße,
Robcomboy
Mitglied: Biber
Biber 10.05.2011 um 19:39:35 Uhr
Goto Top
Hömma robcomboy,

neulich fragte ich doch

SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues
...bringt das gweünschte Ergebnis?
-- wortwörtlich incl. Tippfehler zitiert--

und einen Kommentar später noch mal
ein SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues im Access bringt 25 Emailadressen?

Wie dem auch sei...
SELECT DISTINCT TOP 25 NZ(Emailaddys, "--keine--" ) FROM tblFormValues
...würde dir einen Zusatzeintrag "--keine--" bringen, falls ein oder mehrere Emailadressen nicht eingetragen sind in deiner Access-Tabelle.

SELECT DISTINCT TOP 25 Emailaddys FROM tblFormValues
WHERE EmailAddys IS NOT NULL
...würde dir nur alle vorhandenen/eingegebenen Emailadressen liefern.

Grüße
Biber
Mitglied: robcomboy
robcomboy 10.05.2011 um 20:51:36 Uhr
Goto Top
Da haben wir uns wohl missverstanden, mehrfach sogar!


ddle.Open "SELECT DISTINCT TOP 25 NZ(Emailaddys, "--keine--" ) FROM tblFormValues;", _  
cnn1, adOpenStatic

 wird von VB nach 

ddle.Open "SELECT DISTINCT TOP 25 NZ(Emailaddys," - -keine - -" ) FROM tblFormValues;", _  
cnn1, adOpenStatic

geändert, 

funktioniert leider nicht.
bekomme den folgenden Fehler:

13
Typen unverträglich

Grüße,
Robcomboy
Mitglied: Biber
Biber 10.05.2011 um 22:12:01 Uhr
Goto Top
Moin robcomboy,

ja, das passiert, weil
  • Word ist von einer Redmonder Softwareklitsche
  • Access ist von einer Redmonder Softwareklitsche
  • VBA ist von einer Redmonder Softwareklitsche

und die drei arbeiten nicht so ganz kompatibel.

Noch mal langsam:
SELECT DISTINCT TOP 25 NZ(Emailaddys, "--keine--" ) FROM tblFormValues
---> Das ist das, was du in Access in den SQL-Editor trümmern musst, um die "richtigen" Sätze + ggf. eine Blindniete anzuzeigen.
---> also das "--keine--" in doppelten Anführungszeichen.
---> Empfiehlt Access so, zeigt Access so an, gibt Access auch im Klickibunti-Assistent so vor.

Allerdings kannst du, wenn du besser SQL sprichst als die Praktikanten
auch in Access die einfachen Anführungszeichen nehmen (so sieht es ANSI-SQL vor).

SELECT DISTINCT TOP 25 NZ(Emailaddys, '--keine--' ) FROM tblFormValues
Geht auch in Access.

Das einfache Anführungszeichen wiederum ist in VBA allerdings das Kommentarzeichen,
deshalb werden die Strings in VBA in in doppelte Anführungszeichen gesetzt.

Also musst du den String in VBA so schreiben:
...
ddle.Open "SELECT DISTINCT TOP 25 NZ(Emailaddys,' --keine --' ) FROM tblFormValues;",  _ 
   cnn1, adOpenStatic 
...

Grüße
Biber
Mitglied: robcomboy
robcomboy 11.05.2011 um 20:45:52 Uhr
Goto Top
Hi Biber,

mit der Schreibweise bekomme ich die folgende Fehlermeldung. ;(

-2147217900
Undefinierte Funktion 'NZ' in Ausdruck.


Danke & Grüße,
Robcomboy
Mitglied: Biber
Biber 11.05.2011 um 21:33:56 Uhr
Goto Top
Moin romcomboy,

ja, das passiert, weil

  • Access ist von einer Redmonder Softwareklitsche
  • VBA ist von einer Redmonder Softwareklitsche

und die beiden arbeiten nicht so ganz kompatibel

Ich bekomme beim SQL-Zugriff über den JET-ODBC-Treiber auf eine Access-Tabelle ebenfalls einen "unbekannte Funktion NZ"-Fehler.
Drexcoder, redmonderische.

Machen wir halt einen Workaround.
...
 ddle.Open "SELECT DISTINCT TOP 25 Iif( IsNull(Emailaddys),' --keine --' , EmailAddys) FROM tblFormValues;",  _ 
      cnn1, adOpenStatic
  ...

Ich lass mir doch von Praktikanten keine SQLs verbieten...

Warum die NZ()-Funktion a) in VBA nicht existiert b) im M$-Jet-SQL überhaupt existiert weiss ich nicht.
In der (bzw. meiner) Access-Hilfe wird sie gar nicht erwähnt.

BTW, Workaround und Plan B wäre natürlich sicherzustellen, dass wenigstens 25 ver###te Emailadressen in der Tabelle vorhanden sind.

Grüße
Biber
Mitglied: Biber
Biber 11.05.2011 um 22:11:08 Uhr
Goto Top
Nachtrag:

Zitat von @Biber:
Warum die NZ()-Funktion a) in VBA nicht existiert b) im M$-Jet-SQL überhaupt existiert weiss ich nicht.
In der (bzw. meiner) Access-Hilfe wird sie gar nicht erwähnt.
Ja nee, das war zu ungenau.

Also: etwas ruhiger und logischer aufgedröselt bzw "hergeleitet", wie wir ITler sagen.

  • es existiert eine in SQL nutzbare Nz()-Funktion in der Access-Oberfläche ("Abfrage erstellen")
  • da nutzen JET wie auch ACE (=Acc2007 und höher) das DAO-, nicht das ADO-Modell -> also wissen wir nur, dass es unter DAO funktioniert
  • in VBA existiert ebenfalls eine VBA-Version von Nz()... aber eben in VBA, nicht in Abfragen an ein ADODB-Datenobjekt verfügbar.

--> Ergo: die SQL-Funktion Nz() ist ein reines DAO-Schmankerl, bei einer ADODB-Connection muttu mit IIF() und IsNull() arbeiten.

Und ja, die Nz()-Funktion ist auch bei den RedmonderInnen dokumentiert, aber ....
...die von mir hier hergeleitete klitzekleine Sollbruchstelle ist nicht ganz so deutlich ausformuliert.

Aber da wir das jetzt alles wissen, könnten wir auch einen dritten Workaround zusammenschrubbeln:
....
....
' ... die Emailadressen NUR mit SELECT DISTINCT holen.... lass ruhig einen NULL-Wert kommen...  
 ' Dropdown Emailaddys füllen  
 With ActiveDocument.FormFields("DDemls").DropDown.ListEntries  
     .Clear
     Do
     .Add NZ( ddle![Emailaddys] , " -- keine -- ")    ' denn hier haben wir ja eine VBA-Nz()-Function  
     ddle.MoveNext
     Loop Until ddle.EOF
 
 ddle.Close
 Set ddle = Nothing
....

Grüße
Biber
Mitglied: robcomboy
robcomboy 12.05.2011 um 05:20:37 Uhr
Goto Top
Hi Biber,

Erst mal besten Dank für deine Hilfe!

 ddle.Open "SELECT DISTINCT TOP 25 Iif( IsNull(Emailaddys),' --keine --' , EmailAddys) FROM tblFormValues;",  _    
      cnn1, adOpenStatic 

 ' Dropdown Emailaddys füllen  
 ' ... die Emailadressen NUR mit SELECT DISTINCT holen.... lass ruhig einen NULL-Wert kommen...  
 
With ActiveDocument.FormFields("DDemls").DropDown.ListEntries  
    .Clear
    Do
    .Add NZ(ddle![Emailaddys], " -- keine -- ")      ' denn hier haben wir ja eine VBA-Nz()-Function  
    ddle.MoveNext
    Loop Until ddle.EOF

ddle.Close
Set ddle = Nothing

Beim Schrittweisen debuggen bekomme ich an der Stelle

  .Add NZ(ddle![Emailaddys], " -- keine -- ")      ' denn hier haben wir ja eine VBA-Nz()-Function  

den Folgenden Fehler:

Fehler beim Kompilieren:
Sub oder Function nicht definiert


Danke und Grüße,
Robcomboy
Mitglied: Biber
Biber 12.05.2011 um 11:17:03 Uhr
Goto Top
Moin robcomboy,

Zitat von @robcomboy:
Beim Schrittweisen debuggen bekomme ich an der Stelle

  .Add NZ(ddle![Emailaddys], " -- keine -- ")      ' denn hier haben wir ja eine VBA-Nz()-Function  

den Folgenden Fehler:

Fehler beim Kompilieren:
Sub oder Function nicht definiert
Ja, das passiert, weil

  • Word ist von einer Redmonder Softwareklitsche
  • Access ist von einer Redmonder Softwareklitsche
  • VBA ist von einer Redmonder Softwareklitsche

und die drei arbeiten nicht so ganz kompatibel.

Flüchtige Recherchen eines interessierten Laien und bekennenden Redmonder Praktikanten-Fans ergaben.

  • in Access existiert einer VBA-Nz()-implementierung
Function Nz(Value, [ValueIfNull])
    Element von Access.Application
  • in Word existiert keine VBA-Nz()-implementierung
##&@??!

--> diesen erneuten DAU-Leimer könnten wir auch wieder umschiffen, indem du im Word-VBA-Editor noch einen zusätzlichen Verweis auf die "Microsoft Access 11.0 (oder 12.0) Object Library " machst.

Is' sich aber langsam albern.
Nimm einen von den anderen Workarounds (als nimm eine IF/IIF() -Konstruktion und prüfe auf NULL)

BTW, wir plaudern ja nur so lange über diesen Mist, weil dir "irgendwer was von der Nz()-Funktion erzählt hat", hmmm?
Sollte derjenige dich wieder mal besuchen - hau ihm eine aufs Maul von mir.

Grüße
Biber
Mitglied: robcomboy
robcomboy 14.05.2011 um 22:35:49 Uhr
Goto Top
Hallo Biber,

Erst einmal Danke für deine Hilfe bei diesem Problem.
Ich habe das ganze nun über eine SQL-Abfrage geregelt.

Ausgangsituation:
-> Wordvorlage-Formular mit Dropdownmenü
-> Access Datenbank mit entsprechender Tabelle
-> Die Einträge einer Spalte werden in das benannte Dropdownmenü geschrieben.
-> Leere Felder in der Spalte werden ignoriert


Das Ganze hat den Vorteil, dass man allen Formulare eine Zentrale Stelle für
deren Inhalte hinterlegen kann, so muss man nicht jedes Formular einzeln anfassen
wenn man neue Werte in die Dropdownmenüs oder anderen Felder einfügen will.
Die aktuellsten Daten werden beim Öffnen des Dokuments gezogen.

Grüße und Vielen Dank
Robcomboy

Hier also der Code:
Hier wird nur ein Feld gefüllt, weitere können aber nach der Selben Methode hinzugefügt werden.

Private Sub Document_New()

'Definitionen  
On Error GoTo Document_Open_Err

Dim cnn1 As New ADODB.Connection
Dim rst1 As New ADODB.Recordset

Dim strSQL As String
Dim dbPfad As Variant

'#######################################################################################################  
'#######################################################################################################  
 
' Mit Datenbank verbinden  
'###############################  
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=Z:\Ablage\Formularobjekte\Formobjekte.mdb"  
 
'#######################################################################################################  
'#######################################################################################################  
 
' SPALTE AUSLESEN  
'###############################  
rst1.Open "SELECT TOP 25 Emailadressen FROM " & "tblFormValues" & " WHERE Emailadressen is not null ", cnn1, adOpenStatic  
rst1.MoveFirst
  
' DROPDOWN EMAIL-ADRESSEN FÜLLEN  
'###############################  
With ActiveDocument.FormFields("DDemls").DropDown.ListEntries  
	.Clear
	Do
	.Add rst1![Emailadressen]
	rst1.MoveNext
	Loop Until rst1.EOF
 
 GoSub Reset_Variables
 End With
 
Reset_Variables:
' VARIABLEN ZURÜCKSETZEN  
'###############################  
  
rst1.Close
Set rst1 = Nothing

Return

' VOR DEM BEENDEN  
'###############################  
Document_Open_Exit:
On Error Resume Next
 
rst1.Close
cnn1.Close
Set rst1 = Nothing
Set cnn1 = Nothing

Exit Sub

' FEHLERBEHANDLUNG  
'###############################  
Document_Open_Err:
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"  
Resume Document_Open_Exit
Return
      
End Sub