Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Microsoft Microsoft Office

Mitglied: robcomboy

robcomboy (Level 1) - Jetzt verbinden

08.05.2011, aktualisiert 01:39 Uhr, 6560 Aufrufe, 24 Kommentare

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
Mitglied: Biber
08.05.2011 um 14:02 Uhr
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
Bitte warten ..
Mitglied: robcomboy
08.05.2011 um 16:52 Uhr
Hi Biber

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

01.
 
02.
Private Sub Document_New() 
03.
     On Error GoTo Document_Open_Err 
04.
     Dim cnn As New ADODB.Connection 
05.
     Dim rst As New ADODB.Recordset 
06.
     Dim abc As New ADODB.Recordset 
07.
     Dim DBLocation As String 
08.
           
09.
 
10.
     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
11.
         "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb" 
12.
         rst.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _ 
13.
         cnn, adOpenStatic 
14.
     rst.MoveFirst 
15.
      
16.
     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
17.
        "Data Source=F:\Excel und Formulare\New\Formobjekte.mdb" 
18.
         abc.Open "SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues;", _ 
19.
         cnn, adOpenStatic 
20.
     abc.MoveFirst 
21.
      
22.
     ' Dropdown Referate füllen 
23.
     With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries 
24.
         .Clear 
25.
         Do 
26.
             .Add rst![Referate] 
27.
             rst.MoveNext 
28.
         Loop Until rst.EOF 
29.
     
30.
    End With 
31.
     
32.
     With ActiveDocument.FormFields("DDeml").DropDown.ListEntries 
33.
         .Clear 
34.
         Do 
35.
             .Add abc![Emailaddys] 
36.
             abc.MoveNext 
37.
         Loop Until abc.EOF 
38.
    End With 
39.
     
40.
     
41.
Document_Open_Exit: 
42.
     On Error Resume Next 
43.
     rst.Close 
44.
     cnn.Close 
45.
     Set rst = Nothing 
46.
     Set cnn = Nothing 
47.
     
48.
     Exit Sub 
49.
 
50.
Document_Open_Err: 
51.
     MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!" 
52.
     Resume Document_Open_Exit 
53.
     Return 
54.
      
55.
End Sub 
56.
 
Bekomme Fehlermeldungen, die ich nicht
abstellen kann. Bin Neu in VB.

Grüße,
robcomboy
[Edit Biber] Codeformatierung berichtigt. [/Edit]
Bitte warten ..
Mitglied: Biber
08.05.2011 um 17:27 Uhr
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
Bitte warten ..
Mitglied: robcomboy
08.05.2011 um 18:16 Uhr
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.

01.
 With ActiveDocument.FormFields("DDeml").DropDown.ListEntries 
02.
     .Clear 
03.
     Do 
04.
         .Add abc![Emailaddys] 
05.
         abc.MoveNext 
06.
     Loop Until abc.EOF 
07.
 
08.
rst.Close 
09.
cnn.Close 
10.
Set rst = Nothing 
11.
Set cnn = Nothing 
12.
End With 
13.
 
Danke für deine Mühe,
Ich bin schon das ganze Wochenende dran.. ;)

Hier noch mal der vollständige Code

01.
 
02.
 Private Sub Document_New() 
03.
 On Error GoTo Document_Open_Err 
04.
 Dim cnn As New ADODB.Connection 
05.
 Dim rst As New ADODB.Recordset 
06.
 Dim abc As New ADODB.Recordset 
07.
 Dim DBLocation As String 
08.
        
09.
 
10.
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
11.
     "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb" 
12.
     rst.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _ 
13.
     cnn, adOpenStatic 
14.
 rst.MoveFirst 
15.
   
16.
 ' Dropdown Referate füllen 
17.
 With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries 
18.
     .Clear 
19.
     Do 
20.
         .Add rst![Referate] 
21.
         rst.MoveNext 
22.
     Loop Until rst.EOF 
23.
  
24.
 rst.Close 
25.
 cnn.Close 
26.
 Set rst = Nothing 
27.
 Set cnn = Nothing 
28.
  
29.
End With 
30.
  
31.
  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
32.
    "Data Source=F:\Excel und Formulare\New\Formobjekte.mdb" 
33.
     abc.Open "SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues;", _ 
34.
     cnn, adOpenStatic 
35.
 abc.MoveFirst 
