Mit meinem Makro will ich Hyperlinks in Zellen einfügen, in denen sich schon welche befinden. Die einzufügenden Hyperlinks sind in einer zweiten Tabelle aufgelistet, werden von dort aus nach der Auswahl übertragen und ersetzen damit die passende Textstelle. Der Haken an der Sache ist, dass ich mit der Routine Instr() nicht die richtige Stelle im Text der Zelle bekomme und nach der Formel < exakter Wert = ermittelter Wert - Gesamtzahl der in den Hyperlinks davor verwendeten Zeichen + Anzahl dieser Hyperlinks > nachkorrigieren muss.
Beispiel (zum Demonstrationszweck leicht verändert):
in der Zelle befindet sich folgender Text:
irregular cells around the base of an intercalary branch (Fig. 3:27-29): lobes around the base of a Lejeunea-type branch (Figs 29, 310:31): an extension of the foot around the base of the seta (Figs 131, 213).
Mit einem anderen Makro ist schon der Hyperlink bei “3” eingefügt. Als nächstes ist die “29” dran.
Damit sich der Hyperlink nicht vorschnell (also in der ersten Klammer) einklinkt, lass ich den Cursor mithilfe der Informationen, die ich über Position und Zeichenkettenlänge erhalten habe [rem A], etwas vorlaufen [rem B]. Zurücksetzen muss ich hier noch nicht. Bei der “310 “ geht es getreu der obigen Formel ein Zeichen zurück [rem C], bei der “131” drei und bei der ”213” fünf Zeichen.
Code: Alles auswählen
Sub HyperlinkMehrereSpaeterA
osheet = ThisComponent.CurrentController.ActiveSheet
osheet = thisComponent.sheets.getByName(osheet.name)
h = ThisComponent.CurrentController.ActiveSheet.RangeAddress.Sheet
On Error GoTo ErrorHandler
namsh = "Abbildungen"
osheet_1 = thisComponent.sheets.getByName(namsh)
oCellCursor = oSheet_1.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.getRangeAddress().endRow
nCol = oCellCursor.getRangeAddress().endColumn
num = InputBox("Bitte geben Sie die Zeichefolge ein, die durch einen Hyperlink ersetzt werden soll!",, )
oCellRange = osheet_1.getCellRangeByPosition(0,0,nCol,nRow)
iErsteSpalte = oCellRange.rangeAddress.startColumn
iErsteZeile = oCellRange.rangeAddress.startRow
iLetzteSpalte = oCellRange.rangeAddress.EndColumn
iLetzteZeile = oCellRange.rangeAddress.EndRow
For i = iErsteZeile to iLetzteZeile
For m = iErsteSpalte to iLetzteSpalte
oCell_2 = osheet_1.getCellByPosition(m,i)
oParEnum = oCell_2.getText().createEnumeration()
Do While oParEnum.hasMoreElements()
oParElement = oParEnum.nextElement()
oEnum = oParElement.createEnumeration()
Do While oEnum.hasMoreElements()
oElement = oEnum.nextElement()
If oElement.TextPortionType = "TextField" Then
If oElement.TextField.supportsService("com.sun.star.text.TextField.URL") Then
HypAdr = oElement.TextField.URL
HypNam = oElement.TextField.Representation
If HypNam = num Then
GoTo Weiter
EndIf
End If
End If
Loop
Loop
Next m
Next i
Weiter:
ThisComponent.currentController.select( oCell_1 )
oCell_1 = ThisComponent.getCurrentSelection().getCellAddress()
ca = oCell_1.Column
ra = oCell_1.Row
oCell_1 = osheet.getCellByPosition(ca,ra)
With ThisComponent.Sheets().getByIndex(h)
x = .Columns(ca).queryEmptyCells()
fow = x(x.Count-1).RangeAddress.StartRow - 1
End With
C_1str = oCell_1.string
g = Len(C_1str)
k = InStr(C_1str, num)
rem A:
msgbox "Zuerst tritt die Zeichenfolge etwa an Position " & k & " auf." & chr(13) & "Die Zelle enthält ca. " & g & " Zeichen."
rem B:
Dim f%
f = InputBox("Bitte geben Sie an, ab dem wievielten Zeichen gesucht werden soll soll!",, )
If f = 0 Then
f = 1
EndIf
c = InStr(f, C_1str, num)
msgbox "c: " & c
d = Len(num)
rem C:
Dim e%
e = InputBox("Bitte geben Sie an, um wieviele Zeichen der Cursor zurücksetzen soll!",, )
oTextCursor = oCell_1.createTextCursor
oTextCursor.goToStart( false )
oTextCursor.goRight(c-1-e,false) rem --- Formel zur Bestimmung der exakten Position
oTextCursor.goRight(d,true)
oField = ThisComponent.createInstance("com.sun.star.text.TextField.URL")
oField.Representation = HypNam
oField.URL = ConvertToURL(HypAdr)
oCell_1.insertTextContent( oTextCursor,oField, True )
Exit Sub
ErrorHandler:
msgbox "Fehler in Zeile " & Erl
End Sub
Hat jemand eine Idee?
(Seitenfrage: manchmal kommt es vor, dass bei bestimmter Schrift- und Zellengröße die Zeigerhand nicht an der Stelle erscheint, wo der Hyperlink zu sehen ist, sonder rechts daneben oder unterhalb (automatischer Zeilenumbruch ist aktiviert). Lässt sich das abstellen, oder muss ich damit leben)?
Viele Grüße,
Ralf