TonyC
TonyC

Reputation: 397

Excel VBA function dealing with delimiters

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

Answers (2)

InContext
InContext

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

Zev Spitz
Zev Spitz

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

Related Questions