36.
  
37.
 ' Dropdown Emailaddys füllen 
38.
 With ActiveDocument.FormFields("DDeml").DropDown.ListEntries 
39.
     .Clear 
40.
     Do 
41.
         .Add abc![Emailaddys] 
42.
         abc.MoveNext 
43.
     Loop Until abc.EOF 
44.
  
45.
 abc.Close 
46.
 cnn.Close 
47.
 Set abc = Nothing 
48.
 Set cnn = Nothing 
49.
  
50.
End With 
51.
  
52.
 
53.
Document_Open_Exit: 
54.
 On Error Resume Next 
55.
 rst.Close 
56.
 cnn.Close 
57.
 Set rst = Nothing 
58.
 Set cnn = Nothing 
59.
  
60.
 Exit Sub 
61.
  
62.
Document_Open_Err: 
63.
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!" 
64.
Resume Document_Open_Exit 
65.
Return 
66.
       
67.
End Sub 
68.
 
Dabei bekomme ich die folgende Meldung:
Error!
94
Unzulässige Verwendung von Null
Bitte warten ..
Mitglied: Biber
08.05.2011 um 19:08 Uhr
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
Bitte warten ..
Mitglied: robcomboy
08.05.2011 um 19:47 Uhr
Hi Biber,

Hier komme ich nicht ganz mit:
01.
/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
Bitte warten ..
Mitglied: Biber
08.05.2011 um 20:37 Uhr
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
Bitte warten ..
Mitglied: robcomboy
08.05.2011 um 21:59 Uhr
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"


01.
 
02.
 Private Sub Document_New() 
03.
 ' Definitionen 
04.
 On Error GoTo Document_Open_Err 
05.
 Dim cnn1 As New ADODB.Connection 
06.
 'Dim cnn2 As New ADODB.Connection 
07.
 Dim rst1 As New ADODB.Recordset 
08.
 Dim ddle As New ADODB.Recordset 
09.
 Dim DBLocation As String 
10.
        
11.
' Mit Datenbank verbinden 
12.
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
13.
     "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb" 
14.
     rst1.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _ 
15.
     cnn1, adOpenStatic 
16.
 rst1.MoveFirst 
17.
   
18.
 ' Dropdown Referate füllen 
19.
 With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries 
20.
     .Clear 
21.
     Do 
22.
     .Add rst1![Referate] 
23.
     rst1.MoveNext 
24.
     Loop Until rst1.EOF 
25.
  
26.
 ' Variablen zurück setzen 
27.
 rst1.Close 
28.
 Set rst1 = Nothing 
29.
 'cnn1.Close 
30.
 'Set cnn1 = Nothing 
31.
  
32.
End With 
33.
     
34.
 ' Daten aus zweiter Spalte lesen 
35.
    'cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
36.
    '"Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb" 
37.
     ddle.Open "SELECT DISTINCT TOP 25 [Emailaddys] FROM tblFormValues;", _ 
38.
     cnn1, adOpenStatic 
39.
 ddle.MoveFirst 
40.
  
41.
 ' Dropdown Emailaddys füllen 
42.
 With ActiveDocument.FormFields("DDemls").DropDown.ListEntries 
43.
     .Clear 
44.
     Do 
45.
     .Add ddle![Emailaddys] 
46.
     ddle.MoveNext 
47.
     Loop Until ddle.EOF 
48.
  
49.
 ddle.Close 
50.
 Set ddle = Nothing 
51.
 'cnn1.Close 
52.
 'Set cnn1 = Nothing 
53.
  
54.
End With 
55.
  
56.
 
57.
Document_Open_Exit: 
58.
 On Error Resume Next 
59.
  
60.
 rst1.Close 
61.
 cnn1.Close 
62.
 Set rst1 = Nothing 
63.
 Set cnn1 = Nothing 
64.
  
65.
 ddle.Close 
66.
 cnn2.Close 
67.
 Set ddle = Nothing 
68.
 Set cnn2 = Nothing 
69.
  
70.
 Exit Sub 
71.
  
72.
Document_Open_Err: 
73.
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!" 
74.
Resume Document_Open_Exit 
75.
Return 
76.
       
77.
End Sub 
78.
  
79.
 
80.
 
Ich habe nicht genug VB wissen, liegt es am Syntax?

