Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: mad am Januar 16, 2023, 16:00:58

Titel: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Januar 16, 2023, 16:00:58
Hallo Zusammen,
meine Kollegen würden gerne diverse eMail-Adresse aus den Personalstammdaten in die Zwischenablage kopiert haben um sie so in das Adressfeld (AN; CC; BCC) von Outlook kopieren zu können.

Dazu habe ich ein Formular mit einen entsprechenden Listenfeld erstellt. In diesem Listenfeld werden entweder durch Vorauswahl bereits alle gelisteten eMail-Adressen markiert. Man kann auch diverse Mail-Adresse durch anklicken abwählen oder umgekehrt.

Hier der Code dazu, der auch soweit funktioniert, ausgenommen dem nachfolgendem Thema:

Private Sub btneMailkopie_Click()

 Dim i As Control
 Dim t As Control
 Dim strItems As String
 Dim intCurrentRow As Integer
 
 Set i = lstKontakte
 Set t = txtZWA
 
 For intCurrentRow = 0 To i.ListCount - 1
 If i.Selected(intCurrentRow) Then
 strItems = strItems & i.Column(2, intCurrentRow) & ";"
 End If
 Next intCurrentRow
 'übergabe an das Textfeld "txtZWA"
    t = strItems
    t.SetFocus
DoCmd.RunCommand acCmdCopy

 Debug.Print strItems

End Sub
Mein Problem ist nun, obwohl die eMail-Adressen im Listenfeld des Formulars richtig angezeigt werden, so wie man es sich vorstellt:  z.B. name@web.de
Wird es im Direktfester (Debug.Print strItems) und auch im Feld ,,txtZWA" wie folgt angezeigt:
Name1@web.de#mailto:name1@web.de#;name2@web.de#mailto: name2@web.de#;name3@web.de#mailto:name3@web.de#;

Wie kann ich die eMail-Adressen ohne ...#mailto:....# darstellen.
Kann man dazu im Code was "einstellen" oder muß man den Text von # bis nächstes ; einkürzen?

Hätte jemand eine Idee? Bitte wenn möglich auch zum Kürzen.

Gruss
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Januar 17, 2023, 07:17:11
Hallo Zusammen,

aktuell verfolge ich zwei Lösungsansätze:

1. mit suchen und ersetzen den Teil mit ...#mailto:...#... aus dem Ergebnis von "strItems" mit "" zu ersetzen.
Code sieht wie folgt aus:
...
Next intCurrentRow
 
 'übergabe an das Textfeld "txtZWA"
 strItems = Replace(strItems, "#*#", "")

    t = strItems
    t.SetFocus
DoCmd.RunCommand acCmdCopy
...

Da aber das #-Zeichen für einen Platzhalter für ein einzelnes Zeichen steht, funktioniert das so scheinbar nicht.
Hätte jemand einen Idee wie das mit den #-Zeichen zu schreiben ist?

2. die Mail-Adresse mit dem "Anhängsl" #mailto:.. zu kürzen:

...
Next intCurrentRow
 
 'übergabe an das Textfeld "txtZWA"
 strItems = Left([strItems], InStr(1, [strItems], "#") - 1)

    t = strItems
    t.SetFocus
DoCmd.RunCommand acCmdCopy
...

Wenn ich das an der selben Stelle wie oben mit "suchen und ersetzen" anwende, wird das ganze Ergebnis (aus mehreren Mail-Adresse) auf nur eine gekürzt.
Irgendwie müßte das Thema "= Left([strItems], InStr(1, [strItems], "#") - 1)" oben in die Schleife eingebaut werden.
Leider weis ich nicht wo und wie.

Hätte dazu auch jemand einen Vorschlag?

Danke
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: Beaker s.a. am Januar 17, 2023, 12:17:09
Hallo mad,
Du kannst die Angabe des Protokolls mit der Methode "HyperlinkPart" abschneiden
(funktioniert i.Ü. auch mit Internetadressen).
?HyperlinkPart ("Name1@web.de#mailto:name1@web.de#")
Name1@web.de

