• 締切済み

vba vlookupについて

VBAで範囲検索をしたくて、 vlookuを使おうと思ったのですが 1000~2000 2001~3000 3001~4000 4001~5000 5001~6000 6001~7000 7001~8000 8001~9000 9001~10000 このような表から 1237 を検索しようとすると失敗してしまいました(・・;) wskyu.Range("D24") = Application.WorksheetFunction.VLookup(kihon, .Range("D:H"), 5, True) このコードでエラーは起きず、 kihonに1237が入っています 1000 2001 ↑がD列です H列は 309 359 406 569 630 680 700 703 904 こんな感じです 思い通りにいけば1237を検索するので当てはまるのは1列目で 309が表示される予定だったのですが 実際やってみると630が表示されました、、、 なぜなのでしょうか そもそもVLOOKUPでこのような検索方法はできないのでしょうか? 補足として 最初はSELECT CASEを使い 1000~2000の間にあれば 309を表示 という風にしていたので 表などが間違っているのではないようです しかしそれだとコードがとても長くなってしまうので VLOOKUPにしようと思いました どうかよろしくお願いします!!

みんなの回答

noname#203218
noname#203218
回答No.3

>上の方法でできると教えていただいたのですが、、、 結果が違っているのですから、人のせいにしないでご自身で理解する事が大事なのでは・・・

lostsymbol
質問者

補足

その質問を見ていただければわかるのですがそこでは写真までついていてうまくいっていたんですよ(・・;) コードは全く同じなのになぜかな~と思いまして、、、

noname#203218
noname#203218
回答No.2

書かれてるコードのでは、抽出したいデータがH1にある場合、D1に検索用1237が存在しないと検索結果は得られません。 VLOOKUP関数を勘違いされてるようですね。 VLOOKUPの解説 VLOOKUP 関数を使用すると、セル範囲の最初の列を検索し、その範囲の同じ行にある任意のセルから値を返すことができます。 検索したいセル範囲の指定、抽出したい列が、検索セル範囲の何番目の列なのか。これが重要ですよね。 見なおせば簡単だと思いますので、頑張って下さい。

lostsymbol
質問者

補足

昔の自分の 「VBA 検索」 という質問で 上の方法でできると教えていただいたのですが、、、

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

あの・・・ 1000 309 2000 359 3000 406 という表で =VLOOKUP(1237,A1:B3,2) ってやると 309 が出てきますよ。 359を出したいなら 0    309 1000 359 2000 406 とやらなくちゃ

lostsymbol
質問者

補足

出したいのは309ですが、、、 何故でないのでしょうか コードはあってますよね??

