我在活动窗口标题栏中的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手册结合起来,他们都提供了类似于我用于提取角色右侧文本的示例。
我做错了什么?
答案 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 Split
和three Split
选项。主要区别在于三个Split类型使用相同的代码去除括号,唯一的变化是,
的哪一侧要抓取。两个Split选项利用了这样一个事实,即在逗号上拆分可以免费删除一个括号。那里的指数有点复杂。
答案 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,所以它以逗号开头。