Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Listenfeld (ausgewählte Inhalte) in die Zwischenablage kopieren

Begonnen von mad, Januar 16, 2023, 16:00:58

⏪ vorheriges - nächstes ⏩

Beaker s.a.

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.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

mad

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

mad

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

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


Gruss
mad

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

mad

Mal schau'n ob ich diese Denksportaufgabe lösen kann.

mad

mad

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

Ich bleib aber dran.

mad

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

markusxy

@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




mad

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