Hallo Fachleute,
habe mal wieder ein "kleines" Probleme. Ich würde gerne den Inhalt mehrerer Unterschiedlicher Textfelder aus einem Formular (gleicher Datensatz) in die Zwischenablage kopieren. Als einzelne Makros bekomme ich das mit folgendem Code hin:
Sub kopieren()
If Not IsNull(Forms!Artikel!Text29) Then
Forms!Artikel!Text29.SetFocus
Forms!Artikel!Text29.SelStart = 0
Forms!Artikel!Text29.SelLength = Len(Forms!Artikel!Text29)
DoCmd.RunCommand acCmdCopy
End If
End Sub
Sub kopieren02()
If Not IsNull(Forms!Artikel!Kurzbezeichnung_02) Then
Forms!Artikel!Kurzbezeichnung_02.SetFocus
Forms!Artikel!Kurzbezeichnung_02.SelStart = 0
Forms!Artikel!Kurzbezeichnung_02.SelLength = Len(Forms!Artikel!Kurzbezeichnung_02)
DoCmd.RunCommand acCmdCopy
End If
End Sub
Kopiere ich Code2 (Kopieren02) in den ersten Programmcode hinter der ersten If-Bedingung, habe ich nur den Inhalt aud dem Feld "Kurzbezeichnung_02" in der Zwischenablage.
Ich würde aber gerne den Verlauf der Zwischenablage (winLogo & v) nutzen. Hat jemand eine Idee?
Wie gesagt mit den beiden getrennten Sub's nacheinander füllt sich die Zwischanbalage mit beiden Inhalten.
Ich vermute, dass es damit zusammnehängt, dass nach dem Befehl "DoCmd.RunCommand acCmdCopy" die Markierung nicht gelöscht wird. Es reicht nicht den Focus auf ein anderes Feld zulegen, obwohl sich dadurch die Markierung löscht.
Im Voraus vielen Dank für eure Unterstützung
Lehrling Frank
Zitat von: Lehrling Frank am Juli 07, 2023, 17:00:12Wie gesagt mit den beiden getrennten Sub's nacheinander füllt sich die Zwischanbalage mit beiden Inhalten.
Wenn du einen Wert in die Zwischenablage einfügst, wird der aktuelle Inhalt immer zuvor gelöscht.
Dein Konzept kann also so nicht funktionieren.
Die einfache Lösung: Du kopierst den Inhalt der Felder in ein ungebundenes unsichtbares Textfeld und kopierst den Inhalt in die Zwischenablage.
Bessere Lösungen wirst du finden, wenn du das Thema googelst.
Hallo,
kleines Beispiel Zwischenablage lesen und schreiben:
Sub Clipboardlesen()
Dim clipboard As String
Set mydata = New DataObject ' Verweis auf Microsoft Forms 2.0 Object Library (Excel) notwendig
On Error Resume Next
mydata.GetFromClipboard
clipboard = mydata.GetText(1) 'Variable für spätere Verarbeitung
On Error GoTo 0
Set mydata = Nothing
End Sub
Sub Clipboardschreiben()
Dim clipboard As MSForms.DataObject
clipstring = "Mein Text"
Set clipboard = New MSForms.DataObject
clipboard.Clear
clipboard.SetText clipstring
clipboard.PutInClipboard
End Sub
Beste Grüße
Andreas
Hallo Markusxy,
ich glaube , dass ich mich dann nicht richtig ausgedrückt habe. Mittlerweile speichert Windows in der Zwischenablage die letzten 25 kopierten Elemente. Über Strg & v fügst du das letzte kopierte Element aus der Zwischenablage ein. Jedoch gibt es die Möglichkeit über die Tastenkombination Win & v dir den Verlauf der letzten 25 Elemente anzeigen zu lassen und dann auch ein älteren Eintrag auszuwählen und einzufügen. Damit du verstehst was ich meine hier ein Link zu einem passenden Video.
Danke für deine Antwort und Grüße
Lehrling Frank
Guten Morgen Andreas,
auch dir lieben Dank für deine Antwort.
Bei deinem Code kommt bei mir direkt die Fehlermeldung
Benutzerdefinierter Typ nicht definiert in der Zeile "Dim clipboard As MSForms.DataObject"
Nette Grüße
Lehrling Frank
Hallo Frank,
hast Du die Verweise kontrolliert?
Beste Grüße
Andreas
Zitat von: Lehrling Frank am Juli 07, 2023, 17:00:12Kopiere ich Code2 (Kopieren02) in den ersten Programmcode hinter der ersten If-Bedingung, habe ich nur den Inhalt aud dem Feld "Kurzbezeichnung_02" in der Zwischenablage.
Ich würde aber gerne den Verlauf der Zwischenablage (winLogo & v) nutzen. Hat jemand eine Idee?
Das scheint ein Timing-Problem zu sein. Offenbar braucht die Clipboard-History einen Moment, um zu merken, dass sich der aktuelle Inhalt des Clipboard geändert hat und in die History muss. Wenn du schnell hintereinander Text ins Clipboard kopierst, kommt nur der letzte Eintrag davon in die History.
Ein Workaround wäre, zwischen den einzelnen Kopiervorgängen einen Moment zu warten.
Die Sleep-API-Funktion wäre dazu geeignet.
Kopier mal dies in den Deklarationsbereich deines Formularmoduls:
Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal Milliseconds As Long)
In deinem Programmcode zum Kopieren fügst du dann
Sleep 300
zwischen den einzelnen Kopiervorgängen ein.
300 Millisekunden sind bei mir nah an der Untergrenze dessen, was zuverlässig funktioniert. Evtl. musst du da noch etwas herumexperimentieren.
Zitat von: PhilS am Juli 08, 2023, 16:38:11Clipboard-History
Ups, da hab ich wohl zu oberflächlich gelesen.
Hallo PhilS,
dass ist geanu das, was ich benötigt habe 👍
Vielen Dank für deinen Lösungsvorschlag und Entschulgung, dass ich erst heute eine Antwort gebe. War beruflich unterwegs.....
Bette Grüße aus dem Schwabenland
Frank
Zitat von: markusxy am Juli 10, 2023, 13:32:08Zitat von: PhilS am Juli 08, 2023, 16:38:11Clipboard-History
Ups, da hab ich wohl zu oberflächlich gelesen.
😉😊
Das kann jeden passieren.... und trotzdem nochmals Dankeschön für deine Antwort.
Beste Grüße
Frank