関連するQ&A

  • Excel2013VBAでVLOOKUP条件付き

    いつもお世話になっております。 Excel2013VBAでVLOOKUP関数を使用して、商品名に対応した商品コードをとりたいのですがうまくいきません。 アクティブシートの表のA列、D列、G列に商品名を複数入力してあります。 テーブルシートのB列に同じく商品名があり、C列に商品コードがあります。 VLOOKUPを使ってテーブルシートから商品コードを取り出して、アクティブシートのA列、D列、G列の商品名の下の行に商品コードを入力するにはどうすればよろしいでしょうか? 条件として、テーブルシートのC列の商品コードは空白のものが存在する。その場合は処理する必要なし。 アクティブシート内の商品名の下の行が空白の場合のみ処理を行う。商品名が連続して入力してある箇所で商品コードが存在する場合は、メッセージでセル番地を表示して、処理を中断。ただし連続して入力してあっても、商品コードが存在しないものは問題なしとして次の処理を行う。 一部作りかけのものを提示します。また、下記コードはブレークポイントで停止しながらだと一応動作していましたが、普通に動かすとフリーズを起こします。すいません。 たびたびすいませんが、よろしくお願いいたします。 Sub VLOOKUP検索() Dim h As Range, ac As Range Application.ScreenUpdating = False Set ac = ActiveWindow.ActiveCell On Error Resume Next For Each h In Range("A:A,D:D,G:G") If h.Offset(1, 0) = "" Then h.Offset(1, 0) = Application.WorksheetFunction.VLookup(h, Worksheets("テーブル").Range("B:C"), 2, False) End If Next Application.ScreenUpdating = True ac.Select End Sub

  • エクセル VBA VLOOKUP

    お世話になります。 VLOOKUPの範囲を変数で取得したいのですが教えて下さい。 下記コードは動きますが、検索範囲の("A1:C4")の『C4』を変数に変更はできますでしょうか。 (データは増える予定ですなので) Range("E1") = Application.WorksheetFunction.VLookup(Range("D1"), Range("A1:C4"), 2, False) 宜しくお願い致します。

  • VBAでVlookupを使って

    いつもお世話になっています。 VBAで現場検索登録シートと言うところに 一覧シートからVlookupを使って 表示させようと思い作りました。 エラーも何もでません。 ただ、表示されるものがちゃんと検索されるものと まったくされないものがあります。 Vlookupはマクロの記録から作ったものです。 原因がわかりません。 よろしくお願い致します。 '検索ボタン Private Sub CommandButton6_Click() '送り方 Range("C4:D4").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,22,FALSE)" Selection.Value = Selection.Value '封筒 Range("C5:D5").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,23,FALSE)" Selection.Value = Selection.Value '得意先名ふりがな Range("C6:F6").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,6,FALSE)" Selection.Value = Selection.Value '得意先名 Range("C7:F8").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,4,FALSE)" Selection.Value = Selection.Value '現場名ふりがな Range("C9:H11").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,9,FALSE)" Selection.Value = Selection.Value '現場名 Range("C10:H11").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,7,FALSE)" Selection.Value = Selection.Value End Sub エラーも何もなく、ちゃんと動くことは動きます。 検索結果が、検索コードによって違うのです。 よろしくお願い致します

  • エクセルVBA VLOOKUPについて

    エクセル VBA初心者です。 関数でのVLOOKUPをVBAで作りたいのですが、上手くいきません。 あらかじめ、Sheet2の1から300行までに A列  / B列 商品名 / 商品コード が入力されています。(名前の定義=商品コード) Sheet1にユーザーフォームを利用して、データを書き込んだ後、 B列に商品名が書き込まれると、 A列に商品コードが表示されるようにしたいと考えています。 A列に =IF(B2="","",VLOOKUP(B2,商品コード,2,FALSE)) と入力していたのですが、 VBAでIfを使って出来ないかと考えてみたのですが、 上手くいきませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sRow As Long Dim sColumn As Long sRow = ActiveCell.Row sColumn = ActiveCell.Column If Cells(sRow, 2).Value = True Then Cells(sRow, 1).Value = WorksheetFunction.VLookup(Cells(sRow2).Value, Worksheets("Sheet2").Range("A1:B300"), 2, False) ElseIf Cells(sRow, 2).Value = " " Then Cells(sRow, 1).Value = " " End If End Sub ご教授いただけないでしょうか? エクセル2003 WindowsXP

  • 日付セルをVBAのVLOOKUPで見つけられません

     今日は、質問させていただきます。どうぞよろしくお願いいたします。  環境:Excel2010+Win7 でございます。  今、A列の日時データの中から、特定の日時のセルの行を取得しようといたしまして、下記のようにコーディングいたしました。が何故か WorksheetFunction.CountIfでは見つかっているのですが WorksheetFunction.VLookupではエラーが帰ってまいります。 【A列のデータ】(ユーザ定義で「yyyy/mm/dd hh:mm:ss.000」としております。) 2015/05/16 22:00:00.002 2015/05/16 22:00:00.182 2015/05/16 22:00:00.342     :     : 【VBA】 Sub test()  Dim WS_DATA As Worksheet  Set WS_DATA = ThisWorkbook.Worksheets("Sheet1")  With WS_DATA   str時間 = "2015/05/16 22:00:00.002"   If WorksheetFunction.CountIf(.Range("A:A"), str時間) > 0 Then    MsgBox (Application.WorksheetFunction.VLookup(str時間, .Range("A:A"), 1, False)) '←ここでエラーになります   Else  MsgBox str時間 & "がリストに存在しません。"   End If  End With End Sub 【実行結果】  コード中に記しましたエラー箇所で、 「実行時エラー1004   WorksheetFunctionクラスのVlookupプロパティーを取得できません」となります。検索範囲内に見つからない場合のエラーのようでございます。  あとVBAに 日時 = Format(str時間, "yyyy/mm/dd hh:mm:ss.000") を追記して、この「日時」を探してみましたが、同じ結果になりました。。。 (CountIfでは見つかっていますが、Vlookupではエラーになります。)  データが大量にありますので高速に検索出来る方法を探しておりますが (=おそらく、VLookUpを使うか、もしくはA列をVariant型に入れて検索する?)、 何か良い方法はないものでございましょうか?  もしお詳しい方がいらっしゃいましたら,是非アドバイスいただきたく 何卒よろしくお願いいたします。

  • 【VBA】Vlookupのエラー処理

    VBAでWorksheetFunction.VLookupを利用しています。 エラーが発生した場合も、「参照先の表をもとに値を表示する」ようにしたいのですが、可能でしょうか。 【参照先の表】  一列目      二列目  あ        か  い        き  う        く  え        け  お        こ  ※エラー時    ん ※「あ」のときは「か」を表示させる。 ※「さ」のときは「ん」を表示させる。 エラー時に「ん」を表示させたいということではなく、 「表を参照して「ん」を表示させたい」という要望です。 (表を変更すればコードを変更せずとも表示を変えられる仕様) 言葉足らずかもしれませんが、ご協力お願いします。

  • VLOOKUP関数をエクセルVBAで使いたいのですが、

    VLOOKUP関数をエクセルVBAで使いたいのですが、 式が間違っているのかどうかは分かりませんが実行できませんでした。 式は以下の通り、書きました。 どこが違うかご指摘願います。 よろしくお願いします。。 'VLOOKUPを行う Sheets("過去履歴").Range("BJ6").Value = Application.WorksheetFunction.Vlookup(Sheets("登録書").Range("A2").Value,Sheets("過去履歴").Range("B6:BG65536"),1,0)

  • VLookupで一致しなかった時のVBAでの処理

    On Error ~を使わないで、 VLookup()で一致しなかった時の処理をさせたいのですが どのように記述すればよいでしょうか。 例えば、以下のようなコードの場合、 一致したデータがない時にyに-1を代入するには 以下のコードをどのように記述すればよいのでしょうか。 --------------------- Dim x As Integer Dim y As String x = 7 y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) --------------------- 以下はいずれもエラーになりますが、以下のような感じで処理がしたいです。 --------------------- If IsError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- y = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False), -1) --------------------- なお、以下のように本来エラーではない処理で On Error Resume Nextを使うのは、 本当のエラーの処理と混同するため不可 --------------------- On Error Resume Next y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) If Err <> 0 Then y = -1 On Error GoTo 0 ---------------------

  • VBAでVLOOKUP関数を使う

    「在庫検索」に下記条件を追加するには、どうすれば良いのでしょうか。 1)G列が1500より大きければ Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 2, False) 2)G列が1500より小さければ Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 3, False) どちらの際も空白の条件、If ActiveCell.offset(i, 1).value = ""は残ります。 1)、2)とandを組み合わせる方法でチャレンジしたのですが、出来ませんでした。 ------------------------------------------------------------------------ 以下がベースの「在庫検索」です。 一度、質問して解決したのですが、更なる問題が発生してしまいました。 ご指導ください。 ------------------------------------------------------------------------ Sub 在庫数検索() Dim SerchName As String Dim SerchArea As Range Dim Results As Variant '初期設定 Range("A2").Activate ItemCode = Range("A2").Value i = 0 '検索範囲の設定(ポイント1) Set SerchArea =Worksheets("シート2").Range("List1") '商品コードが空になったら終わり Do Until ItemCode = "" If ActiveCell.offset(i, 1).value = "" Then '★1 On Error Resume Next ItemCode = ActiveCell.offset(i, 0).value Results = Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 2, False) If Err <> 0 Then Results = "" ActiveCell.offset(i, 1) = Results End If '★1 i = i + 1 Loop

  • VBA WorksheetFunction.VLookupとoffsetプロパティー

    エクセル2002使用です。 VBAの記述で、WorksheetFunction.VLookupを使って求めた値の入っているセルの列方向に一つ下の値を取得したいのですが・・・・ range("A1").Value =WorksheetFunction.VLookup( range("B1").Value, Range("A3:C10"), 3, 1) 例えば上記で得た値がC4セルにあるのであれば、C5セルの値を取得したいのです。 offset(0,1)プロパティーをどこにおけば良いのか良くわかりません。 どうかよろしくお願いします。

専門家に質問してみよう