VBAのVLOOKUPで日付セルが見つからないエラーが発生する

このQ&Aのポイント
  • Excel2010+Win7の環境で、特定の日時のセルをVBAのVLOOKUP関数で探そうとしていますが、エラーが発生しています。
  • A列の日時データの中から特定の日時のセルを探すために、VLOOKUP関数を使用していますが、エラーが発生しています。
  • VBAのVLOOKUP関数を使用して特定の日時のセルを探そうとしていますが、エラーが発生しています。
回答を見る
  • ベストアンサー

日付セルを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型に入れて検索する?)、 何か良い方法はないものでございましょうか?  もしお詳しい方がいらっしゃいましたら,是非アドバイスいただきたく 何卒よろしくお願いいたします。

  • MKT_
  • お礼率99% (329/330)

質問者が選んだベストアンサー

  • ベストアンサー
  • -antsu-
  • ベストアンサー率50% (84/168)
回答No.1

まず、A列のデータですが、セルを選択して数式バーには 恐らくyyyy/mm/dd hh:mm:ssまでのデータで表示されていませんか? ユーザー定義設定をしても、日付書式がある以上、 日付としての認識がなされて、後ろにつけている.000は あくまでも表示上の内容になるものと思います。 特にVlookupの文字列検索は完全一致する必要があります。 個人的憶測ですがCountifは、表面上のものでも範囲として 捉えてくれるのではないでしょうか。 で、解決策ですが、 そもそも質問のコードであれば、Vlookupの必要性はなく Countifで対応出来そうな気がしますが、何か他の理由があるのでしょうか? どうしてもVlookupを使用したい場合は、 一旦別の列を作って、=TEXT(A2,"yyyy/mm/dd hh:mm:ss.000")などとして これを下にオートフィル。 この値を検索すると出てくると思います。

MKT_
質問者

お礼

 どうもありがとうございます!m(_ _)m 仰る通り、セルを選択した状態で数式バーにyyyy/mm/dd hh:mm:ssが出てきましたので B列に「=TEXT()」としてこれを検索しましたところ、見つけることが出来ました。 >Vlookupの必要性はなくCountifで対応出来そうな気がしますが、何か他の理由があるのでしょうか?  はい、検索した日時のある行を取得したいのですが、COUNTIFだと一致するセルの個数しか出てこないと思いますので、VLOOKUPでどうにかならないかなー(?)などと考えております。  しかしデータが30万行ありまして、これをオートフィルするとなると膨大な量に。。。orz もう少し追加で工夫を考えてみます。 本質問は解決いたしましたので、クローズさせていただきます。 この度はご親切にどうもありがとうございました!!m(_ _)m

