Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1264to1268
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro, welches Hyperlinks einfügt und filtert

Makro, welches Hyperlinks einfügt und filtert
Christian
Hallo alle zusammen,
ich bitte euch, mir bei einem Makro zu helfen, welches erst Hyperlinks einfügt und dann nach gewissen Kriterien filtert.
Meine Arbeitsmappe hat 7 Tabellenbätter, das 5. heißt E-Mail und das 6. heißt E-Mail 2 (mit Leerzeichen dazwischen). Wie ihr euch sicher denken könnt, beinhalten beide E-Mail Adressen, jeweils in Spalte D. Allerdings kann ich komischerweise ca. 10 % davon nicht anklicken sodass eine Outlook Mail geöffnet wird, weil zwar die E-Mail Adresse da steht, aber kien Hyperlink hinterlegt ist.
Wäre schön, wenn das Makro diesen Missstand behebt.
Zum Filtern, in Spalte A gibt es in beiden Tabellen Zellen mit und ohne Hyperlinks, wäre schön, wenn der Filter alle Zeilen ausblendet, die bereits einen Hyperlink enthalten, damit ich sehe, wo ich noch welche einfügen muss.
Vielen Dank
Chris
Hyperlinks E-Mail Adresse, Hyperlinks filtern
03.06.2012 13:59:13
fcs
Hallo Chris,
hier Makros mit entsprechender Funktionalität.
Gruß
Franz
Option Explicit
'Code in einem allgemeinen Modul
'Erstellt unter Excel 2010, Windows Vista - 2012-06-03
Sub Add_Email_Links()
Application.ScreenUpdating = False
Call prcAddHyperlink_Emailadresse(wks:=ActiveWorkbook.Worksheets("E-Mail"), Spalte:=4)
Call prcAddHyperlink_Emailadresse(wks:=ActiveWorkbook.Worksheets("E-Mail 2"), Spalte:=4)
Application.ScreenUpdating = True
'  MsgBox "Fertig"
End Sub
Sub Ausblenden_Zeilen_mit_Hyperlink()
Application.ScreenUpdating = False
Call prcFiltern_ohne_Hyperlink(wks:=ActiveWorkbook.Worksheets("E-Mail"), Spalte:=1)
Call prcFiltern_ohne_Hyperlink(wks:=ActiveWorkbook.Worksheets("E-Mail 2"), Spalte:=1)
Application.ScreenUpdating = True
'  MsgBox "Fertig"
End Sub
Sub prcAddHyperlink_Emailadresse(wks As Worksheet, Spalte As Long, _
Optional Zeile_1 As Long = 1)
'Ergänzt fehlende E-mail-Adressen-Hyperlinks in Spalte
Dim Zelle As Range, Bereich As Range
With wks
.Rows.Hidden = False
Set Bereich = .Range(.Cells(Zeile_1, Spalte), .Cells(.Rows.Count, Spalte).End(xlUp))
For Each Zelle In Bereich
If Zelle.Hyperlinks.Count = 0 Then
If InStr(1, Zelle.Text, "@") > 0 Then
wks.Hyperlinks.Add Anchor:=Zelle, _
Address:="mailto:" & Zelle.Text, _
ScreenTip:="Mailadresse: " & Zelle.Text
End If
End If
Next
End With
End Sub
Sub prcFiltern_ohne_Hyperlink(wks As Worksheet, Spalte As Long, _
Optional Zeile_1 As Long = 1)
'Blendet alle Zeilen aus mit Hyperlink in Spalte
Dim Zelle As Range, Bereich As Range
With wks
.Rows.Hidden = False
Set Bereich = .Range(.Cells(Zeile_1, Spalte), _
.Cells(.Cells.SpecialCells(xlCellTypeLastCell).Row, Spalte))
For Each Zelle In Bereich
If Zelle.Hyperlinks.Count = 1 Then
Zelle.EntireRow.Hidden = True
End If
Next
End With
End Sub