gruss ekkehard
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Januar 17, 2023, 14:11:54
Hallo Klaus,

vielen Dank für den Hinweis.

Code-Abschnitt sieht jetzt wie folgt aus:

...
strItems = HyperlinkPart(strItems & i.Column(2, intCurrentRow)) & ";"
...
Funktioniert wie gewünscht.


Danke
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: Beaker s.a. am Januar 17, 2023, 14:15:50
@mad
ZitatHallo Klaus,
War leider nicht schnell genug  ;)
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 08, 2023, 19:52:22
Hallo Zusammen,

müsste das Thema nochmals aufgreifen.

Wie gesagt, daß kopieren der markierten Mail-Adressen im Listenfeld funktioniert soweit.
Allerdings hat sich nun in der Live-/Original-DB herausgestellt, daß nur 1024 Zeichen kopiert werden und der Rest bleibt unberücksichtigt.

Gibt es eine Möglichkeit die zu kopierende Zeichenanzahl auf unbegrenzt zu setzen?


Gruss
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 15, 2023, 21:02:31
Hallo Zusammen,

möchte mich nochmals an euchen wenden, da ich mit dem Thema noch nicht weitergekommen bin.

Hier nochmals mein Code zum kopieren der Mail-Adressen:
Private Sub btneMailkopie_Click()

 Dim i As Control
 Dim t As Control
 Dim strItems As String
 Dim intCurrentRow As Integer
 
 Set i = lstKontakte
 Set t = txtZWA
 
 For intCurrentRow = 0 To i.ListCount - 1
     If i.Selected(intCurrentRow) Then
    strItems = HyperlinkPart(strItems & i.Column(2, intCurrentRow)) & ";"
 End If

 Next intCurrentRow
 
 'übergabe an das Textfeld "txtZWA"
    t = strItems
    t.SetFocus
DoCmd.RunCommand acCmdCopy

End Sub

Jetzt habe ich nachfolgenden Beitrag gefunden. Weis aber nicht ob das meine Lösung wäre bzw. wie ich das anwenden müsste.

http://www.donkarl.com/forum/forums/thread-view.asp?tid=1768&mid=5493#M5493 (http://www.donkarl.com/forum/forums/thread-view.asp?tid=1768&mid=5493#M5493)

Über unterstützung würde ich mich sehr freuen.
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: markusxy am Februar 16, 2023, 10:16:44
Ich nehme mal an, du hast bereits überprüft, ob der String korrekt zusammgesetzt wird.
Liegt das Problem also rein nur um Kopieren in die Zwischenablage?
Der Umweg über das Textfeld ist ja nicht erforderlich.  Da gibt es auch andere Lösungen.


Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 16, 2023, 15:51:09
Hallo markusxy,

ja ich habe die Ausgabe über das Direktfenster mit "Debug.Print strItems" überprüft. Der String ist richtig zusammengesetzt.
Ich habe auch mal die ein oder andere Markierung im Listenfeld "lstKontakte" entfernt, dann nimmt er weitere Mail-Adressen mit aber wieder nur bis 1024 Zeichen. Rest nicht.

Denn Umweg über das Textfeld habe ich erstmal dringelassen, dann kann man das gleich sehen was kopiert wird.

Hättest Du eventuell einen Lösungsansatz?


Gruss
mad
Titel: Zwischenablage mit DataObject
Beitrag von: markusxy am Februar 16, 2023, 16:47:15
Hier ein simples Beispiel für die Nutzung der Zwischenablage mittels DataObjekt.

Sub Zwischenablage(TextZwischenablage as String)
    'Verweis Microsoft Forms 2.0 Object Library
    Dim oData As MSForms.DataObject

    Set oData = New DataObject
    oData.SetText TextZwischenablage
    oData.PutInClipboard
    Set oData = Nothing
       
End Sub

Persönlich nutze ich einen direkten Zugriff via API.
Das ist dann aber doch etwas komplexer.
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 17, 2023, 13:10:54
Hallo markusxy,