Grüße,
Robcomboy
Bitte warten ..
Mitglied: Biber
08.05.2011 um 22:20 Uhr
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
Bitte warten ..
Mitglied: robcomboy
09.05.2011 um 06:52 Uhr
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.


01.
 Private Sub Document_New() 
02.
 ' Definitionen 
03.
 On Error GoTo Document_Open_Err 
04.
 Dim cnn1 As New ADODB.Connection 
05.
 'Dim cnn2 As New ADODB.Connection 
06.
 Dim rst1 As New ADODB.Recordset 
07.
 Dim ddle As New ADODB.Recordset 
08.
 Dim DBLocation As String 
09.
        
10.
' Mit Datenbank verbinden 
11.
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
12.
     "Data Source=F:\ExcelundFormulare\New\Formobjekte.mdb" 
13.
     rst1.Open "SELECT DISTINCT TOP 25 [Referate] FROM tblFormValues;", _ 
14.
     cnn1, adOpenStatic 
15.
 rst1.MoveFirst 
16.
   
17.
 ' Dropdown Referate füllen 
18.
 With ActiveDocument.FormFields("DDReferate").DropDown.ListEntries 
19.
     .Clear 
20.
     Do 
21.
     .Add rst1![Referate] 
22.
     rst1.MoveNext 
23.
     Loop Until rst1.EOF 
24.
  
25.
 ' Variablen zurück setzen 
26.
 rst1.Close 
27.
 Set rst1 = Nothing 
28.
 'cnn1.Close 
29.
 'Set cnn1 = Nothing 
30.
  
31.
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
Bitte warten ..
Mitglied: Biber
09.05.2011 um 07:46 Uhr
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
Bitte warten ..
Mitglied: robcomboy
09.05.2011 um 08:10 Uhr
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
Bitte warten ..
Mitglied: Biber
09.05.2011 um 08:55 Uhr
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
Bitte warten ..
Mitglied: robcomboy
09.05.2011 um 18:10 Uhr
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
Bitte warten ..
Mitglied: robcomboy
10.05.2011 um 19:22 Uhr
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
01.
[Spalte01][Spalte02][Spalte03]  
02.
[X][""][X] 
03.
[X][X][X] 
04.
[X][""][""] 
05.
 
06.
Wenn die Tabelle so aussieht  
07.
[Spalte01][Spalte02][Spalte03]  
08.
[X][X][X] 
09.
[X][X][X] 
10.
[X][X][X] 
11.
 
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
Bitte warten ..
Mitglied: Biber
10.05.2011 um 19:39 Uhr
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
Bitte warten ..
Mitglied: robcomboy
10.05.2011 um 20:51 Uhr
Da haben wir uns wohl missverstanden, mehrfach sogar!


01.
ddle.Open "SELECT DISTINCT TOP 25 NZ(Emailaddys, "--keine--" ) FROM tblFormValues;", _ 
02.
cnn1, adOpenStatic 
03.
 
04.
 wird von VB nach  
05.
 
06.
ddle.Open "SELECT DISTINCT TOP 25 NZ(Emailaddys," - -keine - -" ) FROM tblFormValues;", _ 
07.
cnn1, adOpenStatic 
08.
 
09.
geändert, 
funktioniert leider nicht.
bekomme den folgenden Fehler:

13
Typen unverträglich

Grüße,
Robcomboy
Bitte warten ..
Mitglied: Biber
10.05.2011 um 22:12 Uhr
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
Bitte warten ..
Mitglied: robcomboy
11.05.2011 um 20:45 Uhr
Hi Biber,

