• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MATCH関数について)

VBでMATCH関数を使用して日付を検索する際に発生するエラー

このQ&Aのポイント
  • VBを勉強している方が、MATCH関数を使用して日付を検索するプログラムを作成しましたが、実行時エラー1004が発生してしまいます。
  • 具体的には、worksheetfunctionクラスのMATCHプロパティを取得できないというエラーが表示されます。
  • 日付が並んでいる範囲であるc3:ag3に問題はないので、原因を特定するためには他の要素を調べる必要があるようです。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

Test1 のように、入力値をLong型(もしくはDoubl型)にして Match関数を使います。 また、Test2のように、入力値を一旦、セルに格納する方法もあります。 こちらが、ワークシート関数を使う意味合いからすれば、わかりやすいかもしれません。 両方とも、入力値が一致しない場合はエラーメッセージを出すようにしています。 Sub Test1()   Dim 日付 As Range   Dim n As String, ans As String     Set 日付 = Worksheets(1).Range("c3:ag3")      n = InputBox("日付は")      Dim inpDate As Long      '// 追加     inpDate = CDate(n)    '// 追加      On Error GoTo ErrorTrp     ans = Application.WorksheetFunction.Match(inpDate, 日付, 0) '// 追加     MsgBox (ans)      Exit Sub    ErrorTrp:   MsgBox n & "はありません" End Sub Sub Test2()   Dim 日付 As Range   Dim n As String, ans As String     Set 日付 = Worksheets(1).Range("c3:ag3")      n = InputBox("日付は")     Range("AI3") = n      On Error GoTo ErrorTrp     ans = Application.WorksheetFunction.Match(Range("AI3"), 日付, 0)     MsgBox (ans)   Exit Sub ErrorTrp:   MsgBox n & "はありません" End Sub

guts
質問者

お礼

早速ご回答いただきまして有難う御座いました。 無事に完成することができました。

全文を見る
すると、全ての回答が全文表示されます。

