web-dev-qa-db-ja.com

文字列内のコンマの後のテキストのみを返す方法

アクティブなウィンドウのタイトルバーで、親の間のテキストを抽出しています。その部分はうまく機能しています(以前にここで受けたいくつかの助けに感謝します!)。次に、2つの別々のマクロを作成します。1つは名のみを返し、もう1つは姓のみを返します。

アクティブなウィンドウのタイトルバーは次のようになります。

左側のテキスト(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

2番目のマクロは最初のマクロと同じですが、コードの最後から2番目の行に「左」命令ではなく「右」命令がある点が異なります。

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

私の問題は次のとおりです。「名」マクロは、単に名ではなく、常に姓から最初の4文字を引いた後、名を返します。

私がグーグルの土地のどこでも見つけることができる唯一の例は、特にエクセルのためのものです。私はVBAマニュアルを組み合わせましたが、それらはすべて、文字の右側のテキストを抽出するために使用したのと同様の例を示しています。

私は何が間違っているのですか?

7
HappyNanaMO

Split()を使用して、テキストのコンマ区切り部分から配列を作成し、最初または2番目の部分にアクセスできます。

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
8
Tim Williams

名前の最初と2番目の部分を取得するために、全員がSplitを入力したようです。 Splitを使用して、括弧を削除することもできます。これは、()が1つだけ(そして常に)あることがわかっている場合に機能します。

コードが主なアイデアです。 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オプションを示しています。主な違いは、3つのSplit品種が同じコードを使用して括弧を削除し、唯一の変更点は,のどちら側を取得するかです。 2つの分割オプションは、カンマで分割すると括弧の1つが無料で削除されるという事実を利用しています。そこにあるインデックスはもう少し複雑です。

3
Byron Wall

編集初めてはよくわからなかったようです。試行2:

カンマの右側をすべて削除します。

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

2行目は、midを使用して、最初の文字(括弧)の後のすべてを取得します。


あなたは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と書いたので、コンマの後に始まります。

2
David G