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
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
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
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
@mad ZitatHallo Klaus,
War leider nicht schnell genug ;)
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
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
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.
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
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.
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
@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
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
'übergabe in die Zwischenablage
Zwischenablage(strItems)
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
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.
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
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 SubAnschliessend im Texteditor mit Strg-V eingefügt werden alle (hier 2048)
Zeichen übertragen.
gruss ekkehard
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
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.
Mal schau'n ob ich diese Denksportaufgabe lösen kann.
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 intCurrentRownicht 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
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
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.
@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
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