bei mir gibt es unter Verweise nur 'Microsoft Feeds 2.0 Object Library, ist dass das selbe?

Muss dein Code, geändert "TextZwischenablage" in "txtZWA" in ein eigenes Modul? Oder in meinen aktuellen Code integriert werden?


Gruss
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: Beaker s.a. am Februar 17, 2023, 13:54:54
@mad,
Zum Verweis kann ich nichts sagen.
Den Code würde ich in ein allgem. Modul schreiben, dann kannst
du von überall darauf zugreifen.

gruss ekkehard
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 17, 2023, 14:49:17
Hallo,

den Code habe ich mal in ein eigenes Modul "mdlZWA" gepackt.
Bin mir aber nicht klar wie ich diesen anwenden kann.

Ich möchte aber vielleicht nochmals einen Schritt zurückspringen, den wenn ich mein Ergebnis per "Debug.Print strItems" aus meinem Code im Direktfenster anzeigen lasse, werden dort schon nur die 1024 Zeichen angezeigt unabhängig ob ich diese Daten ins Feld "txtZWA" übertrage.
Ich vermute bis dahin ist schon das Problem.

Private Sub btneMailkopie_Click()

 Dim i As Control
 Dim t As Control
 Dim strItems As String
 Dim intCurrentRow As Integer
 
 Set i = lstKontakte
 Set t = txtZWA
 
 For intCurrentRow = 0 To i.ListCount - 1
     If i.Selected(intCurrentRow) Then
    strItems = HyperlinkPart(strItems & i.Column(2, intCurrentRow)) & ";"
 End If

 Next intCurrentRow
 Debut.Print strItems

 'übergabe an das Textfeld "txtZWA"
    t = strItems
    t.SetFocus
DoCmd.RunCommand acCmdCopy

End Sub


Gruss
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: Beaker s.a. am Februar 17, 2023, 15:08:04
'übergabe in die Zwischenablage
    Zwischenablage(strItems)
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 17, 2023, 16:07:14
Danke Beaker,

nun meckert Access natürlich weil der entsprechende Verweis "Microsoft Forms 2.0 Object Library" nicht gefunden wird, siehe Bild. Ich kann den Verweis aber bei den Verweisen nicht finden.

Aber wie gesagt, ich denke mein Problem liegt weiter vorne im Code.


mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: Beaker s.a. am Februar 17, 2023, 16:28:12
Wie gesagt kann ich dazu nichts sagen. Bei mir gibt diese Bibliothek
auch nicht, was m.E. allerdings daran liegt, dass ich kein Office
besitze, nur Access.
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 17, 2023, 16:44:13
Hallo,
habe was gefunden wie ich die Library aktivieren kann:
Zitat- [Extras] / [Verweise]
- Aus Liste auswählen oder mit "Durchsuchen" finden z.B. unter:
C:\WINDOWS\SYSTEM32\FM20.DLL
- OK drücken
- VB-Editor schließen
- Datei speichern

Nun fuktioniert's mit der Zwischenablage.
Ändert aber nichts an meinem Problem das ich nur 1024 Zeichen angezeigt/kopiert bekomme.


mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: Beaker s.a. am Februar 17, 2023, 17:57:01
Bibliothek gefunden und Verweis gesetzt, - danke für den Tipp.
ZitatNun fuktioniert's mit der Zwischenablage.
Bei mir erst mit der kompletten Referenz auf das Objekt (s. Code)
Es werden auch mehr als 1024 Zeichen übertragen, zum Testen
Public Sub TestTextLaenge()
    Dim s As String
    Dim i As Integer
    s = "1"
    For i = 1 To 11
        s = s & s
        Debug.Print Len(s)
        Zwischenablage s
    Next i
End Sub

Public Sub Zwischenablage(TextZwischenablage As String)
    'Verweis Microsoft Forms 2.0 Object Library
    Dim oData As MSForms.DataObject

    Set oData = New MSForms.DataObject   'ohne das MSForms-Objekt kam bei mir eine Fehlermeldung wegen "New"
    oData.SetText TextZwischenablage
    oData.PutInClipboard
    Set oData = Nothing
       
