如何在字符串中的逗号后仅返回文本

时间:2015-07-13 19:18:09

标签: vba ms-word word-vba comma

我在活动窗口标题栏中的parens之间提取文本。那部分工作得很好(感谢我之前收到的一些帮助!)。现在我想创建两个单独的宏 - 一个只返回第一个名称,另一个只返回姓氏。

我的活动窗口标题栏看起来像这样:

左边的一些文字(HENDERSON,TOM)右边有一些文字 (逗号后面没有空格)

姓氏宏完美无缺。它看起来像这样:

Sub a1LastName()
    'Extract last name of patient from title bar (between parens)
    Dim strPatientName As String
    Dim OpenPosition As Integer '(open paren marker)
    Dim closeposition As Integer '(close paren marker)
    OpenPosition = InStr(ActiveDocument.ActiveWindow.Caption, "(")
    closeposition = InStr(ActiveDocument.ActiveWindow.Caption, ")")
    strPatientName = Mid(ActiveDocument.ActiveWindow.Caption, _
        OpenPosition + 1, closeposition - OpenPosition - 1)
    Dim c As Long
    c = InStr(strPatientName, ",")
    strPatientName = Left(strPatientName, c - 1)
    Selection.TypeText strPatientName
End Sub

第二个宏与第一个宏相同,只是倒数第二行的代码有一个" Right"而不是"左"指令:

Sub a1FirstName()
    'Extract first name of patient from title bar (between parens)
    Dim strPatientName As String
    Dim OpenPosition As Integer '(open paren marker)
    Dim closeposition As Integer '(close paren marker)
    OpenPosition = InStr(ActiveDocument.ActiveWindow.Caption, "(")
    closeposition = InStr(ActiveDocument.ActiveWindow.Caption, ")")
    strPatientName = Mid(ActiveDocument.ActiveWindow.Caption, _
        OpenPosition + 1, closeposition - OpenPosition - 1)
    Dim c As Long
    c = InStr(strPatientName, ",")
    strPatientName = Right(strPatientName, c - 1)
    Selection.TypeText strPatientName
End Sub

这是我的问题:"名字"宏总是返回姓氏减去前四个字符,后跟第一个名称,而不是简单的名字。

我能在谷歌任何地方找到的唯一例子都是专门用于Excel的。我通过我的VBA手册结合起来,他们都提供了类似于我用于提取角色右侧文本的示例。

我做错了什么?

3 个答案:

答案 0 :(得分:8)

您可以使用Split()从文本的逗号分隔部分创建数组,然后访问第一部分或第二部分:

Sub a1LastName()
    Dim strPatientName As String
    strPatientName = ParensContent(ActiveDocument.ActiveWindow.Caption)
    If strPatientName Like "*,*" Then
        Selection.TypeText Trim(Split(strPatientName, ",")(0))
    End If
End Sub


Sub a1FirstName()
    Dim strPatientName As String
    strPatientName = ParensContent(ActiveDocument.ActiveWindow.Caption)
    If strPatientName Like "*,*" Then
        Selection.TypeText Trim(Split(strPatientName, ",")(1))
    End If
End Sub

'Utility function: find and return text enclosed by ()
'   Return empty string if no () found
Function ParensContent(txt) As String
    Dim rv As String, pos As Long, pos2 As Long
    If txt Like "*(*)*" Then
        pos = InStr(1, txt, "(")
        pos2 = InStr(pos, txt, ")")
        rv = Mid(txt, pos + 1, (pos2 - pos) - 1)
    End If
    ParensContent = rv
End Function

答案 1 :(得分:3)

似乎每个人都在Split上键入了获取名称的第一部分/第二部分。您还可以使用Split来删除括号。如果您知道自己只会(并且始终)拥有一个(),那么这就有效。

代码给出了主要想法。您可以使用Split获取String中不包含()的部分,然后再次执行以获取,的任意一侧}。

Sub t()

    Dim str As String
    str = "(Wall,Byron)"

    Dim name_first As String
    Dim name_last As String

    'two splits total
    name_last = Split(Split(str, "(")(1), ",")(0)
    name_first = Split(Split(str, ")")(0), ",")(1)

    'three split option, same code to remove parentheses
    name_last = Split(Split(Split(str, "(")(1), ")")(0), ",")(0)
    name_first = Split(Split(Split(str, "(")(1), ")")(0), ",")(1)


End Sub

上面的代码提供了two Splitthree Split选项。主要区别在于三个Split类型使用相同的代码去除括号,唯一的变化是,的哪一侧要抓取。两个Split选项利用了这样一个事实,即在逗号上拆分可以免费删除一个括号。那里的指数有点复杂。

答案 2 :(得分:2)

编辑似乎我没有,第一次理解得很好。尝试2:

您想要删除逗号的所有内容。

Mystr = Left(Mystr,  Instr(Mystr, ","))
Mystr = Mid(Mystr, 2)

第二行使用mid来获取第一个char(parentesis)之后的所有内容

您正在寻找Mid功能。

http://www.excel-easy.com/vba/string-manipulation.html#mid

像这样使用它:

Debug.Print Mid("abcde", InStr("abcde", "c"))

将返回“cde”

我使用Instr来定位它应该从哪里开始而不是写一个数字。要在逗号后面输入,请使用:

Debug.Print Mid(Mystring, InStr(Mystring, "," + 1))

Mystring是你的字符串。我写了+1,所以它以逗号开头。