エクセルVBAスクリプトに関する質問です。セルに縦に 1 オレンジ (A1:B1) 2 アップル(A2:B2) 3 ピーチ(A3:B3).... のようにデータが、ID,名称ではいっています。ある文字列が来たときに、この縦の範囲の中の名称に該当するがあったら、IDを返すのはどうかくのが楽なのでしょうか? ワークシート関数を使うと簡単にいけるような気もします。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/13 16:50:59
  • 終了:2010/03/13 20:42:01

ベストアンサー

id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692010/03/13 18:06:54

ポイント35pt

ワークシート関数のVLOOKUPのようですが、VLOOKUPだとキーになる列より左を取り出せないです。

(IDから名称ならば簡単にできます。)

それでVBAでやるならば、普通Findを使って次のような感じです。

Sub test()
    Dim res
    Dim str As String
    str = "アップル "
    
    Set res = Range("B:B").Find(what:=str, lookat:=xlWhole, MatchCase:=True, MatchByte:=True)
    If Not res Is Nothing Then
        Debug.Print res.Offset(0, -1).Value
    Else
        Debug.Print str & "は見つかりません"
    End If
End Sub

FINDを使うときは、LookAtの引数を指定しないと規定値が部分一致なのでxlWhole(全て一致)を必ず指定してください。

また、検索して見つからなかった場合の処理も必要です。

詳しくはこちら。

http://excelvba.pc-users.net/fol7/7_1.html

その他の回答(1件)

id:GreenStar No.1

GreenStar回答回数192ベストアンサー獲得回数462010/03/13 17:26:49

ポイント35pt

オレンジ 1 の並びならVLOOKUPワークシート関数! だけど逆だからMatchワークシート関数!!

いずれの場合も見つからなかった場合はエラーとなるのでON ERROR処理となる!!

Sub Macro1()
    Dim searchRange As Range, searchName As String, matchRow As Long
    On Error GoTo Err
    searchName = "アップル"
    With Worksheets("Sheet1")
        Set searchRange = Worksheets("Sheet1").Range("B1:B3")
        matchRow = Application.WorksheetFunction.Match(searchName, searchRange)
        MsgBox "IDは" & .Range("A" & matchRow).Value & "です。"
    End With
Exit Sub
Err:
    MsgBox "該当なし"
End Sub

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_ws_kansu.html


だけど! ON ERRORに頼るとろくな事がない!! VBAならFINDのほうがスマート!!

Sub Macro2()
    Dim searchName As String, searchRange As Range, matchCell As Object, matchRow As Long
    searchName = "アップル"
    With Worksheets("Sheet1")
        Set searchRange = .Range("B1:B3")
        Set matchCell = searchRange.Find(searchName)
        If matchCell Is Nothing Then
            MsgBox "該当なし"
        Else
            matchRow = matchCell.Row
            MsgBox "IDは" & .Range("A" & matchRow).Value & "です。"
        End If
    End With
End Sub

http://excelvba.pc-users.net/fol7/7_1.html

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_find.html

id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692010/03/13 18:06:54ここでベストアンサー

ポイント35pt

ワークシート関数のVLOOKUPのようですが、VLOOKUPだとキーになる列より左を取り出せないです。

(IDから名称ならば簡単にできます。)

それでVBAでやるならば、普通Findを使って次のような感じです。

Sub test()
    Dim res
    Dim str As String
    str = "アップル "
    
    Set res = Range("B:B").Find(what:=str, lookat:=xlWhole, MatchCase:=True, MatchByte:=True)
    If Not res Is Nothing Then
        Debug.Print res.Offset(0, -1).Value
    Else
        Debug.Print str & "は見つかりません"
    End If
End Sub

FINDを使うときは、LookAtの引数を指定しないと規定値が部分一致なのでxlWhole(全て一致)を必ず指定してください。

また、検索して見つからなかった場合の処理も必要です。

詳しくはこちら。

http://excelvba.pc-users.net/fol7/7_1.html

  • id:Mook
    VBA での解法を希望のようなのですが関数のやりかたですので、コメントで。

    C1 に検索したい文字列があるとき、D1に式を書くとして
    =IF(COUNTIF($B$1:$B$3,C1),LOOKUP(C1,$B$1:$B$3,$A$1:$A$3),"")

  • id:GreenStar
    両方書いておいたのに、なぜに?
    リンク先も一緒なのに、どうして? 今後のために選考基準を教えていただければ幸いです。

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

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

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

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