Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1352to1356
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

Frage zu einem Code

Frage zu einem Code
08.03.2014 19:35:38
Jenny
Hallo an alle,
habe eine Frage zu unten stehedem Code.
Seht ihr da irgend eine Begrenzung, was die Anzahl der zu überprüfenden Zeilen in den Tabellen "Tabelle4" und "Hyperlinks" anbelangt?
Ich habe das Gefühl. dass wenn es an die 10000+ Zeilen geht, dass nicht mehr alle berücksichtigt werden. Gibt es da zum Beispiel Variablen, die nur eine gewisse Anzahl zulassen?
Wenn ja, hat jemand alternativ eine Möglichkeit, dass sagen wir mal 50.000 Zeilen pro Tabellenblatt kein Problem sind? Die Zeit, die das Makro benötigt soll dabei erstmal außer Acht gelassen werden.
Danke für Euren Rat
Jenny
Option Explicit
Public Sub SearchHyperlinks()
Dim lngRow As Long
Dim objCell As Range
Dim objRegEx As Object, objMatch As Object
Dim strSearchName As String, strFoundName As String
Dim strFirstAddress As String, strHyperlinkAddress As String
Dim strSearch2 As String
With Application
.Calculation = xlCalculationManual
.EnableEvents = False
.ScreenUpdating = False
End With
Set objRegEx = CreateObject("VBScript.RegExp")
With Worksheets("Hyperlinks")
For lngRow = 1 To .Cells(.Rows.Count, 2).End(xlUp).row
strSearchName = Trim$(.Cells(lngRow, 4).Value)
strSearch2 = Trim$(.Cells(lngRow, 5).Value)
If strSearchName  vbNullString Then
With Worksheets("Tabelle4")
Set objCell = .Columns(1).Find(What:=strSearchName, _
After:=.Cells(.Rows.Count, 1), _
LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
End With
If Not objCell Is Nothing Then
strFirstAddress = objCell.Address
Do
If objCell.Hyperlinks.Count  0 _
And InStr(1, objCell.Text, strSearch2) > 0 Then
If InStr(objCell.Hyperlinks.Item(1).Address, "profile.php") Then
strHyperlinkAddress = Split(objCell.Hyperlinks.Item(1).Address, "&")(0)
Else
strHyperlinkAddress = Split(objCell.Hyperlinks.Item(1).Address, "?")(0)
End If
strFoundName = Trim$(objCell.Value)
If strFoundName  strSearchName Then
With objRegEx
.IgnoreCase = True
.Pattern = "^" & strSearchName & " | " &  _
strSearchName & "$" _
_
_
_
_
Set objMatch = .Execute(strFoundName)
End With
If objMatch.Count = 1 Then
If objMatch.Item(0).Value = strSearchName & " "  _
Or _
objMatch.Item(0).Value = " " & strSearchName  _
Then _
Call WriteLink(strHyperlinkAddress, lngRow)
End If
Else
Call WriteLink(strHyperlinkAddress, lngRow)
End If
End If
Set objCell = Worksheets("Tabelle4").Columns(1).FindNext( _
objCell) ' _
Loop Until objCell.Address = strFirstAddress
End If
End If
Next
End With
Set objCell = Nothing
Set objMatch = Nothing
Set objRegEx = Nothing
With Application
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
ActiveWorkbook.Save
Application.Quit
'Shell "shutdown.exe -s -f"
End Sub
Private Sub WriteLink( _
ByVal pvstrHyperlinkAddress As String, _
ByVal pvlngRow As Long)
Dim lngColumn As Long
Dim blnFound As Boolean
With Worksheets("Hyperlinks")
For lngColumn = 3 To .Cells(pvlngRow, .Columns.Count).End(xlToLeft).Column
If .Cells(pvlngRow, lngColumn).Value = pvstrHyperlinkAddress Then
blnFound = True
Exit For
End If
Next
If Not blnFound Then
lngColumn = WorksheetFunction.Max(4, _
.Cells(pvlngRow, .Columns.Count).End(xlToLeft).Column + 1)
.Cells(pvlngRow, lngColumn).Value = pvstrHyperlinkAddress
End If
End With
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Frage zu einem Code
09.03.2014 09:03:26
ChristianM
Hallo Jenny,
in der VBA-Hilfe unter "Datentypen (Zusammenfassung)" stehen die Wertebereiche der einzelnen Typen.
Da sehe ich in deinem Code keinen Fehler - hättest du zB. "lngRow" als Integer deklariert, hättest du bei Zeilen größer 32768 (2^15) ein Problem.
Aber ein Problem könnte sein:

For lngRow = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row

Hier läufst du bis zum letzten Eintrag in Spalte B. Wenn in den anderen Spalten mehr Zeilen gefüllt sind, werden diese ignoriert.
Möglicher weiterer Grund: Wenn du Filter gesetzt hast und dadurch die letzten Zeilen ausgeblendet sind, läuft ".Cells(.Rows.Count, 2).End(xlUp).Row" nur bis zur letzten eingeblendeten Zeile von Spalte B.
Gruß
Christian

Anzeige
AW: Frage zu einem Code
09.03.2014 09:20:03
Jenny
Hallo Christian,
hmmm, der Bereich Hyperlinks A:E geht durchgängig ohne Leerzellen von Zeile 1 bis 14194. Da kommen aber so einmal die Woche auch mal ein paar Zeilen hinzu. Also das mit dem Bereich schließe ich mal aus, Filter benutze ich keinen.
Könnte es denn eventuell daran liegen, dass es hier um bis zu 50.000 Hyperlinks gehen kann, die überprüft werden, ob sie in Tabelle Hyperlinks geschrieben werden sollen? Könnte da eventuell eine Grenze überschritten werden? Wo wäre dann da das Limit?
Liebe Grüße und schonmal vielen Dank
Jenny

AW: Frage zu einem Code
09.03.2014 18:03:26
ChristianM
Hallo Jenny,
Ich habe eben mal unter xl2010/32Bit und unter xl2002 65530 Hyperlinks eingefügt.
Beim 65531-sten Hyperlink gibt es einen Fehler. Offensichtlich ist da das Limit erreicht.
Zu xl365 kann ich nichts sagen.
Teste doch mal in einer neuen Mappe:
Option Explicit
Sub TestCountOfHyperlink()
Dim i&, j&, k&
Dim strAddr$
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
With Sheets("Tabelle1")
.Cells.Delete
For i = 1 To 5000
For j = 1 To 20
strAddr = "Tabelle2!" & .Cells(i, j).Address(0, 0)
.Hyperlinks.Add Anchor:=.Cells(i, j), _
Address:="", SubAddress:=strAddr, _
TextToDisplay:=strAddr
k = k + 1
Next
Next
End With
ErrorHandler:
Err.Clear
Application.ScreenUpdating = True
MsgBox "es wurden " & k & " von 100.000 Hyperlinks eingefügt"
End Sub
Gruß
Christian

Anzeige
AW: Frage zu einem Code
10.03.2014 18:43:23
Jenny
Hallo Christian,
ich glaube da hast du den wunden Punkt gefunden. Wenn es mal über die 50.000 geht in Tabelle4 dazu die 14000 in der Tabelle Hyperlinks kann das dann durchaus der Grund sein.
Muss ich wohl darauf achten, die Tabelle4 nicht mit zuvielen Daten zu füttern, oder hast du noch eine andere Idee?
Jedenfalls dein Makro hat auch unter XL2013 X64 65530 ergeben.
LG
Jenny

Max Anzahl von Hyperlinks = 65.530 pro Blatt
11.03.2014 19:43:04
Hyperlinks
Hallo Jenny,
das Limit 65.530 gilt offensichlich pro Tabellenblatt.
Mit deinem Code fügst du ja keine neuen Hyperlinks hinzu, sondern suchst nach diesen.
Hast du wirklich soviele Hyperlinks?
Das kannst du prüfen mit zB:
Sub CountHyperlinks()
Dim wks As Worksheet
Dim strMsg  As String
For Each wks In ThisWorkbook.Worksheets
strMsg = strMsg & wks.Name & vbTab & wks.Hyperlinks.Count & vbLf
Next
MsgBox strMsg
End Sub
Ungeachten dessen, ob es sinnvoll ist, soviele Hyperlinks zu verwenden, liegt der Fehler ggf. auch in deiner Abfrage...
    If InStr(objCell.Hyperlinks.Item(1).Address, "profile.php") Then
strHyperlinkAddress = Split(objCell.Hyperlinks.Item(1).Address, "&")(0)
Else
strHyperlinkAddress = Split(objCell.Hyperlinks.Item(1).Address, "?")(0)
End If
kann es hier nur diese beiden Varianten geben?
Gruß
Christian
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige