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?
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.
Hallo Markus,
danke für dein Antwort. Wie kann ich die Felder ansprechen?
Hallo,
z. B.:
.Selection.Range.Text = CStr(rsf!Text43)
wobei "Text43" eine kaum zu glaubende Aussagekraft besitzt.
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
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
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....
Hallo,
vielleicht hilft:
.
Dim rs As Dao.Recordset
Me.Dirty = False
Set rs = Me.RecordsetClone
.
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...
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
.
.
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
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.
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.
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.
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...
Hallo,
nun, m. E. ist das Murks.. Welchen Hintergrund hat eigentlich die Aufgabe? Ist das eine Schulübung/-aufgabe oder soll das real eingesetzt werden?
Wie auch immer, ein Schleifenzähler hilft...
Dim i as Long
.
.
.
objWord.Documents.Add ("Deine Wordvorlage")
Do Until rs.Eof
i=i+1
If rs!Freigabe = True Then
objWord.ActiveDocument.Bookmarks("textmarker" & i).Select
objWord.Selection.Range.Text = CStr(rs!Artikel)
End If
rs.MoveNext
Loop
Zitatwenn 2 selektiert -> Übergabe an textmarker1 und textmarker2
Schleifen drehen und prüfen, prüfen. Wann kommt man dann zum Handeln oder gar bis zum Erfolg?
Du redest von Datensätzen. Da brauchst Du in der Umständlichkeit pro Feldinhalt eine Textmarke. Das dann multipliziert pro Datensatz.
Was machst Du, wenn Deine vorgesehenen Textmarken nicht ausreichen, die gesamte Auswahl zu übernehmen, weil der Anwender fleißiger ist, als Du Dir vorstellen kannst?
Das alleine ist schon ein Totschlagargument für die Einzelübergabevariante.
Alternativen:
- Die Feldinhalte des Recordsets werden zu einem einzigen String zusammengezogen. Dieser kann dann an eine einzelne Textmarke platziert werden. Je nach Inhalten können sich aber Formatierungsprobleme ergeben (verschobene Tabelle).
- Tabelle im Worddokument anlegen. Diese bekommt eine einzelne Textmarke und ist dann hinreichend adressierbar, weil sie dann selber als Objekt per Zeilen und Spalten ansprechbar ist. Dort könnte man im Zuge des Eintragens auch neue benötigte Zeilen dieser Wordtabelle erzeugen.
- Das Recordset wird über die Wordmethode ConvertToTable zu einer Wordtabelle umgeformt. Diese Tabelle wird an der Textmarkte eingefügt. Fertig, bis auf evtl. ein paar dokumentangepasste Formatierungen. Das wäre meine favorisierte Variante.
Hallo ebs17,
um das ganze noch lustiger darzustellen, müssen bestimmte Teile vom Datensätzen getrennt und an verschiedenen Textmarker übertragen werden.
Ist ja egal. Ich fange an mit VBA und glaube ich werd versuchen das ganze irgendwie mit Schleifen zu lösen.
Ich danke euch für eure Mühe. Das hat mir erstmal viel geholfen.
Nun, ehe man mit Codes aktioniert, sollte man einen (Ablauf)Plan haben. Bevor man sich einen Plan zurecht legt, sollte man die Situation wie auch die Zielstellung erfasst und verstanden haben.