Anzeige
AW: Hyperlinks filtern - Excel 2010 Zusatzhinweis
03.06.2012 14:09:28
fcs
Hallo Chris,
wenn deine Hyperlinks in Spalte A eine andere Schriftfarbe haben als die Zellen ohne Hyperlinks, dann kannst du in Excel 2010 auch mit dem Autofilter arbeiten und die Zellen nach der Schriftfarbe filtern.
Gruß
Franz
AW: Hyperlinks filtern - Excel 2010 Zusatzhinweis
03.06.2012 20:14:01
Christian
Hallo ihr beiden,
danke für die Hilfe. Zuerst zu der Farbe, leider haben sie das nicht.
Zu dem Makro, ich hätte noch eine Frage, bevor ich es teste, einfach um Fehlermeldungen zu vermeiden.
In Tabelle E-Mail haben viele Zeilen überhaupt nichts in Spalte D stehen, aber wenn etwas da steht, sind es E-Mail Adressen, falls nicht bereits implementiert, kann man noch mit in das Makro aufnehmen, dass leere Zeilen einfach ignoriert werden?
Ach so hätte mal noch eine allgemeine Frage zu Excel, wenn beim Öffnen einer Datei ein Fehler verursacht wird und Excel geschlossen wird, wie kann ich vermeiden, dass beim erneuten Öffnen von Excel, Excel versucht, diese Datei zu reparieren? (Frage deshalb, weil die Reparatur in meinem konkreten Fall lang dauert und wichtige Teile dabei verloren gehen, sie also sinnlos ist).
Gruß
Christian
PS: Ich frage vor dem Test, um vorzubeugen dass ich bei mehr als 10000 leeren Zeilen genauso viele Fehlermeldungen bekomme.
Anzeige
AW: Hyperlinks filtern - Excel 2010 Zusatzhinweis
04.06.2012 07:47:56
fcs
Hallo Christian,
das Makro prüft, ob in den Zelltexten ein "@" enthalten ist. Dadurch werden leere Zellen übersprungen.
Test die Makros doch erst in einer Kopie der Datei.
Bezüglich der Reparatur:
Erstelle erst im Dateimanager eine Kopie der Datei.
Probiere mit der Kopie die Reparatur. Datei dabei in Excel über "Datei öffen" und im DropDown statt "Öffnen" die Repartur mit "Offnen und Reparieren" starten.
Gruß
Franz.
AW: Hyperlinks E-Mail Adresse, Hyperlinks filtern
04.06.2012 21:51:19
Christian
Hallo Franz,
könntest du mir wenn du so nett wärest, aufbauend auf der Problematik von oben beschriebenem Makro noch eins machen?
In der Tabelle gibt es jetzt eine neue Tabelle namens Hyperlinks
In dieser stehen nun in Spalte A die Einträge aus der Tabelle E-Mail, die vorher keinen Hyperlink in Spalte A hatten, mit Hyperlink (allerdings, auch noch einige mehr). Kannst du mir noch ein Makro basteln, dass jeweils den Text ohne Hyperlink aus der Tabelle E-Mail in der Tabelle Hyperlinks sucht und den Hyperlink in die Tabelle E-Mail übernimmt?
Kann unter Umständen sein, dass mehrere Hyperlinks in der Tabelle Hyperlinks in Frage kommen, dann soll das Makro den nehmen, deren Wert in derselben Zeile Spalte D in der Tabelle E-Mail mit dem Wert der gefundenen Zeile in Spalte B in der Tabelle Hyperlinks übereinstimmt.
Vielen Dank
Christian
Anzeige
AW: Hyperlinks E-Mail Adresse, Hyperlinks filtern
05.06.2012 08:15:51
fcs
Hallo Christian,
das ist jetzt etwas aufwendiger, da etliches berücksichtigt werden muss.
Gruß
Franz
Sub Suchen_Hyperinks()
Application.ScreenUpdating = False
Call prcSuchenHyperlink( _
wksMail:=ActiveWorkbook.Worksheets("E-Mail"), SpaMail1:=1, SpaMail2:=4, _
wksHyp:=ActiveWorkbook.Worksheets("Hyperlinks"), SpaHyp1:=1, SpaHyp2:=2)
Application.ScreenUpdating = True
'  MsgBox "Fertig"
End Sub
Sub prcSuchenHyperlink(wksMail As Worksheet, SpaMail1 As Long, _
SpaMail2 As Long, wksHyp As Worksheet, SpaHyp1 As Long, SpaHyp2 As Long, _
Optional ZeileMail_1 As Long = 2, Optional ZeileHyp_1 As Long = 2)
'Sucht für Einträge ohne Hyperlink in Spalte "SpaMail1" von Blatt "wksMail" _
in Blatt "wksHyp" Spalte "SpaHyp1" den Hyperlink und überträgt diesen nach wksMail.
'Falls erforderlich werden zusätzlich die Spalten "SpaMail2" und "SpaHyp2" verglichen.
Dim strMail1 As String, strMail2 As String
Dim BereichHyp As Range, bolFound As Boolean
Dim Zelle As Range, strAdresse1 As String
Dim ZeileMail
Const bolMsgBox As Boolean = True 'False :Meldungen werden nicht angezeigt
With wksHyp
.Rows.Hidden = False
'Bereich mit den zu findenden Hyperlinks
Set BereichHyp = .Range(.Cells(ZeileHyp_1, SpaHyp1), _
.Cells(.Rows.Count, SpaHyp1).End(xlUp))
End With
With wksMail
.Rows.Hidden = False
For ZeileMail = ZeileMail_1 To .Cells(.Rows.Count, SpaMail1).End(xlUp).Row
If .Cells(ZeileMail, SpaMail1).Hyperlinks.Count = 0 _
And .Cells(ZeileMail, SpaMail1).Text  "" Then
'Werte aus Spalte A und D einlesen
strMail1 = .Cells(ZeileMail, SpaMail1).Text
strMail2 = .Cells(ZeileMail, SpaMail2).Text
'Wert aus Spalte A in Hyperlink-Bereich suchen
Set Zelle = BereichHyp.Find(what:=strMail1, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Eintrag nicht gefunden
If bolMsgBox = True Then
If MsgBox("Wert """ & strMail1 & """ in Zeile " & ZeileMail & " von Blatt """ _
& wksMail.Name & """ in Blatt """ & wksHyp.Name & """ nicht gefunden!", _
vbInformation + vbOKCancel, _
"Hyperlinks ergänzen - Wert nicht gefunden") = vbCancel Then Exit Sub
End If
Else
'Prüfen, ob Eintrag mehrfachvorhanden
bolFound = False
If Application.WorksheetFunction.CountIf(BereichHyp, strMail1) > 1 Then
'Eintrag mit Übereinstimmung in den beiden anderen Spalten suchen
strAdresse1 = Zelle.Address
Do
If strMail2 = wksHyp.Cells(Zelle.Row, SpaHyp2).Text Then
bolFound = True
Exit Do
End If
Set Zelle = BereichHyp.FindNext(after:=Zelle)
Loop Until Zelle.Address = strAdresse1
Else
bolFound = True
End If
If bolFound = True Then
If Zelle.Hyperlinks.Count > 0 Then
.Hyperlinks.Add Anchor:=.Cells(ZeileMail, SpaMail1), _
Address:=Zelle.Hyperlinks(1).Address, ScreenTip:=Zelle.Hyperlinks(1).Address
Else
'gefundene Zelle hat keinen Hyperlink
If bolMsgBox = True Then
If MsgBox("Zu Wert """ & strMail1 & """ gefundene Zelle in Zeile " & Zelle.Row _
& " in Blatt """ & wksHyp.Name & """ hat keinen Hyperlink", _
vbInformation + vbOKCancel, _
"Hyperlink ergänzen - gefundene Zelle hat keinen Hyperlink") _
= vbCancel Then Exit Sub
End If
End If
Else
'identischer Eintrag in 2. Spalte nicht gefunden
If bolMsgBox = True Then
If MsgBox("Wert """ & strMail1 & """ in Zeile " & ZeileMail & " von Blatt """ _
& wksMail.Name & """ ist in Blatt """ & wksHyp.Name & """ mehrfach vorhanden." _
& vbLf & vbLf & "Es wurde aber kein übereinstimmender Wert """ & strMail2 _
& """ in Spalte " & SpaHyp2 & " gefunden!", _
vbInformation + vbOKCancel, _
"Hyperlinks ergänzen - 2. Spalte nicht übereinstimend") = vbCancel Then Exit Sub
End If
End If
End If
End If
Next
End With
End Sub

Anzeige
AW: Hyperlinks E-Mail Adresse, Hyperlinks filtern
05.06.2012 09:13:24
Christian
Hallo Franz,
erstmal vielen Dank. Hätte nicht gedacht, dass es so aufwendig wird. Vielleicht schaffst du es ja, das Ganze etwas zu vereinfachen und damit etwas performanter zu machen, wenn ich dir noch ein paar Dinge dazu sage.
1. Beide Tabellen sind nach Spalte A sortiert, also muss nicht die komplette Tabelle nach identischen Werten abgesucht werden, die nächsten Zeilen, bis ein unterschiedlicher Wert kommt, reicht.
2. Der Fall dass ein Wert in Spalte A mehrfach vorkommt, also Spalte D in Betracht gezogen wird, kommt in 6 von 2000 Zeilen vor, ich habe leider so gut wie keine Ahnung von VBA, aber dein Makro scheint mir so aufgebaut, dass Spalte D in jedem Fall in Betracht gezogen wird, reicht es nicht, wenn es nur in Betracht gezogen wird, falls mehrere identische Einträge in Spalte A vorhanden sind?
3. Falls es schneller geht, reicht es auch die komplette Zelle inkl. Hyperlink zu kopieren, muss nicht zwangsweise nur der Hyperlink sein.
Vielen Dank und Gruß
Christian
Anzeige
AW: Hyperlinks E-Mail Adresse, Hyperlinks filtern
05.06.2012 12:45:27
fcs
Hallo Christian,
viele Codezeilen gehen ja allein für die Meldetexte drauf, was aber für die Ausführungsgeschwindigkeit kaum eine Rolle spielt.
Daten in Blatt "Hyperlinks" sind sortiert.
An der Grundstruktur des Makros ändert das nichts/bis wenig. Die Find-Methode ist schon recht fix.
Die Prüfung auf Mehrfacheinträge kann aber geändert werden, so dass die Berechnung der Anzahl der Einträge im Blatt "Hyperlinks" entfällt. Das dürfte Zeitgewinn bringen.
Ob jetzt Zelle inkl. Hyperlink kopieren schneller ist als die Hyperlink.Add-Methode ? Weiss ich nicht, hab ich nicht probiert.
Nachfolgend ungetestet das angepasste Makro.
Ansonsten braucht halt die Bearbeitung großer Massen an Daten in Excel ihre Zeit. Da du das Makro ja nicht alle 5 Minuten starten wirst spielt es ja wohl keine Rolle ob es 10 oder 20 Sekunden dauert. Oder reden wir hier über Minuten?
Kritisch sind in Excel nach meiner Erfahrung Operationen, die über ca. 7000 Zeilen beinhalten. Da ist zumindest auf meinem Rechner irgendwo eine Schallmauer.
Falls in der Datei auch Formelberechnungen erfolgen, dann sollte zusätzlich zur deaktivierung der Bildschirmaktualisierung auch die Berechnung vorübergehend auf manuel gesetzt werden.
Gruß
Franz
Sub prcSuchenHyperlink(wksMail As Worksheet, SpaMail1 As Long, _
SpaMail2 As Long, wksHyp As Worksheet, SpaHyp1 As Long, SpaHyp2 As Long, _
Optional ZeileMail_1 As Long = 2, Optional ZeileHyp_1 As Long = 2)
'Sucht für Einträge ohne Hyperlink in Spalte "SpaMail1" von Blatt "wksMail" _
in Blatt "wksHyp" Spalte "SpaHyp1" den Hyperlink und überträgt diesen nach wksMail.
'Falls erforderlich werden zusätzlich die Spalten "SpaMail2" und "SpaHyp2" verglichen.
Dim strMail1 As String, strMail2 As String
Dim BereichHyp As Range, bolFound As Boolean
Dim Zelle As Range
Dim ZeileMail As Long, iOffset As Integer
Const bolMsgBox As Boolean = True 'False :Meldungen werden nicht angezeigt
With wksHyp
.Rows.Hidden = False
'Bereich mit den zu findenden Hyperlinks
Set BereichHyp = .Range(.Cells(ZeileHyp_1, SpaHyp1), _
.Cells(.Rows.Count, SpaHyp1).End(xlUp))
End With
With wksMail
.Rows.Hidden = False
For ZeileMail = ZeileMail_1 To .Cells(.Rows.Count, SpaMail1).End(xlUp).Row
If .Cells(ZeileMail, SpaMail1).Hyperlinks.Count = 0 _
And .Cells(ZeileMail, SpaMail1).Text  "" Then
'Werte aus Spalte A und D einlesen
strMail1 = .Cells(ZeileMail, SpaMail1).Text
strMail2 = .Cells(ZeileMail, SpaMail2).Text
'Wert aus Spalte A in Hyperlink-Bereich suchen
Set Zelle = BereichHyp.Find(what:=strMail1, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Eintrag nicht gefunden
If bolMsgBox = True Then
If MsgBox("Wert """ & strMail1 & """ in Zeile " & ZeileMail & " von Blatt """ _
& wksMail.Name & """ in Blatt """ & wksHyp.Name & """ nicht gefunden!", _
vbInformation + vbOKCancel, _
"Hyperlinks ergänzen - Wert nicht gefunden") = vbCancel Then Exit Sub
End If
Else
'Prüfen, ob Eintrag mehrfachvorhanden
bolFound = False
If Zelle.Offset(1, 0) = strMail1 Then
iOffset = 0
'Eintrag mit Übereinstimmung in den beiden anderen Spalten suchen
Do
If strMail2 = wksHyp.Cells(Zelle.Row + iOffset, SpaHyp2).Text Then
Set Zelle = Zelle.Offset(iOffset, 0)
bolFound = True
Exit Do
End If
iOffset = iOffset + 1
Loop Until Zelle.Offset(iofffset, 0)  strMail1
Else
bolFound = True
End If
If bolFound = True Then
If Zelle.Hyperlinks.Count > 0 Then
.Hyperlinks.Add Anchor:=.Cells(ZeileMail, SpaMail1), _
Address:=Zelle.Hyperlinks(1).Address, ScreenTip:=Zelle.Hyperlinks(1).Address
Else
'gefundene Zelle hat keinen Hyperlink
If bolMsgBox = True Then
If MsgBox("Zu Wert """ & strMail1 & """ gefundene Zelle in Zeile " & Zelle.Row _
& " in Blatt """ & wksHyp.Name & """ hat keinen Hyperlink", _
vbInformation + vbOKCancel, _
"Hyperlink ergänzen - gefundene Zelle hat keinen Hyperlink") _
= vbCancel Then Exit Sub
End If
End If
Else
'identischer Eintrag in 2. Spalte nicht gefunden
If bolMsgBox = True Then
If MsgBox("Wert """ & strMail1 & """ in Zeile " & ZeileMail & " von Blatt """ _
& wksMail.Name & """ ist in Blatt """ & wksHyp.Name & """ mehrfach vorhanden." _
& vbLf & vbLf & "Es wurde aber kein übereinstimmender Wert """ & strMail2 _
& """ in Spalte " & SpaHyp2 & " gefunden!", _
vbInformation + vbOKCancel, _
"Hyperlinks ergänzen - 2. Spalte nicht übereinstimend") = vbCancel Then Exit Sub
End If
End If
End If
End If
Next
End With
End Sub

Anzeige
AW: Hyperlinks E-Mail Adresse, Hyperlinks filtern
05.06.2012 23:47:01
Christian
Hallo Franz,
das ganze läuft jetzt recht fix. Hat sich noch ein anderes Problem aufgetan, welches allerdings hausgemachter Natur ist. In Spalte D bzw. B stehen am Ende der Texte oftmals noch ein Leerzeichen, was bewirkt, dass der Vergleich zwischen den Zellen nicht funktioniert. Aber da in diesen Zellen keine Hyperlinks vorhanden sind, sollte sich das Problem ja mit der GLÄTTEN-Funktion beheben lassen. Werde mich aber nochmal melden, wenn es nicht an Leerzeichen gelegen haben sollte.
Gut ich rede hier in der Tabelle E-Mail von knapp 33.000 Zeilen insgesamt, davon knapp 2000 ohne Hyperlink. In der Tabelle Hyperlinks nochmal knapp über 3000 Zeilen. Aber mein I5 Quad-Core Prozessor mit 6 GB RAM hat das hinbekommen. Berechnungszeit ne knappe Minute.
Gruß und vielen Dank
Chris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige