Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Endlosformular an Word übergeben

Begonnen von Rivside, November 08, 2019, 09:29:31

⏪ vorheriges - nächstes ⏩

Rivside

Hallo zusammen,

ich möchte angehackte Datensätze über ein Kontrollkästchen an Word übergeben. Das funktioniert aber soweit nicht.

Problem 1: selbst mit Funktion If werden alle Datensätze freigegeben, Access unterscheidet nicht ob angekreuzt oder nicht
Problem 2: da wird immer nur aktueller Datensatz übergeben. Ich hab es zwar hinbekommen mit GoToRecord, aber das ist ja eh falsch.

Private Sub Befehl219_Click()
Dim rsf As Recordset
Set rsf = Me.RecordsetClone
'rsf.MoveFirst
'Do Until rsf.EOF
'With rsf
    If Me.Kontrollkästchen2 = True Then
        Set objWord = CreateObject("Word.Application")
        With objWord
        objWord.Visible = True
        objWord.Documents.Open ("vorlage")
            rsf.MoveFirst
           
            .ActiveDocument.Bookmarks("WE").Select
            .Selection.Range.Text = CStr([Text43])
            .ActiveDocument.Bookmarks("Artikel").Select
            .Selection.Range.Text = CStr([Text7])
            DoCmd.GoToRecord , , acNext
            .ActiveDocument.Bookmarks("Artikel2").Select
            .Selection.Range.Text = CStr([Text7])
        End With
    Else: MsgBox ("Kein Artikel ausgewählt")
    End If
'End With
'Loop
End Sub


Was mache ich falsch?

markusxy

So wie es aussieht, nutzt du das Recordset bei der Übergabe überhaupt nicht.
Die Werte werden ja aus den Formular Feldern gelesen.
Da du aber mit einem Clone arbeitest, sind die Werte völlig unabhängig von einander.

Bei einem Clone solltest du die Werte direkt aus dem Recordset und nicht die aus den Formular Feldern verwenden.

Rivside

Hallo Markus,

danke für dein Antwort. Wie kann ich die Felder ansprechen?


DF6GL

Hallo,

z. B.:

.Selection.Range.Text = CStr(rsf!Text43)


wobei "Text43" eine kaum zu glaubende Aussagekraft besitzt.

Rivside

DF6GL, danke! Wie dumm von mir, ich sollte vielleicht vorher dran denken dass ich die Steuerelemente auswählen soll.

Ich kriege jetzt aber leider nicht das mit dem Kontrollhäckchen hin...

If Me.Kontrollkästchen2 = True Then

Dies kontrolliert nur ob beim aktuellen DS das Häckchen True ist. Ich habe schon versucht mit rsf! / rsf. den richtigen Steuerelement zu wählen aber der Kompiler findet ihn nicht.

Das Hauptproblem im Moment ist dass der Recordset nicht unterscheiden kann ob ja/nein. Ich steuere alles zwar mit rsf.MoveNext, aber selbst wenn der DS nicht mit dem "Häckchen" angekreuzt ist, wird dieser trotzdem angezeigt.

Kannst mir bitte nur mit diesem kurz helfen? Dann bin ich eigentlich durch...

MfG

DF6GL

Hallo,


If rsf!Kontrollkästchen2 = True Then

wenn das boolsche Tabellen(!)-Feld (in der Datenherkunft) auch "Kontrollkästchen2" heißt.

Prinzipiell:

If rsf!DeinTabellenBoolFeld Then

Rivside

Hallo DF6GL,

erstmal danke dir ganz herzlich für deine Hilfe.

Das funktioniert leider nicht. Wenn ich die Daten vom RS-Kontrollkästchen übernehme, selbst wenn die DS angehackt sind diese nicht erkennbar. Ich habe schon kurz nachgedacht und festgestellt dass die in der Abfrage erst angehackt werden müssen. Wenn ich die Daten zB. mit Requery aktualisiere, wurde das höchstwahrscheinlich funktionieren aber in dem Moment sind die Datensätze natürlich weg, weil ich in der Abfrage eine Kriterium habe mit Kontrollkästchen = 0. Warum erkennt der RS die Häkchen im Formular nicht? Mit Me.Kontrollkästchen funktioniert das super, aber halt nur für den aktuellen Datensatz.

Private Sub Befehl219_Click()
Dim rs As Recordset
Set rs = Me.RecordsetClone
Set objWord = CreateObject("Word.Application")

    If rs!Freigabe = True Then
        rs.MoveFirst
        objWord.Visible = True
        objWord.Documents.Open ("")
        objWord.ActiveDocument.Bookmarks("Artikel").Select
        objWord.Selection.Range.Text = CStr(rs!Artikel)
        rs.MoveNext
        objWord.ActiveDocument.Bookmarks("Artikel2").Select
        objWord.Selection.Range.Text = CStr(rs!Artikel)
    Else: MsgBox ("Kein Datensatz ausgewählt")
    End If
End Sub


Was kann ich hier evtl. tun? Ich will nur die angekreuzte Datensätze in Word transportieren....

DF6GL

Hallo,

vielleicht hilft:

.
Dim rs As Dao.Recordset
Me.Dirty = False
Set rs = Me.RecordsetClone
.

Rivside

Super, das hat funktioniert!

Das einzige was ich jetzt am ende nicht hinkriege ist recordset.MoveNext aber bis zum nächsten durch Kontrollkästchen angekreuzten DS. Gibt's da eine Suchkriterium in recordset.MoveNext zB. recordset.MoveNext(rs!Freigabe)? Wie kann ich das steuern? Durch eine schleife?

Bis jetzt sieht der Code so aus:

Private Sub Befehl219_Click()
Dim rs As Dao.Recordset
Me.Dirty = False
Set rs = Me.RecordsetClone
Set objWord = CreateObject("Word.Application")

    If rs!Freigabe = True Then
        rs.MoveFirst
        objWord.Visible = True
        objWord.Documents.Open ("")
        objWord.ActiveDocument.Bookmarks("Artikel").Select
        objWord.Selection.Range.Text = CStr(rs!Artikel)
    End If
       
        If rs!Freigabe = True Then
        rs.MoveNext
        objWord.ActiveDocument.Bookmarks("Artikel2").Select
        objWord.Selection.Range.Text = CStr(rs!Artikel)
    End If
Set rs = Nothing
End Sub


Also Wenn eine Kontrollkästchen aktiv, fülle die Bookmarks, wenn zwei dann fülle beide, wenn drei dann drei aber halt nur die aktive, die DS welche nicht angekreuzt sind sollen übersprungen werden...

DF6GL

Hallo,

ja, durch eine Schleife, die Du aber selber hinbekommen solltest.   :(

Wobei zu fragen ist,  an welche Bookmarks im selben Dokument die (gleichen) Daten mehrerer Datensätze übergeben werden sollen.


Vermutlich wäre hier ein "Serienbrief" die bessere Lösung.  (Erstelle mit Word eine Serienbriefvorlage, die alle nötigen Serienbrieffelder enthält und nutze die zum Öffnen eines Dokuments. Mit der Word-MailMerge-Methode können dann ein passender Serienbrief in Word generiert werden.

Wenn pro Datensatz ein neues Dokument erzeugt werden soll, muss das innerhalb der Schleife geschehen.


.
.
.
Set rs = Me.RecordsetClone
        rs.MoveFirst

Set objWord = CreateObject("Word.Application")
       objWord.Visible = True


Do Until rs.Eof
    If rs!Freigabe = True Then

        objWord.Documents.Add ("Deine Wordvorlage")
        objWord.ActiveDocument.Bookmarks("Artikel").Select
        objWord.Selection.Range.Text = CStr(rs!Artikel)
   '  hier evtl. Dok sichern und schließen
    End If
       
rs.MoveNext
Loop

  rs.Close
Set rs = Nothing

objWord.Quit
SET  objWord = Nothing
.
.

Rivside

Sorry, ich hab bissl durchgeforscht und fast den gleichen Schleifen-Code hingekriegt... aber das ist trotzdem noch nicht das was passieren soll. Ich habe kein Plan wie ich die Selection.Range mit aktiven Kontrollkästchen so binde, dass WENN eine Kästchen aktiv nur DANN an die Vorlage übergeben....

Ich hätte vielleicht am Anfang schon beschreiben sollen was ich in Word überhaupt erzeugen möchte... Serienbriefe oder getrennte Word Dokumente sind nicht mein Ziel. Ich möchte gerne vom Endlosformular nur die durch Kontrollkästchen angekreuzte Datensätze an Word (ein Dokument) übergeben.

Beispiel Formular:

Datensatz 1   Kontrollkästchen Aktiv
Datensatz 2   Kontrollkästchen Nicht Aktiv
Datensatz 3   Kontrollkästchen Nicht Aktiv
Datensatz 4   Kontrollkästchen Aktiv

Word Vorlage:

Datensatz 1
Datensatz 4

ebs17

#11
ZitatIch möchte gerne vom Endlosformular nur die durch Kontrollkästchen angekreuzte Datensätze an Word (ein Dokument) übergeben.
Würde man nicht schlicht das Formularrecordset oder (technisch) die Datenbasis des Formulars auf diese Markierung filtern?
Dieses resultierende neue Recordset könnte man dann in einer Schleife ohne gesonderte Prüfungen übergeben bzw. besser gleich im Stück => Massendatenverarbeitung statt Sandschaufel.

Zitatan Word (ein Dokument) übergeben
Eine Textmarke wird dann auch nur für genau eine Zuweisung funktionieren, nicht für laufende.
Mit freundlichem Glück Auf!

Eberhard

Rivside

Zitat von: ebs17 am November 13, 2019, 12:56:50
Würde man nicht schlicht das Formularrecordset oder (technisch) die Datenbasis des Formulars auf diese Markierung filtern?
Dieses resultierende neue Recordset könnte man dann in einer Schleife ohne gesonderte Prüfungen übergeben bzw. besser gleich im Stück => Massendatenverarbeitung statt Sandschaufel.

Leider nein. Die Abfrage im Formular zeigt "noch zu bearbeitende Datensätze". Der Benutzer entscheidet welche bearbeitet sind (zB. von ihm persönlich) und gibt an Word weiter. Die restlichen DS werden evtl. vom anderen Benutzer später bearbeitet.

DF6GL

Hallo,

Dein Beispiel zeigt die Übernahme mehrerer DS an ein einzelnes Worddokument. Dies funktioniert so nicht mit einzelnen Textmarken, weil die auch nur einmal besetzt werden können. Es würde sich hier das Füllen einer Word-Tabelle anbieten, oder als  "einfachste" Möglichkeit  das Schreiben von Wert für Wert mit TypeText direkt in das Dokument.

Siehe Hinweis von ebs17.

Rivside

Hallo,

ich hab natürlich mehrere Textmarker bereits vorbereitet. Das Problem ist nur dass ich leider nicht in der Lage bin die selektierte DS an Word zu übergeben. Ich hab wirklich kein Plan mehr wie ich das programmieren soll. Ich habe schon versucht mit Select Case usw. aber es klappt einfach nicht.

Wenn Ihr mir zu mindestens ein den richtigen Weg stellen wurdet..

1 bis 5 selektierte DS

wenn nur 1 selektiert -> Übergabe textmarker1

wenn 2 selektiert -> Übergabe an textmarker1 und textmarker2

Ich bin am ende...