• ベストアンサー

VBAでのMATCH関数の使用

現在,VBAにてシートの比較プログラムを行っておりますが,その中で検索範囲を示すRangeに名前を使用したいのですがエラーでうまくいきません。 エラーは 「実行時エラー:1004 WorksheetFunctionクラスのMatchプロパティが取得できません」 とでます。 記述は Application.WorksheetFunction.Match(Cells(r, 132), Range("リース型具Key1"), 0) としており,”リース型具Key1”が事前に名前登録してある名前です。 方法をご存知の方,よろしくお願いします。

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

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

シートが異なるとは思ってもいませんでした。 例えば、Cells(r, 132) が Sheet2 にあれば、下記のようにすればいいはずです。 シートを指定していなければ、マクロを実行したシートのCells(r, 132)になっているはずです。 Application.WorksheetFunction.Match(Worksheets("Sheet2").Cells(r, 132), Range("リース型具Key1"), 0) それから、Match関数で結果が求まる場合は問題ありませんが、結果が求まらない場合の処理も考慮すべきでしょう。下記は参考例です。 Sub myTest01()   Dim shtNo As Integer     shtNo = 2   Dim ws2 As Worksheet   Dim ws3 As Worksheet     Set ws2 = Worksheets("Sheet" & shtNo)     Set ws3 = Worksheets("Sheet3")   On Error GoTo ErrorTrap      MsgBox Application.WorksheetFunction.Match(ws2.Cells(2, 2), _                        ws3.Range("リース型具Key1"), 0)   '   '// 色々な処理 //   '   Set ws2 = Nothing   Set ws3 = Nothing   Exit Sub ErrorTrap:   MsgBox ws2.Cells(2, 2) & "は見つかりません。"   Resume Next End Sub

honeybee-88
質問者

お礼

nishi6さん どうやら私の理解不足で,On Errorを考慮していないとMATCHしなかったときにエラーになることが判りました。ご指摘のエラー文を入れたことでOKになりました。有難う御座いました。

honeybee-88
質問者

補足

nishi6さん,さっそく有難う御座います。 ご指摘の方法で試しました。うーん,うまくいきません。 Match(ws3.Cells(2,2),ws3.Range("リース型具")・・のように名前が参照する範囲セルのシートと同様のシートのCellを指定するとOKですが,ws2.Cellsとしたら同様のエラーが発生します。仕様なのでしょうか。 ちなみに,アクティブシートをws2にしていることは関係ないでしょうか。

その他の回答 (2)

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

Cells(r, 132)が『リース型具Key1』のどの列を見ているかが問題です。 『リース型具Key1』の一番左の列を見ているなら、   Application.WorksheetFunction・・・・・・ Range("リース型具Key1").Columns("A:A"), 0) 左から2列目を見ているなら、  Range("リース型具Key1").Columns("B:B") とします。3列目以降も同様に指定します。

honeybee-88
質問者

補足

ご回答有難う御座います。大変参考になり,さっそく試してみましたが,やはりエラーは解消されませんでした。いろいろ行ってみた結果,Cells(r,132)のシートと”リース型具Key1”を示す範囲のシートが異なる場合にNGとなります。Cells(r,132)を”リース型具Key1”が定義されている同一シートに変更するとOKでした。シート間での名前の参照はサポートされていないのでしょうか。

回答No.1

Range("リース型具Key1") って、A1:B10 のように複数列になってませんか?そういう仕様なのかよくわかりませんが、A1:A10 のような1列のみに範囲だったら大丈夫ですが、複数列の範囲だとエラーになるようです。(名前で参照するか "A1:A10" のような範囲指定で参照するかは関係ないようです。)

