Hyperlink in Tabellenkalkukation(en)
30. Oktober 2009 von Da DirnbocherVor kurzem stand ich vor der Frage, wie man in einer Tabellenkalkukation (Excel, Openoffice.Calc, Staroffice.Calc) die URL aus einem Link - formelmäßig - rausbekommt, der in einer Zelle steht. Also quasi die Umkehrfunktion zur Funktion HYPERLINK.
Für Excel lieferte mir Google relativ bald eine Lösung. Mit der Funktion aus dem angeführten Link erhält man sehr einfach die gewünschte URL:
Option Explicit
Function HyperLinkAddress(r As Range) As String
If r.Hyperlinks.Count > 0 Then
HyperLinkAddress = r.Hyperlinks(1).Address
Else
HyperLinkAddress = “”
End If
End Function
Für Star- bzw. Openoffice wollten offenbar zunächst die richtigen Suchbegriffe nicht einfallen, so dass auch keine brauchbaren Lösungen von Google gefunden wurden.
Nach paar Tagen und 2 erfolglosen Anfragen in einer Mailingliste und in einer Newsgroup machte ich mich nochmal auf die Suche und fand diesmal über Umwege doch noch eine Lösung für Star- bzw. Oppenoffice. Über Umwege deshalb, da mich die Suchergebnisse der ersten Suche auf neue Suchbegriffe brachten. Die Suchergebnisse daraus, wieder auf weitere Suchbegriffe …
Dafür fand ich 2 - zum Teil gleiche, aber doch unterschiedliche - Lösungen.
Die erste Lösung (EXTRACTHYPERLINK) gibts im OOoForum:
function ExtractHyperLink(lSheet as Long, lCol as Long, lRow as Long) as String
ExtractHyperLink = “– no Hyperlink –”
fields = ThisComponent.Sheets.getByIndex(lSheet-1).getCellByPosition(lCol-1,lRow-1).getText().getTextFields()
if fields.hasElements() then
ExtractHyperLink = fields.getByIndex(0).URL
endif
end function
Der Aufruf lautet dann zB
=EXTRACTHYPERLINK(SHEET(A1);COLUMN(A1);ROW(A1))
Die 2. Lösung (CELL_URL) fand ich dann beim Openoffice.org Community Forum, wobei der entscheidende Hinweis wieder aus einem Post aus dem OOoForum stammte:
Function CELL_URL(vSheet,lRowIndex&,iColIndex%,optional n%)
‘calls: getSheetCell
REM returns URL of Nth text-hyperlink from a cell, default N=1)
Dim v
If isMissing(n) then n= 1
If n < 1 then
CELL_URL = Null
exit function
endif
v = getSheetCell(vSheet,lRowIndex&,iColIndex%)
if vartype(v) = 9 then
if v.Textfields.Count >= n then
CELL_URL = v.getTextfields.getByIndex(n -1).URL
else
Cell_URL = Null
endif
else
CELL_URL = v
endif
End Function
Diese Funktion ist im Kern gleich der obigen. Der Vorteil dieser 2. Version ist an sich darin begründet, dass an dieser Fundstelle mehrere CELL_* Funktionen zu finden sind, die mehr leisten, als nur den Link zu extrahieren.
Im Grunde ist damit mein ursprüngliches Problem gelöst, und noch dazu mit einer Lösung für Star- bzw. Openoffice.
2 Probleme bleiben noch, die sind aber zur Zeit verkraftbar, und entstanden erst durch die Lösung:
- Alle Lösungen funktionieren nicht als “Umkehrfunktion” zu HYPERLINK. Das stört zwar nicht, da ich eigentlich nur eine Lösung für den Fall brauchte, dass ein Link von extern reinkopiert wurde. Es hat mich allerdings etwas Zeit gekostet, da ich zuerst der Meinung war, dass die Lösungen bei mir nicht funktionieren.
- Für Star- und Openoffice gilt der Hinweis aus der 2. Lösung. Der Nachteil im Vergleich zu Excel ist die fehlende automatische Neuberechnung.
Contrary to Excel-VBA, user defined functions do not get cell objects as arguments. StarBasic functions get (arrays of) values only. After opening a saved document or after changing anything related, these function need a hard recalculation (Ctrl+Shift+F9). Usually they can not update automatically because the arguments don’t change.
Geschrieben in Office | 2 Kommentare »