関連するQ&A

  • vbaにvlookupを組み込む

    お世話になります。 エクセルのマクロにvlookupを組み込みたいのですが,エラーが出てしまいます。 用意したものは「顧客名簿」というシートで,A列に顧客番号(6ケタの数字),B列に顧客名が入っています。C列以降はその他のデータが入っています。 「トップメニュー」というシートにあるマクロボタン「顧客抽出」を押すと,インプットボックスが現れます。これに顧客番号を入力すると,メッセージボックスが現れます。 この時のメッセージボックスに,インプットボックスに入力された番号により「顧客名簿」から顧客名を取り出し,「○○さんのデータを表示しますか」としたいのですが,ここでエラーが出ます。(○○は,「顧客名簿」のB列にある名前です) 実行時エラー 1004 WorksheetFunctionクラスのVLookupプロパティを取得できません。 組んであるマクロは以下の通りです。 Sub 顧客抽出() Dim ans As String, ans2 As String     ans = InputBox("顧客番号を入力", "入力", "")         If ans = "" Then             MsgBox "顧客番号が空白です" & vbNewLine & _                "処理を中止します", vbOKOnly         Else             If WorksheetFunction.CountIf(Worksheets("顧客名簿").Range("A1:B5000"), ans) = 0 Then                 MsgBox "顧客番号が登録されていません", vbOKOnly             Else                 ans2 = WorksheetFunction.VLookup(ans, Worksheets("顧客名簿").Range("A1:B5000"), 2, False)                 If MsgBox(ans2 & " さんのデータを表示しますか", vbYesNo) = vbYes Then                     Sheets("顧客情報").Select                     Range("D4").Value = ans                 Else                     MsgBox "処理を中止します", vbOKOnly                 End If             End If         End If End Sub 途中にある ans2 = WorksheetFunction.VLookup(ans, Worksheets("顧客名簿").Range("A1:B5000"), 2, False) の部分でエラーが出るのですが,解決策が見当たりません。 おそらくRange("A1:B5000")の部分に不具合があると思うのですが,どう対処すればいいでしょうか。 詳しい方,ご教授願います。

  • VBA VLookupを使用時のエラーの解消方法を教えてください。

    ダイアログボックス(ユーザフォームで作成)で入力し、得意先台帳を作成しています。 入力したデータの項目に変更(例えば社名変更)があった場合、修正用のダイアログボックスを呼出し表示させ、修正をしたいので下記のように作成しました。 実行するとエラーになります。 エラーメッセージ 実行時エラー 1004 WorksheetFunctionクラスのVLookupプロパティを取得できません 教えていただきたき事。 1.エラーの解消方法 2.下記記述の誤謬 Private Sub koudo_afterUpdate() Dim WS1 As Worksheet Set WS1 = Worksheets("得意先登録") Dim CODE As Long If WorksheetFunction.CountIf(WS1.Range("D:D"), koudo.Value) = 0 Then MsgBox "得意先コード未登録。" koudo.SetFocus Exit Sub Else If IsNumeric(koudo.Text) = True Then CODE = Val(koudo.Text) Else CODE = koudo.Text End If tourokubi.Text = Application.WorksheetFunction.VLookup(CODE, WS1.Range("A:S"), 3, False)     ・・・・・・・・・・ jouken.Text = WorksheetFunction.VLookup(CODE, WS1.Range("A:S"), 18, False) End If End Sub

  • 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 ---------------------

  • 横軸を日付・時間とするグラフ化

    エクセルのデータシートに、現在以下の様にデータが打ち込まれています。 A列に日付(yyyy/mm/dd) B列に時間(hh:mm:ss) C,D,E列にデータ これを横軸“日付・時間”、縦軸をC.D.E列のデータとして グラフ(散布図)化したいのですが、どの様にすれば良いのでしょうか。 宜しくお願い致します。

  • Excel vba 日付の形式判定

    Excelに日付、開始時間の列があります。 セルの形式をチェックしたいのですが、形式が下記のとおりであるか どう記述すればいいのでしょうか? 日付チェックはisdate関数を使いますが、日付の形式がyyyy/mm/dd、時間の形式がhh:mmであるかの 判定方法を教えてほしいです。 例) 日付    時間  2021/05/01 10:00  H33/05/01   ← yyyy/mm/dd形式でない為、NG   10時00分 ← hh:mm形式でない為、NG 

  • 日付と時間の別々のデータをひとつのセルにまとめたい

    日付と時間の別々のデータをひとつのセルにまとめたいと思っております。 セルA 2014/01/13 セルB 17:18 書式設定 A yyyy/mm/dd B (hh:mm) 上記のデータを下記のように結合したいと思っております。 セルC 2014/01/13 17:18 どなたか知恵のある方に御指導していただければと思っております。 宜しくお願い致します。

  • 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にしようと思いました どうかよろしくお願いします!!

  • (VBAにて)日付でデータを抽出するやり方

    一度質問をしたのですが言葉足らずで説明不足でしたので、再質問させて頂きます。 (一度見た方も、もう一度お付き合い願います。) 全くマクロを知らないのですが、上司にマクロ作成を依頼され困っています。(無茶な...。) 下記に内容を記しますので、教えて下さい。 お願いします。 (概要) Excelで「元データシート」にて管理している障害管理表のデータを、 「まくろシート」を作成して「元データシート・D列:発生日時」をキーにして 任意の「開始月:yyyy/mm」と「終了月:yyyy/mm」をそれぞれ指定したセルに入力して、コマンドボタンを押したら、「sheet3」シートにその指定した範囲内のみのデータを表示するようにして欲しい。 ・sheet1について →・「元データ」にシート名を変更しています。  ・「元データ」には障害を管理しているデータが入力されています。    (管理表はこんな感じです)→項目名:3行目・データ:4行目~  ・セルA3~Y3が項目名(セルD3の項目名→発生日時)     ・セルA4~Y303がデータ(セルD4~D303→yyyy/mm/dd hh:mm:ss) ・sheet2について →・「まくろ」にシート名を変更しています。  ・ セルA2(開始月)とセルB2(終了月)に任意の年月(yyyy/mm)を入力してセルA5にある「コマンドボタン」を押す  ・ キーは「元データシート・D列:発生日時」のデータ部分です。      ・sheet3について →・コマンドボタンを押した結果、「sheet3」にマクロの実行結果を反映する。 (A1~Y1行目に項目名が・A2行目~Y(X)行目にデータが表示される) ・A4で印刷するのでA4用紙のサイズに設定する。 以上です。 宜しくお願いします。

  • エクセル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

  • 日付型を編集したい

    お世話になります。 DateTime型のデータを 「YYYY/MM/DD HH:Mi」の形式で取得したいです。 また、「2005/07/01」の日付型データを上のように、 日時の形式で表示(2005/07/01 00:00)で 取得することはできるでしょうか? CONVERT関数だと思うのですが、 時分の取得方法がよくわかりません。 お知恵をお貸しください。

専門家に質問してみよう