Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Objekt- oder With-Blockvariablen nicht festgelegt

Begonnen von Wolfi59, Mai 31, 2024, 20:25:55

⏪ vorheriges - nächstes ⏩

Wolfi59

Guten Abend in die Runde, ich sitze nun seit Stunden an einem Problem, dass für mich nicht nachvollziehbar ist.

Nach der Umstellung einer Access mdb auf accdb tritt folgender Fehler auf:
In der Zeile ,Selection.InsertRowsBelow" stoppt der Ablauf und gibt die Fehlermeldung aus, dass Objekt- oder With-Blockvariablen nicht festgelegt sind.

Die Funktion läuft in der mdb jedoch fehlerfrei durch, in der accdb nicht


Der einzige Unterschied von der *.mdb zur accdb sind zwei Verweise.
In der mdb ist der Verweis Microsoft DAO 3.6 Objekt Library aktiv.
In der accdb ist der Verweis nicht aktiv, dafür aber Microsoft Office 16.0 Access Database engine Objekt Library.


Die Funktion gibt die Einträge einer Tabelle an eine Worddatei weiter in der die Tabelle 4 gefüllt wird.

Die Varablen X und Y werden etliche Zeilen weiter oben als Long festgelegt.

Ich weiß nicht mehr wo ich noch suchen soll und hoffe das ich hier die notwendige Hilfe bekommen kann. Nach jedem Durchlauf wird eine weitere Zeile angehängt und befüllt.


'Recordset rs0 (Drucktabelle) öffnen

Dim db0 As DAO.Database
Dim rs0 As Recordset
Set db0 = CurrentDb
Set rs0 = db0.OpenRecordset("SELECT [05 Kalk_Drucktabelle].* FROM [05 Kalk_Drucktabelle] ORDER BY [05 Kalk_Drucktabelle].Position;")
x = 1
rs0.MoveFirst

Do While Not rs0.EOF
    ActiveDocument.Tables(4).Rows(1).Select
    Selection.InsertRowsBelow  'hier wird der Ablauf unterbrochen
rs0.MoveNext
    x = x + 1
Loop

'Die erforderlichen Einträge in Tabelle4 erzeugen
x = 1
rs0.MoveFirst
Do While Not rs0.EOF
    With wDoc.Tables(4)
        .Cell(x, 1).Range.Text = rs0!Position
        .Cell(x, 2).Range.Text = rs0!LvBez
        .Cell(x, 3).Range.Text = rs0!Anzahl
        .Cell(x, 4).Range.Text = rs0!Einheit
        .Cell(x, 5).Range.Text = Format(rs0!Gesamt_Preis, "#,##0.00 €")
        .Cell(x, 6).Range.Text = Format(rs0!EndpreisEu, "#,##0.00 €")
    End With
    rs0.MoveNext
  x = x + 1
Loop
Set rs0 = Nothing
Set db0 = Nothing
wDoc.Fields.Update

ebs17

Wenn bisher etwas geklappt hat, warst Du im Tunnel des Glücks und des Zufalls und gewisser Fehlertoleranz von was auch immer.

Die genannte Fehlermeldung ist typisch für eine unsaubere Referenzierung von Objekten.
VBA in Word würde mit ActiveDocument und Selection meist etwas anfangen können, für VBA aus Access heraus sind das unbekannte Wesen.
Damit diese Wesen verwendbar werden, müssen sie sauber und durchgehend entsprechend dem Objektmodell referenziert werden.

Ein Document wie auch ActiveDocument ist ein Objekt einer Wordapplication (Instanz von Word). Es sollte also im Vorfeld eine Wordinstanz bereitgestellt sein, auf die dann verwiesen werden kann.
Selection sollte ebenso ein Objekt von (Word)Apllication sein (nachschlagen im Objektkatalog).

    objWord.ActiveDocument.Tables(4).Rows(1).Select
    ' besser: wDoc.Tables(4).Rows(1).Select
    objWord.Selection.InsertRowsBelow

Daneben gibt es weitere Unsauberkeiten: Später fällt wDoc vom Himmel. Warum nutzt Du die Objektvariable nicht sofort statt ActiveDocument? Die Referenzierung ist sauberer und schneller.
Es fehlt ein Schließen des Recordsets. Das wäre wichtiger als das Setzen der Objektvariablen auf Nothing, womit nur der Verweis auf den belegten Speicher aufgehoben wird.
Mit freundlichem Glück Auf!

Eberhard

Wolfi59

Danke, auch für die schnelle Reaktion auf meine Frage.  Das ist die Lösung des Problems gewesen.
Das Recordset wird nun auch geschlossen. Man lernt eben nie aus :-)

rs0.Close
Set rs0 = Nothing
Set db0 = Nothing