mit der Schreibweise bekomme ich die folgende Fehlermeldung. ;(

-2147217900
Undefinierte Funktion 'NZ' in Ausdruck.


Danke & Grüße,
Robcomboy
Bitte warten ..
Mitglied: Biber
11.05.2011 um 21:33 Uhr
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
Bitte warten ..
Mitglied: Biber
11.05.2011 um 22:11 Uhr
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:
01.
.... 
02.
.... 
03.
' ... die Emailadressen NUR mit SELECT DISTINCT holen.... lass ruhig einen NULL-Wert kommen... 
04.
 ' Dropdown Emailaddys füllen 
05.
 With ActiveDocument.FormFields("DDemls").DropDown.ListEntries 
06.
     .Clear 
07.
     Do 
08.
     .Add NZ( ddle![Emailaddys] , " -- keine -- ")    ' denn hier haben wir ja eine VBA-Nz()-Function 
09.
     ddle.MoveNext 
10.
     Loop Until ddle.EOF 
11.
  
12.
 ddle.Close 
13.
 Set ddle = Nothing 
14.
....
Grüße
Biber
Bitte warten ..
Mitglied: robcomboy
12.05.2011 um 05:20 Uhr
Hi Biber,

Erst mal besten Dank für deine Hilfe!

01.
 ddle.Open "SELECT DISTINCT TOP 25 Iif( IsNull(Emailaddys),' --keine --' , EmailAddys) FROM tblFormValues;",  _   
02.
      cnn1, adOpenStatic  
03.
 
04.
 ' Dropdown Emailaddys füllen 
05.
 ' ... die Emailadressen NUR mit SELECT DISTINCT holen.... lass ruhig einen NULL-Wert kommen... 
06.
  
07.
With ActiveDocument.FormFields("DDemls").DropDown.ListEntries 
08.
    .Clear 
09.
    Do 
10.
    .Add NZ(ddle![Emailaddys], " -- keine -- ")      ' denn hier haben wir ja eine VBA-Nz()-Function 
11.
    ddle.MoveNext 
12.
    Loop Until ddle.EOF 
13.
 
14.
ddle.Close 
15.
Set ddle = Nothing
Beim Schrittweisen debuggen bekomme ich an der Stelle

01.
  .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
Bitte warten ..
Mitglied: Biber
12.05.2011 um 11:17 Uhr
Moin robcomboy,

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

01.
  .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
Bitte warten ..
Mitglied: robcomboy
14.05.2011 um 22:35 Uhr
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.

01.
Private Sub Document_New() 
02.
 
03.
'Definitionen 
04.
On Error GoTo Document_Open_Err 
05.
 
06.
Dim cnn1 As New ADODB.Connection 
07.
Dim rst1 As New ADODB.Recordset 
08.
 
09.
Dim strSQL As String 
10.
Dim dbPfad As Variant 
11.
 
12.
'####################################################################################################### 
13.
'####################################################################################################### 
14.
  
15.
' Mit Datenbank verbinden 
16.
'############################### 
17.
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=Z:\Ablage\Formularobjekte\Formobjekte.mdb" 
18.
  
19.
'####################################################################################################### 
20.
'####################################################################################################### 
21.
  
22.
' SPALTE AUSLESEN 
23.
'############################### 
24.
rst1.Open "SELECT TOP 25 Emailadressen FROM " & "tblFormValues" & " WHERE Emailadressen is not null ", cnn1, adOpenStatic 
25.
rst1.MoveFirst 
26.
   
27.
' DROPDOWN EMAIL-ADRESSEN FÜLLEN 
28.
'############################### 
29.
With ActiveDocument.FormFields("DDemls").DropDown.ListEntries 
30.
	.Clear 
31.
	Do 
32.
	.Add rst1![Emailadressen] 
33.
	rst1.MoveNext 
34.
	Loop Until rst1.EOF 
35.
  
36.
 GoSub Reset_Variables 
37.
 End With 
38.
  
39.
Reset_Variables: 
40.
' VARIABLEN ZURÜCKSETZEN 
41.
'############################### 
42.
   
43.
rst1.Close 
44.
Set rst1 = Nothing 
45.
 
46.
Return 
47.
 
48.
' VOR DEM BEENDEN 
49.
'############################### 
50.
Document_Open_Exit: 
51.
On Error Resume Next 
52.
  
53.
rst1.Close 
54.
cnn1.Close 
55.
Set rst1 = Nothing 
56.
Set cnn1 = Nothing 
57.
 
58.
Exit Sub 
59.
 
60.
' FEHLERBEHANDLUNG 
61.
'############################### 
62.
Document_Open_Err: 
63.
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!" 
64.
Resume Document_Open_Exit 
65.
Return 
66.
       
67.
End Sub 
68.
 
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Microsoft Office
gelöst Excel Daten automatisch in mehrere Exceldateien exportieren (9)

Frage von paggo69 zum Thema Microsoft Office ...

LAN, WAN, Wireless
Freifunk über vorhandene Access Points ausstrahlen (2)

Frage von Uwoerl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Direct Access mit VPN aufbau (6)

Frage von geocast zum Thema Windows Netzwerk ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...