Moin,
ich möchte in einem Endlosformular einen, oder mehrer, Datensätze auswählen und dann ein vba- Makro starten, welches Werte aus diesem Datensatz in ein Word Dokument überträgt.
Wie kann ich auf die Werte der selektierten Datensätze zugreifen? Bei Excel geht das ganz einfach über Selection- Eigenschaft, gibt es etwas entsprechendes auch bei Access?
freundliche Grüße
Kinimod
Hallo!
Zufälligerweise wollte ich genau gleiches Thema berühren. Ich schließe mich an. Habe in einem Formular ein Listenfeld eingefügt und möchte gerne ausgewählte Werte in Word übertragen.
Dazu noch, ich möchte das die selektierte Werte nach einem Abschluss abgehackt werden (Häkchenbox).
Ich wäre richtig dankbar wenn uns jemanden zu mindestens auf den richtigen Weg setzt.
Danke im Voraus.
@Kinimod
Was ich soweit geschafft habe ist:
Set objWord = CreateObject("Word.Application")
With objWord
objWord.Visible = True
objWord.Documents.Open ("Pfad zu deiner Vorlage z.B.: C:\vorlage.doc")
.ActiveDocument.Bookmarks("DeineTextmarke im Word").Select
.Selection.Range.Text = CStr([hier dein Steuerelement])
End With
Set objWord = Nothing
Im Word muss du Textmarker erzeugen.
Hallo,,
Zitatich möchte in einem Endlosformular einen, oder mehrer, Datensätze auswählen
Es können nur zusammenhängende Datensätze in einem Endlosform ausgewählt (markiert) werden.
Besser ist, ein Ja/Nein-Feld im Datensatz mitzuführen, das bei einem zu wählenden DS angehakt wird.
Im Recordset(Clone) des Forms können die abgehakten DS ermittelt und an Word übergeben werden.
ZitatHabe in einem Formular ein Listenfeld eingefügt
Das Gleiche gilt beim Listenfeld, das zunächst auf Mehrfachauswahl stehen muss. Allerdings werden hier die markierten Einträge mit der Listenfeld-Aufzählung "Itemsselected" in einer Schleife ermittelt und an Word übergeben.
In beiden Fällen wäre eine separate Schaltfläche zum Auslösen der Übertragung an Word anzuraten und in deren Klick-Ereignis die Änderungen im Form zu speichern (Me.Dirty = False)
btw:
ZitatobjWord.Documents.Open ("Pfad zu deiner Vorlage z.B.: C:\vorlage.doc")
"Open"
öffnet ein Dokument (.docx) als solches, was sowohl ein "normales" Word-Doc als auch eine Wordvorlage (.dotx) sein kann,
"Add" generiert ein neues Dokument auf Grundlage der angegebenen Word-Vorlage (.dotx)
Den Datenübertrag in ein Worddokument kann man auf mehreren Wegen realisieren:
- Verwendung von Textmarken im Worddokument. Da muss man immer einzeln Werte zuweisen, dabei dann bei mehreren Datensätzen einen Plan ob der Verteilung haben.
- Serienbriefunktionalität: Man nimmt also eine Serienbriefvorlage, stellt eine Datenbasis zusammen und weist sie dieser Vorlage zu.
Um einen passenden Weg zu wählen, sollten einem die Anforderungen schon etwas umfangreicher und detaillierter bewusst sein.
Zitateinen, oder mehrer, Datensätze auswählen
Beginnen sollten ja die Überlegungen damit, wie das Auswählen genau erfolgt. Vom Angucken alleine wird noch nicht viel passieren können.
Filtern? Individuelle Auswahl?
Eine Datenbereitstellung und somit das Auswählen sind dann wieder abhängig davon, was da in Word passieren soll.
Danke für eure Antworten.
@DF6GL
Das mit dem Ja/ Nein- Feld ist eine gute Idee. Wie kann ich mit vba danach filtern?
Die Übertragung der Daten zu Word steht bei mir schon weitestgehend, mir fehlen quasi nur noch die Daten, an die ich bis jetzt nicht ran komme.
Hallo,
ZitatWie kann ich mit vba danach filtern?
LuftCode:
Sub btn2Word_Click()
Dim rs as Dao.Recordset, _
objWord as Object
Set objWord = CreateObject("Word.Application")
With objWord
objWord.Visible = True
Me.Dirty=false
Set rs = Me.RecordsetClone
rs.MoveFirst
Do Until rs.EOF
If rs![MeinMarkierungsfeld] Then
objWord.Documents.Add ("Pfad/Dateiname zu deiner Vorlage z.B.: C:\vorlage.dotx")
.ActiveDocument.Bookmarks("DeineTextmarke im Word").Select
.Selection.Range.Text = CStr(Me![hier dein Steuerelementname])
' für alle Textmarken anwenden
' hier weitere Aktionen zu Word
'.Close , .SaveAs oder ähnliches
End If
rs.Movenext
Loop
objWord.Quit
Set objWord = Nothing
End With
rs.Close
Set rs = Nothing
End Sub
Hallo,
ich habe versucht das mit dem extra Auswahlfeld umzusetzen, bin jedoch schnell auf ein Hindernis gestoßen.
Die Daten in dem Formular können nicht geändert werden, es kommt immer der Hinweis "Diese Datensatzgruppe kann nicht aktualisiert werden." Die Abfrage auf der das Formular basiert enthält zum Teil berechnete Felder die Faktoren aus 2 Tabellen enthalten, dass diese nicht aktualisiert werden können verstehe ich, aber warum kann kein Feld aktualisiert werden?
Hallo,
weil nicht nur die Feldern einzeln betrachtet werden, sondern der Datensatz insgesamt....
ZitatDie Daten in dem Formular können nicht geändert werden
War das irgendwo eine Vorgabe, dass die Formulardaten aktualisiert werden müssen?
Wenn das so sein muss, dann wirf die Berechnungen aus der Abfrage heraus und führe sie im Formular durch (mit z. B. den Domänenaggregat-Funktionen, wenn andere Tabellenwerte ausgelsen werden müssen.)
für mein Vorhaben war es zunächst keine Vorgabe, aber du hattest Vorgeschlagen ein zusätzliches Feld zum anwählen einzufügen. Das anwählen geht bei mir dann aber wie das ändern der anderen Daten auch nicht.
Die Domänenaggregat- Funktionen werde ich mir mal anschauen.
Vielen Dank auf jeden Fall für deine Mühen, ich bin bei Access absoluter Beginner und versuche oft mein Vorgehen aus Excel zu übernehmen was natürlich oft nicht klappt.
Hallo,
grundsätzlich sind berechnende Abfragen (Abfragen mit Berechnungsfeldern) nicht aktualisierbar. Es müssen dann eben andere Methoden für die Berechnung ergriffen werden.
Mit welchen Methoden wäre das denn machbar?
Ich habe versucht im Formular über das Eigenschaftenblatt im Steuerelementinhalt auf die Werte einer anderen Tabelle/ Abfrage zuzugreifen. Das hat aber nicht geklappt, kann auch nicht, da keine Verknüpfung da ist, oder?
Mir würde es schon helfen, wenn ich in meinem Formular mit den berechneten Feldern eine Kontrollkästchen, oder ein Optionsfeld hätte, welches ich an und abwählen kann.
Das Problem das ich habe ist, dass der User in einem Endlosformular mit berechneten Feldern mehrere Datensätze frei auswählen können muss. Die Daten der ausgewählten Datensätze muss ich dann über VBA weiterverarbeiten. In Access fällt mir das gerade sehr schwer, da ich es von Excel gewohnt bin eine markierte Zelle über selection anzusprechen und den Wert auszulesen.
Hallo,
was sind das denn für Berechnungen?
Kannst Du mal die DB datenreduziert, komprimiert/repariert und gezippt hier hochladen?
Mit funktionierenden Beispieldaten und einer authentischen Beschreibung, was wo zu tun ist?
Hier mal eine vereinfachte Version, die Felder die nicht gebraucht werden habe ich fast alle entfernt.
Es geht um Bestellungen die bei uns eingegangen sind, diese sind in in der Tabelle "Order Liste DB".
In der Tabelle "Abrechnungsmeldungen DB" halten wir fest was wir von welcher Bestellung/ Order schon abgerechnet haben.
Das Formular "Order Liste" dient zum händischen eintragen neuer Bestellungen.
Das Formular "Abrechnungsmeldung" für neue Abrechnungen.
Das Formular "Order Liste EUR" ist das Formular um welches es hauptsächlich geht, hier sind die berechneten/ aufbereiteten Daten enthalten, etwa der Status der Order (abgerechnete Items/ gesamt Items).
In diesem Formular soll der Nutzer später Datensätze individuell auswählen können, dann ein Makro starten das die Daten in eine Wordvorlage einfügt. Das Anwählen der Datensätze und auslesen der entsprechenden Daten bereitet mir Probleme.
Hallo,
DB anbei.
Nur bezgl. des Problems mit der Markierung und der Übergabe an Word modifiziert ("Order Liste Eur", Datenherkunft auf Tabelle, Berechnete Werte mit Dlookup aus berechnende Abfrage ausgelesen, nur Word als Instanz geöffnet wegen Unkenntnis der Templates), um das Prinzip zu demonstrieren. In der Datenblattansicht sind keine Buttons verwendbar. Formular als Endlosform ausführen und passend layouten.
BTW: Datentypen passend verwenden (Zahlen kein TEXT, sondern LONG). Keine Leer und Sonderzeichen verwenden. Reservierte Wörter vermeiden.
Danke, du hast mir sehr geholfen, ich denke damit komm ich erstmal klar :)
Die Datentypen passen teilweise nicht, da ich die Daten geändert habe. Bei den echten Daten ist es häufig ein Buchstaben Zahlen Mix.
Hallo,
ZitatDie Datentypen passen teilweise nicht, da ich die Daten geändert habe.
Grenzt ja schon an Irreführung und führt zu eklatant fehlerhaften Lösungen, die Dich eher verwirren als helfen ::)
Beim nächsten mal achte ich drauf, dass die Beispieldaten in ihrer Form den richtigen Daten entsprechen. :) Ich hab gar nicht dran gedacht, dass das ja auch einen Unterschied machen kann.
Gibt es eine Möglichkeit, dass was momentan über den Button läuft anders zu starten, sodass man die Datenblattansicht nutzen kann?
Das Endlosformular ist ein seiner Breite begrenzt und erlaubt es dem Nutzer auch nicht die Breite/ Höhe der Felder/ Datensätze zu variieren. Leider gibt es einige Felder die ich unterbringen muss, und auch ein paar die teilweise etwas Text enthalten da wäre es praktisch, wenn man das Feld groß ziehen kann, wenn man den Text braucht.
Auf jeden Fall nochmal Danke und ein schönes Wochenende dir/euch :)
Hallo,
evtl. könnte ein Unterformular in Datenblattansicht zum gewünschten Ziel führen...
Hallo,
Zitatwenn man das Feld groß ziehen kann, wenn man den Text braucht.
Das geht einfach mit Shift-F2, wenn das Feld den Focus hat.
gruss ekkehard
Danke, das mit dem Unterformular hat gut geklappt und der Hinweis mit Shift- F2 ist auch sehr nützlich :)
Ein kleines Problem ist aber noch aufgetaucht, wenn ich die markierten Datensätze bearbeitet habe möchte ich die Markierung gleich entfernen.
Das wollte ich einfach mit
rs.Edit
rs!Markiert = False
rs.Update
machen. Bei dem ersten Datensatz klappt das auch danach bekomme ich jedoch die Fehlermeldung:
"Laufzeitfehler 3197:
Das Microsoft Access- Datenbankmodul hat den Vorgang angehalten, da Sie und ein weiterer Benutzer gleichzeitig versuchen , dieselben Daten zu änder."
Ich bin zurzeit der einzige Nutzer und weiß nicht wodurch der Fehler verursacht wird.
Hallo
ich habe bei so etwas auch immer Schwierigkeiten mit der Sperrung. Umgehe das meist mit einem SQL Statement, sofern der DS im Formular nicht bearbeitet wird:
Dim sSQL$
sSQL = "UPDATE Tabelle SET Tabelle.Markiert=Not(Tabelle.Markiert) WHERE ((Tabelle.Index)=" & Me.Index & ")"
CurrentProject.AccessConnection.Execute sSQL
Me.Requery
Hallo,
Zitatwenn ich die markierten Datensätze bearbeitet habe möchte ich die Markierung gleich entfernen.
Zeige mal die komplette(n) Prozedur(en)..
Möglicherweise hilft ein Me.Dirty=false , um den Eingabemodus (und damit
deine eigene Sperrung) zu beenden.
Hallo,
das ist mein Code, soweit funktioniert er auch wie er soll, nur eben das abwählen der Markierung noch nicht. Me.Dirty=false hab ich schon an verschiedenen Stellen probiert hat aber nicht geholfen
Private Sub btnWord_Click()
Me.Dirty = False
Dim rs As DAO.Recordset, objWord As Object
Dim F308doc
Dim customerList As String
Dim customer As String
Dim poList As String
Dim PO As String
Dim oTable As Table
Dim row As Integer
Dim docName As String
Set objWord = CreateObject("Word.Application")
Set F308doc = objWord.Documents.Open("C:\Users\TEST\Documents\DB\Makro\F308.docx")
Set oTable = F308doc.Bookmarks("poTabelle").Range.Tables(1)
Set rs = Me.RecordsetClone
objWord.Visible = True
rs.MoveFirst
row = 5
PO = rs!PO
poList = PO
docName = "Lieferschein_"
customer = rs!customer
If Left(PO, 1) = "c" Or Left(PO, 1) = "C" Then
customerList = "TESTKUNDE: " & customer
Else
customerList = customer
End If
Do Until rs.EOF
If rs![Markiert] Then
customer = rs!customer
If InStr(customerList, customer) = 0 Then
customerList = customerList & "; " & customer
End If
PO = rs!PO
If InStr(poList, PO) = 0 Then
poList = poList & "; " & PO
End If
oTable.cell(row, 2).Range.insertafter rs!PO
oTable.cell(row, 3).Range.insertafter rs!Pos
oTable.cell(row, 4).Range.insertafter rs![Item Description]
oTable.cell(row, 5).Range.insertafter rs!Quantity & "/" & rs!Quantity
oTable.cell(row, 6).Range.insertafter "1"
oTable.cell(row, 7).Range.insertafter rs![Delivery Date]
'If Me.Dirty Then Me.Dirty = False
rs.Edit
'If Me.Dirty Then Me.Dirty = False
rs!Markiert = False
If Me.Dirty Then Me.Dirty = False
rs.Update
row = row + 1
End If
rs.MoveNext
Loop
oTable.cell(1, 2).Range.insertafter customerList
oTable.cell(2, 2).Range.insertafter poList
docName = docName & poList
docName = Replace(docName, "/", "-")
docName = Replace(docName, "; ", "_")
F308doc.SaveAs2 FileName:=docName & ".docx", FileFormat:=wdFormatDocumentDefault
Set objWord = Nothing
rs.Close
Set rs = Nothing
End Sub
Hallo,
wirf hier:
Zitat.
.
.
'If Me.Dirty Then Me.Dirty = False
rs.Edit
'If Me.Dirty Then Me.Dirty = False
rs!Markiert = False
If Me.Dirty Then Me.Dirty = False
rs.Update
.
.
die Dirty-Geschichte heraus.
Ja, dass habe ich nur zum ausprobieren drin, da ich bei der Lösungssuche auch auf den me.dirty Ansatz gestoßen bin, aber nicht genau wusste an welche Position das gehört.