Reputation: 397
I need help with the creation of an Excel VBA-function.
A string variable "mystring" can have three different formats.
The first is just a normal text string. Nothing needed for this case. The other two versions are needed to handle tags and href links for a later html output.
Excel Example:
mystring = "This is a headline"
mystring = "<myLink href='some/link.html'</myLink> This is also a headline"
mystring = "<noLink href='#'</noLink> This is another headline"
So, I need to identify if the string contains a myLink or noLink tag and assign the according href to an xml href-attribute.
For noLink it's more userfriendly to just write the <nolink>-tag
and let the function add the href='#'
, I believe.
I am open to suggestions if there's a better way to set up those delimiters.
Also, the actually headline text is part of the xml-tag and later used for the mystringName xml-attribute.
For the above examples these should be the resulting xml tags:
<mytag mystringName="This is a headline"/>
<mytag mystringName="This is also a headline" href="some/link.html" />
<mytag mystringName="This is another headline" href="#" />
With the help of XSL I can then deal with the different href attributes.
How I think this could be used inside VBA:
If mystring = "myLink" Then
xmf.writeline "<mytag mystringName=""" & mystring & """href= """ & href & """ > """
End If
I have stumpled over this function I found online:
I would need to write the delimiter a bit differently.
"<myLink href=some/link.html>"This is also a headline
Maybe this is a good starting point to split the pieces and put them in an array.
Public Function GetStringFromQuotation(ByRef sText, sDelimiter As String)
'Store the position of the 1st and 2nd delimiter in the String
Dim iPositionOfFirstDelimiter As Integer, iPositionOfSecondDelimiter As Integer
'Store the length of the delimiter
Dim iLenDelimiter As Integer
'Deliver nothing if the function doesn't get a single usable parameter
'otherwise you'd get an error later on
If Len(sText) = 0 And Len(sDelimiter) = 0 Then
GetStringFromQuotation = ""
Exit Function
End If
iLenDelimiter = Len(sDelimiter)
'Find 1st occurence of delimiter
iPositionOfFirstDelimiter = InStr(sText, sDelimiter)
'Find the 2nd one, starting right behind the first one
iPositionOfSecondDelimiter = InStr(iPositionOfFirstDelimiter + iLenDelimiter, _
sText, sDelimiter)
'If there are 2 occurences
If iPositionOfFirstDelimiter > 0 And iPositionOfSecondDelimiter > 0 Then
'Take the part of the string that's right between them
GetStringFromQuotation = Mid(sText, iPositionOfFirstDelimiter + iLenDelimiter, _
iPositionOfSecondDelimiter - iPositionOfFirstDelimiter - iLenDelimiter)
Else
GetStringFromQuotation = ""
End If
End Function
Hope you can help me to get this function (or some other) to work.
Thanks a lot.
Upvotes: 2
Views: 2306
Reputation: 2501
Why not write a wrapper function to handle the logic:
Private Function makeLink(linkText As String, Optional linkUrl As String)
Dim linkUrlText As String
If (Len(Trim(linkUrl)) > 0) Then
linkUrlText = " href=" & """" & linkUrl & """"
End If
makeLink = "<mytag mystringName=""" & linkText & """" & linkUrlText & " />"
End Function
Then you just call it as follows:
Sub test()
Dim link1 As String
link1 = makeLink("This is a headline")
link2 = makeLink("This is also a headline", "some/link.html")
link3 = makeLink("This is another headline", "#")
End Sub
Upvotes: 2
Reputation: 15337
If I understand correctly, your string can potentially have 1 or 3 sections. I would use a single delimiter (of one or more characters) to separate these sections, and drop the single-quotes, as follows:
'Using a semicolon
mystring = "This is a headline"
mystring = "myLink;some/link.html;This is also a headline"
mystring = "noLink;#;This is another headline"
The function you write can then look like this:
Public Function GetXML(str As String) As String
Dim mylinkPos As Integer, nolinkPos As Integer
Dim remainderString As String, nextDelimiterPos As String
Dim href As String, headline As String
mylinkPos = InStr(str, "mylink;")
nolinkPos = InStr(str, "nolink;")
If mylinkPos = 0 And nolinkPos = 0 Then
GetXML = "<mytag mystringName=""" & str & """ />"
Exit Function
End If
remainderString = Mid(str, 8)
If nolinkPos > 0 Then
headline = remainderString
href = "#"
Else
nextDelimiterPos = InStr(remainderString, ";")
href = Left(remainderString, nextDelimiterPos - 1)
headline = Mid(remainderString, nextDelimiterPos + 1)
End If
GetXML = "<mytag mystringName=""" & headline & """ href=""" & href & """ />"
End Function
Of course, it would be much simpler and more elegant to use regular expressions, which you can use by adding a reference to Microsoft VBScript Regular Expressions 5.5
from Tools -> References
.
Upvotes: 4