von preklov » So, 01.05.2016 12:55
Gegeben sei: in einer Calc-Tabellenzelle steckt ein URL-Textfeld mit z.B. dem Text "Alte Datei" und dem Pfad "file:///home/volker/altedatei.pdf". Dieses Feld soll per Makro manipuliert werden, z.B. zu: "Neue Datei" und "file:///home/volker/neuedatei.pdf".
Ich finde 3 Möglichkeiten, aber nur eine davon funktioniert.
Die Prozedur WriteCellFieldURL() holt sich das Feld aus der Funktion GetCellFieldURL...
Mit GetCellFieldURL1 (Enumeration der Textfelder) wird das Feld zwar gefunden, es unterstützt aber offenbar nicht den Service URL. Warum nicht?
Mit GetCellFieldURL2 (Enumeration der Absatzelemente) wird das Feld gefunden und zurückgegeben. Die Änderung der Properties URL und Representation wird ohne Fehler akzeptiert, kommt aber nicht in der Zelle an. Warum nicht?
Erst mit GetCellFieldURL3 (Enumeration der Textfelder und Auslesen der URL-Property mit Fehlerbehandlung) erreiche ich, was ich will. Irgendwie empfinde ich diese Methode aber als unsauber.
Code: Alles auswählen
Function GetCellFieldURL1(oCell)
Dim oEnum, oField
Dim sURL As String
oEnum = oCell.TextFields.createEnumeration()
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
If oField.supportsService("com.sun.star.text.TextField.URL") Then
Print oField.Representation & ": " & oField.URL
GetCellFieldURL1 = oField
Exit Function
End If
Loop
End Function
Function GetCellFieldURL2(oCell)
Dim oText, oParEnum, oParElement
Dim oEnum, oElement, oField
oParEnum = oCell.getText().createEnumeration()
Do While oParEnum.hasMoreElements()
oParElement = oParEnum.nextElement()
oEnum = oParElement.createEnumeration()
Do While oEnum.hasMoreElements()
oElement = oEnum.nextElement()
If oElement.TextPortionType = "TextField" Then
oField = oElement.TextField
If oField.supportsService("com.sun.star.text.TextField.URL") Then
Print oField.Representation & ": " & oField.URL
GetCellFieldURL2 = oField
Exit Function
End If
End If
Loop
Loop
End Function
Function GetCellFieldURL3(oCell)
Dim oEnum, oField
Dim sURL As String
oEnum = oCell.TextFields.createEnumeration()
On Local Error Goto NoURL
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
sURL = oField.URL
Print oField.Representation & ": " & oField.URL
GetCellFieldURL3 = oField
Exit Function
NoURL:
Loop
End Function
Sub WriteCellFieldURL()
Dim oCell, oField
oCell = ThisComponent.Sheets(0).getCellByPosition(0, 0)
oField = GetCellFieldURL1(oCell)
'oField = GetCellFieldURL2(oCell)
'oField = GetCellFieldURL3(oCell)
If Not IsEmpty(oField) Then
oField.Representation = "Neue Datei"
oField.URL = "file:///home/volker/neuedatei.pdf"
Print oField.Representation & ": " & oField.URL
Else
Print "Leer"
End If
End Sub
Mache ich etwas falsch?
Schöne Grüße
Volker
Gegeben sei: in einer Calc-Tabellenzelle steckt ein URL-Textfeld mit z.B. dem Text "Alte Datei" und dem Pfad "file:///home/volker/altedatei.pdf". Dieses Feld soll per Makro manipuliert werden, z.B. zu: "Neue Datei" und "file:///home/volker/neuedatei.pdf".
Ich finde 3 Möglichkeiten, aber nur eine davon funktioniert.
Die Prozedur WriteCellFieldURL() holt sich das Feld aus der Funktion GetCellFieldURL...
Mit GetCellFieldURL1 (Enumeration der Textfelder) wird das Feld zwar gefunden, es unterstützt aber offenbar nicht den Service URL. Warum nicht?
Mit GetCellFieldURL2 (Enumeration der Absatzelemente) wird das Feld gefunden und zurückgegeben. Die Änderung der Properties URL und Representation wird ohne Fehler akzeptiert, kommt aber nicht in der Zelle an. Warum nicht?
Erst mit GetCellFieldURL3 (Enumeration der Textfelder und Auslesen der URL-Property mit Fehlerbehandlung) erreiche ich, was ich will. Irgendwie empfinde ich diese Methode aber als unsauber.
[code]Function GetCellFieldURL1(oCell)
Dim oEnum, oField
Dim sURL As String
oEnum = oCell.TextFields.createEnumeration()
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
If oField.supportsService("com.sun.star.text.TextField.URL") Then
Print oField.Representation & ": " & oField.URL
GetCellFieldURL1 = oField
Exit Function
End If
Loop
End Function
Function GetCellFieldURL2(oCell)
Dim oText, oParEnum, oParElement
Dim oEnum, oElement, oField
oParEnum = oCell.getText().createEnumeration()
Do While oParEnum.hasMoreElements()
oParElement = oParEnum.nextElement()
oEnum = oParElement.createEnumeration()
Do While oEnum.hasMoreElements()
oElement = oEnum.nextElement()
If oElement.TextPortionType = "TextField" Then
oField = oElement.TextField
If oField.supportsService("com.sun.star.text.TextField.URL") Then
Print oField.Representation & ": " & oField.URL
GetCellFieldURL2 = oField
Exit Function
End If
End If
Loop
Loop
End Function
Function GetCellFieldURL3(oCell)
Dim oEnum, oField
Dim sURL As String
oEnum = oCell.TextFields.createEnumeration()
On Local Error Goto NoURL
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
sURL = oField.URL
Print oField.Representation & ": " & oField.URL
GetCellFieldURL3 = oField
Exit Function
NoURL:
Loop
End Function
Sub WriteCellFieldURL()
Dim oCell, oField
oCell = ThisComponent.Sheets(0).getCellByPosition(0, 0)
oField = GetCellFieldURL1(oCell)
'oField = GetCellFieldURL2(oCell)
'oField = GetCellFieldURL3(oCell)
If Not IsEmpty(oField) Then
oField.Representation = "Neue Datei"
oField.URL = "file:///home/volker/neuedatei.pdf"
Print oField.Representation & ": " & oField.URL
Else
Print "Leer"
End If
End Sub
[/code]
Mache ich etwas falsch?
Schöne Grüße
Volker