End Sub
Anschliessend im Texteditor mit Strg-V eingefügt werden alle (hier 2048)
Zeichen übertragen.

gruss ekkehard
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 17, 2023, 18:32:40
Hallo Ekkehard,

wenn ich Deinen Code 1:1 verwende, schreibt er mir ins Direktfenster folgende Zahlenfolge:
 2
 4
 8
 16
 32
 64
 128
 256
 512
 1024
 2048

Wenn ich den Inhalt z.B. in eine Word-Datei kopiere, werden 2048 Einser (1) kopiert.
Ich kann mir leider nicht erklären warum es bei mir bei 1024 Zeichen bleibt. Wo müsste ich den meinen Code entsprechend anpassen?


Private Sub btneMailkopie_Click()

 Dim i As Control
 Dim t As Control
 Dim strItems As String
 Dim intCurrentRow As Integer
' Dim HyperlinkPart As String
 
 Set i = lstKontakte
 Set t = txtZWA
 
 For intCurrentRow = 0 To i.ListCount - 1
     If i.Selected(intCurrentRow) Then
    strItems = HyperlinkPart(strItems & i.Column(2, intCurrentRow)) & ";"
 End If

 Next intCurrentRow
  Debug.Print strItems
   'übergabe direkt an die Zwischenablage
   Zwischenablage strItems
   
'    übergabe an das Textfeld "txtZWA"
'    t = strItems
'    t.SetFocus
'DoCmd.RunCommand acCmdCopy

End Sub


Public Sub Zwischenablage(TextZwischenablage As String)
    'Verweis Microsoft Forms 2.0 Object Library
    Dim oData As MSForms.DataObject

    Set oData = New MSForms.DataObject   'ohne das MSForms-Objekt kam bei mir eine Fehlermeldung wegen "New"
    oData.SetText TextZwischenablage
    oData.PutInClipboard
    Set oData = Nothing
       
End Sub

Habe noch einen Text im Internet gefunden:
https://learn.microsoft.com/de-de/dotnet/api/system.data.odbc.odbcconnection.connectionstring?view=dotnet-plat-ext-7.0 (https://learn.microsoft.com/de-de/dotnet/api/system.data.odbc.odbcconnection.connectionstring?view=dotnet-plat-ext-7.0)

Weis nicht ob das helfen könnte. Als Laie versteht das leider nicht.


Gruss
mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: ebs17 am Februar 17, 2023, 20:53:35
Bei Deinen 1.024 Zeichen müsstest Du inhaltlich trennen,
- wie viel Zeichen Du an die Zwischenablage übergibst,
- wie viel Zeichen die Zwischenablage für sich zurückgibt,
- wie viel Zeichen der Empfänger entgegennimmt.

Ich denke, der dritte Fall sollte Dich besonders interessieren.
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 17, 2023, 21:42:59
Mal schau'n ob ich diese Denksportaufgabe lösen kann.

mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 18, 2023, 10:52:51
Habe jetzt mal, wie Ekkehart, mit
Debug.Print Len(strItems)
überprüft wieviel Zeichen den "strItems" übergibt. Das sind wieder meine 1024 Zeichen.

Irgendwie läßt mein Code:
Dim i As Control
 Dim t As Control
 Dim strItems As String
 Dim intCurrentRow As Integer
' Dim HyperlinkPart As String
 
 Set i = lstKontakte
 Set t = txtZWA
 
 For intCurrentRow = 0 To i.ListCount - 1
     If i.Selected(intCurrentRow) Then
    strItems = HyperlinkPart(strItems & i.Column(2, intCurrentRow)) & ";"
 End If
 
 Next intCurrentRow
nicht mehr als diese 1024 Zeichen zu.

Habe mal einen ähnlichen Beitrag zu Excel gelesen, daraus werd ich aber auch nicht schlauer!
https://www.herber.de/forum/archiv/848to852/848387_Maximale_Laenge_eines_Strings.html (https://www.herber.de/forum/archiv/848to852/848387_Maximale_Laenge_eines_Strings.html)

