アクティブなウィンドウのタイトルバーで、親の間のテキストを抽出しています。その部分はうまく機能しています(以前にここで受けたいくつかの助けに感謝します!)。次に、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マニュアルを組み合わせましたが、それらはすべて、文字の右側のテキストを抽出するために使用したのと同様の例を示しています。
私は何が間違っているのですか?
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
名前の最初と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つが無料で削除されるという事実を利用しています。そこにあるインデックスはもう少し複雑です。
編集初めてはよくわからなかったようです。試行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と書いたので、コンマの後に始まります。