関連するQ&A

  • MATCH関数について

    Dim 日付 As Range Dim n As String, ans As String Set 日付 = Worksheets(1).Range("c3:ag3") n = InputBox("日付は") ans = Application.WorksheetFunction.Match(n, 日付, 0) MsgBox (ans) 現在VBを勉強しています。 上記のように作りましたがエラーが出ます。 実行時エラー1004 worksheetfunctionクラスのMATCHプロパティを取得できません。 となってしまいます。 c3:ag3には日付が並んでいます。 どなたかわかる方がいましたら、お願いします。

  • 【VBA】On Error をつけても「Match

    【VBA】On Error をつけても「Matchプロパティを取得できません」を回避できません。  今晩は、質問させていただきます。どうぞよろしくお願いいたします。 環境:エクセル2010でございます。  下のようにコーディングしておりますが、「Matchプロパティを取得できません」が出てコード実行が中断されてしまいます。 取得できなかった場合の対処は既に(更にその下に)コーディングしておりますので、Matchのエラーをスルーさせたいのですが。。。 On Error GoTo error1 line1 = (Application.WorksheetFunction.Match(strTime, WS_data.Range("G:G"), 0))          '↑この行でエラーになります。 error1: On Error GoTo 0  On Error GoTo error1をOn Error Resume Nextに変えても同じ症状になってしまいます。 もしお詳しい方がいらっしゃいましたらアドバイスいただけないでしょうか。  どうぞよろしくお願いいたします。

  • VBA関数_オブジェクトが指定できない

    Excel_VBAで WorksheetFunction.Sum (Range(Cells(2, 14), Cells(iCount, 14))) 上記のコードに ActiveSheet を記述(ワークシートを指定)したいのですが エラーになってしまい、何処にどのように記述してよいか ご教授よろしくお願い致します。

  • Excel ワークシート関数をVBAで使用したい

    お世話になります。 Excelでワークシート関数をVBAで使用したいのですが、うまくいきませんでした。 関数ですと「ISERROR(FIND(V$10,R$11))=FALSE」のような式をVBA上で使用したいと思い、以下のようにコードを書いてみましたが If Application.WorksheetFunction.IsError(Application.WorksheetFunction.Find(Cells(i, j), Cells(i, 18))) = False Then Cells(i, j).Select End If 「実行時エラー'1004' WorksheetFunction クラスのFindプロパティを取得できません」となります。 入れ子が問題なのでしょうか。 よろしくお願いします。

  • VBA ワークシート関数のエラー

    シートに数式を入れていたものを、VBAで値のみ入力しようと考えています。 そこで、.Cells(1,1) = WorksheetFunction.数式といった形のメソッドを試しています。 しかし、複雑な数式を記述するとエラーが出てしまいます。 成功 (iferrorというワークシート関数が1つ) Debug.Print WorksheetFunction.IfError(1 / .Cells(1, 5) + 1 / .Cells(1, 6) + 1 / .Cells(1, 7) - 1, "P") 失敗(ワークシート関数のifとcountifなど複数のものが数式に混入) Debug.Print WorksheetFunction.If(CountIf(Range("C17:D49"), Range("C29")) > 5, Range("C29"), Range("D29")) Countifの場所でエラーになります。このcountifを使えるようにするためには、どうすればよいのでしょうか? WorksheetFunction.if(WorksheetFunction.Countif(、、、、という書き方はダメでした。 数式が汚くてすみません。 宜しくお願いいたします。

  • Excel VBA ""を含む関数を使うには

    Excel VBA ""を含む関数を使うには お世話になっております。 Excel VBAでMatch関数を使って下記のようにしたいのですが、 受け付けてもらえません。  n = Application.WorksheetFunction.MATCH("小計",range("B3:B10"),0) "小計"を""小計""と二重でくくれば良いような気がしたのですが、だめです。 どうすればよいでしょうか?

  • ユーザー定義関数を作りVBAで記述

    aaaと言う、ユーザー定義関数を作りVBAで記述して使う場合はどのように記述すればよいでしょうか。 通常のワークシート関数であれば、 Cells(1, 1) = Application.Sum(Range("G1:G100")) などとなりますが、 Cells(1, 1) = Application.aaa(Range("G1:G100")) とするとエラーになります。 初歩的な質問だとは思いますが、よろしくお願いします。

  • Excel VBA TREND関数について

    VBAにて6次近似の計算をするためのプログラムを組んでいるのですが【コンパイルエラー:不正な文字です】 と言われてしまいます。 6次近似の計算式の記載方法を教えて下さい。 よろしくお願い致します。 尚、現状は以下の通りです。 ============================== Dim i As Long Dim deg As Double Cells(i, 10).Value =Application.WorksheetFunction.Trend(Range(Cells(i, 1),Cells(i + 5, 1)), Range(Cells(i, 8), Cells(i + 5, 8)))^{1,2,3,4,5,6}, deg^{1,2,3,4,5,6}, 1) ===============================

  • VBA Match関数の使い方について

    お世話になります ご教示頂けたら幸いです シート結果セルE4の値を検索してシート結果G4の値を 検索行のB列に値を転記したいです 下記のように書くとMatch関数行でエラーが出てしまいます どの様にすればいいのでしょうか? お手数おかけしますが 何卒よろしくお願いいたします With Sheets(Worksheets("結果").Range("A4").Value) WorksheetFunction.Match(Worksheets("結果").Range("E4").Value, Range("A1:A1000"), 0).Offset(3) = _ Worksheets("結果").Range("A4").Offset(2).Value End With

  • Excel2003 Match関数について

    WINXP Excel2003 VBA データベース検索について教えて下さい。 Sub データ表示() Dim no As Long With Sheets("データ入力") On Error GoTo エラー処理 no = WorksheetFunction.Match( _ .[B1], [データ].Resize(, 1), 0) On Error GoTo 0 .[B5] = [データ].Cells(no, 2) .[D5] = [データ].Cells(no, 3) .[E5] = [データ].Cells(no, 4) .[F5] = [データ].Cells(no, 5) .[B7] = [データ].Cells(no, 6) .[C7] = [データ].Cells(no, 7) .[D7] = [データ].Cells(no, 12) .[B9] = [データ].Cells(no, 8) .[B11] = [データ].Cells(no, 9) .[B13] = [データ].Cells(no, 10) .[D13] = [データ].Cells(no, 11) Exit Sub エラー処理: MsgBox "該当するNo.のデータはありません" .[B5:F5].ClearContents .[B7:F7].ClearContents .[B9:F9].ClearContents .[B11:F11].ClearContents .[B13:F13].ClearContents End With End Sub というプログラム(EXCEL極意6VBAという参考文献の一部を利用)で、1枚のシート(”データ”という 名前のデータベース)51列ほどあります。からキー(一番右端の列をキー)の値と一致したデータを 別のシートへ呼び出す方法です。 そこで、こまっているのが、あるキーだとちゃんと呼び出してくるのに、肝心の希望のキーだと、エラーになって該当データ無となってしまうのです。 簡単にかくと ”データ”というデータベース A列     B列      C列       D列・・・・・・・・ AY列 001    あああ     AAAA     2012/08/20   120821002 ←このAY列をキーとして検索 をかけるとエラー処理にいってしまう。 B列”あああ”だとうまくデータを検索してくる。 Vlook関数だとキーとなるデータは一番左端にないといけないということなのですが、Match関数もそうなのでしょうか? ちなみにオートフィルターでのVBAだとうまくいくのですが、・・・ もしこのつたない文で、御理解いただき、おわかりになる方が、いらっしゃれば、ご指導ください。 もしくは、Match関数以外での検索方法でもけっこうです。 最終的に希望する結果は、D列の日付(重複する日付有)で絞り込み、AY列のキー(重複するデーターは無)でその行のデーターを別シートに表示させること

専門家に質問してみよう