Ich bleib aber dran.

mad
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: Beaker s.a. am Februar 18, 2023, 13:16:41
Hallo,
Zitat- wie viel Zeichen der Empfänger entgegennimmt.
Also mein Emailclient nimmt anstandslos mehr als 1024 Zeichen auf in
der Adresszeile (mehrfach hin- und her kopiert).
Bei mir hat der String in beiden Prozeduren die gleiche Länge, da
wird bei der Übergabe nix abgeschnitten. Und den Text aus der
programmatisch gefüllten Zwischenablage in die Adresszeile kopiert
bleibt es auch bei den 2048 Zeichen (s.o.).
Klappt bei dir doch auch
ZitatWenn ich den Inhalt z.B. in eine Word-Datei kopiere, werden 2048 Einser (1) kopiert.
Was willst du mehr? Am Inhalt des Strings kann's ja wohl nicht liegen.

gruss ekkehard
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: ebs17 am Februar 18, 2023, 13:32:11
In meinem Erleben kann eine Stringvariable sehr viele Zeichen aufnehmen, vermutlich alle, die in einer Textdatei etwas kleiner als 2GB vorhanden sind.

Möglicherweise resultiert die Limitierung auch aus der Verwendung von HyperlinkPart (Definition gründlich ansehen!). HyperlinkPart immer wieder über den zusammengesetzten String empfinde ich zudem als sehr irritierend, unlogisch, performancebremsend, also sehr diskutabel.
Vielleicht unternimmst Du eine Analyse und Diskussion zur Schleifenkonstruktion und insbesondere zur Stringzusammensetzung. Wenn Du es erklärst, wirst Du es auch selber besser verstehen.

Verwendete Hyperlinks finde ich an sich schon ungeschickt und problematisch: Purer Text + Application.FollowHyperlink erledigen das Gleiche.
Vermutlich käme ich also gar nicht in Deine Position und zu Deinem Problem.
Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: markusxy am Februar 18, 2023, 13:59:19
@mad, ich hab dich ja nicht umsonst gefragt, ob die String-Erzeugung funktioniert.

Für mich war ja von Anfang an die Frage, wie um überhaupt auf so einen Code kommt.

Habs mal so geschrieben, wie ich es logischerweise erwarten würde:

  Dim i As Control
  Dim strItems As String
  Dim intCurrentRow As Integer
 
  Set i = lstKontakte
 
  For intCurrentRow = 0 To i.ListCount - 1
    If i.Selected(intCurrentRow) Then
      If Len(strItems) Then
        strItems = strItems & ";" & HyperlinkPart(i.Column(2, intCurrentRow))
      Else
        strItems = HyperlinkPart(i.Column(2, intCurrentRow))
      End If
    End If
  Next



Titel: Re: Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren
Beitrag von: mad am Februar 20, 2023, 18:19:34
Hallo Zusammen,
erstmal Danke an Alle.

zum einen habe ich den Code von markusxy wie unter #24 verwendet, funktioniert einwandfrei.

Zum anderen habe ich meine eMail-Felder wie von Eberhard unter #23 vorgeschlagen in der entsprechenden Tabelle auf Felder "kurzer Text" umgestellt. Und im Code "HyperlinkPart" weggelassen. So funktionierts auch.


Dim i As Control
 Dim t As Control
 Dim strItems As String
 Dim intCurrentRow As Integer
' Dim HyperlinkPart As String

 Set i = lstKontakte
 Set t = txtZWA
 
 For intCurrentRow = 0 To i.ListCount - 1
     If i.Selected(intCurrentRow) Then
    strItems = strItems & i.Column(2, intCurrentRow) & ";"
 End If

 Next intCurrentRow
 
 'übergabe an das Textfeld "txtZWA"
    t = strItems
    t.SetFocus

DoCmd.RunCommand acCmdCopy


Herzlichen Dank nochmals an Alle Unterstützer.
mad