http://q.hatena.ne.jp/1236879956

の続きの質問です。文字列が"abc自動車=プリウス"の場合はプリウスを取り出すことができました。
しかし、例えば"abc自動車=プリウス&ab=ab&ab"といったような文字列があった場合。
つまり、一番最初の=の後から&直前まで取り出したいときはどのようにすればよいでしょうか?
上記の質問ではInStrRev関数を利用しましたが、最初のイコールの後の値を取得したい場合は
どうしたらいいでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2009/03/13 13:13:13
  • 終了:2009/03/14 04:29:19

ベストアンサー

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912009/03/13 15:12:42

ポイント100pt

testMain を実行してみてください。

結果は VBE のイミディエイトウィンドウに出ます。

(わからなかったら、Debug.Print を MsgBox にしてみてください。)


余計な部分が多いですが、今回の質問の部分は getItem( データ ) で希望の内容が取得できると思います。

Sub testMain()
    Debug.Print getItem("自動車=マーチ") & " // " & getData("自動車=マーチ")
    
    Dim data As String
    data = "自動車=クラウン&自動二輪=ZII&三輪車=マッハ号"
    Debug.Print getItem(data) & " // " & getData(data)
    Debug.Print getItem(data, 1) & " // " & getData(data, 1)
    Debug.Print getItem(data, 2) & " // " & getData(data, 2)
End Sub

'-------------------------------------------------------------------
' num 番目の Item 名(=の左側)を取得
' num は省略時は先頭、num だけデータがないときは空白を返す
'-------------------------------------------------------------------
Function getItem(data As String, Optional num As Integer = 0)
'-------------------------------------------------------------------
    Dim wArray As Variant
    wArray = Split(data, "&")
    If UBound(wArray) >= (num - 1) Then
        If InStr(wArray(num), "=") > 0 Then
            getItem = Left(wArray(num), InStr(wArray(num), "=") - 1)
        Else
            getItem = wArray(num)
        End If
    Else
        getItem = ""
    End If
End Function

'-------------------------------------------------------------------
' num 番目の Data 名(=の右側)を取得
' num は省略時は先頭、num だけデータがないときは空白を返す
'-------------------------------------------------------------------
Function getData(data As String, Optional num As Integer = 0)
'-------------------------------------------------------------------
    Dim wArray As Variant
    wArray = Split(data, "&")
    If UBound(wArray) >= (num - 1) Then
        If InStr(wArray(num), "=") > 0 Then
            getData = Mid(wArray(num), InStr(wArray(num), "=") + 1)
        Else
            getData = wArray(num)
        End If
    Else
        getData = ""
    End If
End Function
<||
id:akaired

ご回答ありがとうございます!助かりました!

2009/03/14 04:28:57

その他の回答(1件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692009/03/13 15:00:15

ポイント50pt
    Dim s As String
    Dim p1 As Integer   '=の位置
    Dim p2 As Integer   '&の位置

    s = "abc自動車=プリウス&ab=ab&ab"
    p1 = InStr(1, s, "=")
    p2 = InStr(p1, s, "&")
    MsgBox Mid(s, p1 + 1, p2 - p1 - 1)
id:akaired

ご回答ありがとうございます!助かりました!

2009/03/14 04:29:00
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912009/03/13 15:12:42ここでベストアンサー

ポイント100pt

testMain を実行してみてください。

結果は VBE のイミディエイトウィンドウに出ます。

(わからなかったら、Debug.Print を MsgBox にしてみてください。)


余計な部分が多いですが、今回の質問の部分は getItem( データ ) で希望の内容が取得できると思います。

Sub testMain()
    Debug.Print getItem("自動車=マーチ") & " // " & getData("自動車=マーチ")
    
    Dim data As String
    data = "自動車=クラウン&自動二輪=ZII&三輪車=マッハ号"
    Debug.Print getItem(data) & " // " & getData(data)
    Debug.Print getItem(data, 1) & " // " & getData(data, 1)
    Debug.Print getItem(data, 2) & " // " & getData(data, 2)
End Sub

'-------------------------------------------------------------------
' num 番目の Item 名(=の左側)を取得
' num は省略時は先頭、num だけデータがないときは空白を返す
'-------------------------------------------------------------------
Function getItem(data As String, Optional num As Integer = 0)
'-------------------------------------------------------------------
    Dim wArray As Variant
    wArray = Split(data, "&")
    If UBound(wArray) >= (num - 1) Then
        If InStr(wArray(num), "=") > 0 Then
            getItem = Left(wArray(num), InStr(wArray(num), "=") - 1)
        Else
            getItem = wArray(num)
        End If
    Else
        getItem = ""
    End If
End Function

'-------------------------------------------------------------------
' num 番目の Data 名(=の右側)を取得
' num は省略時は先頭、num だけデータがないときは空白を返す
'-------------------------------------------------------------------
Function getData(data As String, Optional num As Integer = 0)
'-------------------------------------------------------------------
    Dim wArray As Variant
    wArray = Split(data, "&")
    If UBound(wArray) >= (num - 1) Then
        If InStr(wArray(num), "=") > 0 Then
            getData = Mid(wArray(num), InStr(wArray(num), "=") + 1)
        Else
            getData = wArray(num)
        End If
    Else
        getData = ""
    End If
End Function
<||
id:akaired

ご回答ありがとうございます!助かりました!

2009/03/14 04:28:57
  • id:Mook
    オプションのハンドリングがめたメタだったので、とりあえずこっちだけ修正です。
    (オプション引数がない場合の動作は変わりません)

    '-------------------------------------------------------------------
    ' num 番目の Data 名(=の右側)を取得
    ' num は省略時は先頭、num番目のデータがないときは空白を返す
    '-------------------------------------------------------------------
    Function getData(data As String, Optional num As Integer = 1)
    '-------------------------------------------------------------------
      Dim wArray As Variant
      wArray = Split(data, "&")
      num = num - 1
      If UBound(wArray) >= num Then
        If InStr(wArray(num), "=") > 0 Then
          getData = Mid(wArray(num), InStr(wArray(num), "=") + 1)
        Else
          getData = wArray(num)
        End If
      Else
        getData = ""
      End If
    End Function

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません