Neuigkeiten:

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

Mobiles Hauptmenü

Inhalte in die Zwischenablage kopieren

Begonnen von Lehrling Frank, Juli 07, 2023, 17:00:12

⏪ vorheriges - nächstes ⏩

Lehrling Frank

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
 
 



markusxy

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.

andyfau

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
Beste Grüße
Andreas

Lehrling Frank

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





Lehrling Frank

#4
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

andyfau

Hallo Frank,

hast Du die Verweise kontrolliert?

Beste Grüße
Andreas
Beste Grüße
Andreas

PhilS

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 300zwischen 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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy


Lehrling Frank

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

Lehrling Frank

Zitat von: markusxy am Juli 10, 2023, 13:32:08
Zitat 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