関連する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")の部分に不具合があると思うのですが,どう対処すればいいでしょうか。 詳しい方,ご教授願います。

  • Replace関数について

    Sub macro1() Dim str As String str = "abc" str = Replace(str, "c", "a") MsgBox str End Sub このマクロを実行した時に、問題なく動くのですが なぜReplaceは関数なのに、 WorksheetFunction.がいらないのでしょうか? しかも Sub macro2() Dim str As String str = "abc" str = WorksheetFunction.Replace(str, "c", "a") MsgBox str End Sub にすると、エラーになります。 macro1のReplaceは、関数ではないのでしょうか? メソッドやステートメントですか?

  • 2013VBでオーバーフローエラー(2)

    よろしくお願いします。 前回の質問ではエラーの出た部分しか表示していなかった為、回答して頂いた方に 十分な情報が提供できずすみませんでした。 下記がエラーの出た部分までの全プログラムです。 Dim book1 As String 'ブック名1 Dim book2 As String 'ブック名2 Dim book3 As String 'ブック名3 Dim book4 As String 'ブック名4 Dim myday As Date Dim ITI1 As String 'アドレスの格納 Dim ITI2 As String 'アドレスの格納 Dim ITI3 As String 'アドレスの格納 Dim ITI4 As String 'アドレスの格納 Dim ITI5 As String Dim ITI6 As String Dim ITI7 As String Dim ITI8 As String Dim myRange As Range 'コードの個数 Dim myRange1 As Range Dim answer As Integer Dim bunki1 As Integer Dim c As Double 'カウント Dim n As Double 'カウント 'ワークブックの設定 Workbooks("A.xls").Activate book1 = Worksheets("ブックシート設定").Range("c3") 'コピー元 'book2 = Worksheets("ブックシート設定").Range("c5") book3 = Worksheets("ブックシート設定").Range("c7") 'A 'book4 = Worksheets("ブックシート設定").Range("c9") bunki1 = Worksheets("ブックシート設定").Range("c16") myday = Worksheets("ブックシート設定").Range("c14") 'コピー元非表示を表示にする Workbooks(book1).Activate Sheets("B").Select Sheets("B").Select Columns("G:J").Select Selection.EntireColumn.Hidden = False Columns("j:q").Select Selection.EntireColumn.Hidden = False 'コードの個数を数える Workbooks(book1).Activate Sheets("B").Select ITI4 = Range("b65536").End(xlUp).Address '----b列の最終行から上方向の終端セルを選択 Set myRange = Worksheets("B").Range("b6", ITI4) answer = Application.WorksheetFunction.Count(myRange) Set myRange1 = Worksheets("B").Range("e8") For c = 1 To answer 'データー個数のカウント If myRange1.Offset(c) = myday Then n = n + 1 Next 'オーフィルターの設定 Workbooks(book1).Activate Sheets("B").Select ITI1 = Range("b65536").End(xlUp).Address '----b列の最終行から上方向の終端セルを選択 ITI7 = Range(ITI1).Offset(, 11).Address Range("a8", ITI7).AutoFilter FIELD:=5, Criteria1:=Format(myday,"yyyy/m/d") >>>>>ここでオーバーフローエラー 前回指摘されたCriteria1:=mydayをCriteria1:=Format(myday,"yyyy/m/d") に追加変更しました。 読みにくいかもしれませんがよろしくお願いします。

  • オブジェクト??

    またまた困っております inputboxで入力した日付を検索して複数選択しようとしたのですが unionの使い方がよくわかりません(・・;) どこが間違っているのかもしくは何が足りないのか教えてください<m(__)m> どうかよろしくお願いします! Option Explicit Sub グラフ() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim grahu As Chart Dim target As Range Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then Set target = Union(target, "D" & i) Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i target.Select End With If msg <> "" Then MsgBox msg End If MsgBox "グラフベースを作成しました" End Sub Set target = Union(target, "D" & i) ↑ここでエラーが起きて 「オブジェクトが必要です」と言われました どうすればよいのでしょうか?

  • マクロ 記述が悪くエラーがかかります。

    いつも回答ありがとうございます。 最後らへんの記述で実行時エラー【型が一致しません】がかかります。 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") ← ここでエラーがかかる。 ワークシート名に変数を使用しているせいだと思います。 解決する方法を御指導して頂けないでしょうか?宜しくお願い致します。 Sub グラフの作成() Dim Date1 As Date Dim Date2 As Date Dim SName As String Dim b1 As Variant Dim b2 As Variant Dim b3 As Variant Dim d1 As Variant Dim d2 As Variant Dim d3 As Variant With Worksheets("集計用") s1: Date1 = Application.InputBox("最初の日付を2012/12/1のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b1 = .Columns("B").Find(Date1, , xlValues, 1) If b1 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s1 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d1 = b1.Row s2: Date2 = Application.InputBox("最初の日付を2012/12/31のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b2 = .Columns("B").Find(Date2, , xlValues, 1) If b2 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s2 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d2 = b2.Row s3: SName = Application.InputBox("商品名を入力して下さい。") If SName = "False" Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b3 = .Rows("3").Find(SName, , xlValues, 1) If b3 Is Nothing Then If MsgBox("入力した商品名が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s3 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d3 = b3.Column End With Worksheets.Add After:=Worksheets("集計用") ActiveSheet.Name = b3 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") Worksheets("集計用").Range(Cells(d1, d3), Cells(d2, d3)).Copy _ Destination:=Worksheets(b3).Range("C2") End Sub

  • VBA 初心者です シートの指定がうまくいかない

    初めまして!VBAを利用してあるシートにある人の名前を他のシートに入力するマクロを組んでいるのですが、この方法でやるとシートの指定がうまくいかず実行時エラーになってしまいます。A個人というシートでボタンを押したら大丈夫なのですが、他のシートにボタンを設置し、押すとエラーになってしまいます…どなたか詳しい方、どうしてこうなるのか、また、どうすればうまく動いてくれるのか教えていただきたいです。 Dim fa As Integer Dim namae As String Dim n As Integer On Error Resume Next n = Worksheets("ランニングスコア").Range("C100000").End(xlUp).Offset(0, 0) With Sheets("A個人") fa = WorksheetFunction.Match(n, Columns(1), 0) namae = Cells(fa, 2) End With Worksheets("ランニングスコア").Range("D100000").End(xlUp).Offset(2, 0) = namae

  • エクセルmatch関数を使った日付の検索

    株価の表があり、項目は日付、初値、高値、安値、終値、出来高のA列からF列になっています。 もう一つデータの入ってない表があり、そちらにデータの入っている元の表から日付で検索して合致 するデータを持ってきたいのです。(呼び出し側の表の最後のデータから、日付を取り出して検索しています) 項目日付の書式は日付型になっています。 自分なりに調べて次のようにしました。 Sub sinkabuka() Dim ken As Variant Dim motorow As Integer Dim sinrow As Integer Dim han As Object Dim a As Variant motorow = Worksheets(2).Range("a65536").End(xlUp).row sinrow = Worksheets(1).Range("a65536").End(xlUp).row If sinrow = 1 Then Exit Sub End If ken = Worksheets(1).Range("a" & sinrow).Value2 Worksheets(2).Activate Worksheets(2).Select Set han = Range("a2:f" & motorow) a = Application.WorksheetFunction.Match(ken, han, 0) <ーエラーになります match関数でアドレスをとれるようになったら、合致したデータの次のデータをとるようにしたいと おもっています。 試しにvlookup関数を使ったらデータを返してくれました。 excel2010 windows7です。 アドバイスをお願いします。 

  • excel match で日付が見つからない

    ■困っていること vbaの worksheetfunction のmatach関数を用いているが、日付が見つかってくれない。 なぜ見つからないか、原因を教えていただけないでしょうか?よろしくお願いします。 ■状況、やりたいこと 下記、コードで、「fRow」と「syu」までは正しく求められるのですが、「tcol」を求めようとすると、どうしても0になってしまいます。 ワークシートはD1セルに日付を入力おり、さらに右のセルへ行く毎に+7しています。「syu」の日付がどの週に該当するのかを、列数で求めたいです。 例えば、10年3月17日なら、Fの列なので 6 を求められるようにしたいです。 sub test() Dim fRow As Long Dim tcol As Long Dim syu As long With Worksheets("data") Set fRange = Sheets("data").Columns(1).Find(What:=TextBox1.Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then Exit Sub End If fRow = fRange.Row   syu = .Cells(fRow, 2).Value tcol = Application.WorksheetFunction.Match(syu, .Range("1:1"), 1) msgbox tcol   end with end sub

  • VBSで変数の宣言はできないのですか?

    VBSで、 Dim a As String a = InputBox("MsgBoxに表示する値を入れてください。", , "test") MsgBox a と文章を作って、test.vbsで保存しました。 するとエラーになります。 Dim a As Stringの部分を消すと、問題なく作動します。 もしくは、 Dim a a = InputBox("MsgBoxに表示する値を入れてください。", , "test") MsgBox a でも正常に動きます。 VBSで変数の宣言はできないのでしょうか?

  • EXCELのVBAでDcount関数がうまく動きません。

    EXCELのVBAでDcount関数を使おうとして、下記コードを作成しましたが、Dcount関数の部分が期待どおり動かず、該当なしとして、0を返してきます。 デバックで途中でマクロを止めて(Dcount関数の前)、セルに直接Dcount関数を入力すると、期待どおりの値を返してきます。 Dcount関数の記述の何が問題なのか、ご教示いただければ幸いです。 Sub 期間集計() Dim myrow, Krow As Double Dim First, Last As Date Dim i, Count As Integer Dim Data As Integer Dim Keria As String 'Worksheets("期間別").Activate Worksheets("期間別").Range("A1:BB65536").Delete Worksheets("入力").Activate With Worksheets("入力") '入力表の最終行の行数をmyrowに代入 myrow = .Range("A65536").End(xlUp).Offset(1).Row '出力前に入力データを日付順にソート .Range("A3").Sort _ Key1:=.Columns("A"), _ Header:=xlGuess First = Worksheets("集計").Range("G3") Last = Worksheets("集計").Range("H3") .Range("BH3:BH5").ClearContents .Range("BH3") = "日付" .Range("bi3") = "日付" .Range("BH4") = ">=" & First .Range("BI4") = "<=" & Last .Range(.Cells(2, 1), Cells(myrow, 47)).AdvancedFilter Action:=xlFilterCopy, _ Criteriarange:=.Range("BH3:BI4"), Copytorange:=Worksheets("期間別").Range("C11"), Unique:=False Krow = Worksheets("期間別").Range("C65536").End(xlUp).Row Keria = "C11:" & "AW" & Krow End With Worksheets("集計").Activate With Worksheets("集計") .Range(.Cells(13, 10), .Cells(24, 10)).ClearContents For i = 1 To 12 Count = 12 + i .Range(.Cells(Count, 16), .Cells(Count, 61)).Copy .Range(.Cells(11, 16), .Cells(11, 61)).PasteSpecial Paste:=xlValues .Range(.Cells(10, 16), .Cells(11, 61)).Copy With Worksheets("期間別") .Range(.Cells(11, 53), .Cells(12, 98)).PasteSpecial Paste:=xlValues Data = WorksheetFunction.DCount(.Range(Keria), .Range("C11"), .Range("BA11:CT12")) End With .Cells(Count, 10) = Data Next i End With