- ベストアンサー
[VB2010]Excel関数のMatchの使用
- VB.NETを使用して、あるCSVファイルを読み込み、その読み込んだ内容を既存Excelファイルに対して書き込みを行うプログラムを書いています。
- 書き込む際、Excelシート内の特定の1つの列をキー項目としており、CSVから読み込んだ値とExcel側のキー値を比較して該当した行の特定のセルに値をセットする処理を行っています。
- Match関数を使用したコードを実装しましたが、エラーが発生しています。Matchの書き方に問題があるのか、もしくはMatch関数を使用すること自体が適切なのかを知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> ret = xlFunc.Match("12345", rTemp , 0) Arg1:検査値がArg2:検査範囲に見つからない場合はエラー値を戻す という意味で、[Arg3:照合の種類]に、[0:一致]を指定しているので、 見つからなかった結果のエラーなのでは? なぜ見つからないのか、ということですが、 excel.WorksheetFunction.Matchメソッドや excel.WorksheetFunctionに用意されたメソッドの殆どは、 [文字列値]と[数値]は厳密に区別する、 という前提を見落としているのではないでしょうか? [文字列値]なら ret = xlFunc.Match("12345", rTemp , 0) →数値12345しか無ければエラー [数値]なら ret = xlFunc.Match(12345, rTemp , 0) →文字列値"12345"しか無ければエラー csvテキストの段階では勿論すべて文字列値ですが、 Excelシート(セル)に文字列値"12345"を展開したなら、 シート上では数値12345になるのが普通に一般的な処理ですので、 そこら辺のことじゃないでしょうか。 前後の処理過程を知りませんから、見当違いでしたらすみません。
その他の回答 (4)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
No.1、訂正です。 誤) > Arg1:検査値がArg2:検査範囲に見つからない場合はエラー値を戻す 正) Arg1:検査値がArg2:検査範囲に見つからない場合は実行時エラーを返す でした。失礼しました。 因みにArg2:検査範囲にはRangeオブジェクトではなく配列を直接渡すことも出来るので、 そうした方が今回変更する理由に副っているような気もしています。
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19864)
Match関数は「検索値が見付からなければエラートラップする」ので、それで正常です。 「見付からない時はOn Error Gotoで色々とメンドクサイ処理をしないといけない」ので、当方は「素直にFindを使っておいた方が楽」だと思います。 >しかし、Find関数は処理が遅いという記事をネットで見てから >Match関数を使うと良いという内容でしたので、 これは「ワークシート上のセルに書いた数式での話」であって、しかも「検索対象が数万行を越える場合の話」であって、検索対象が少ない、かつ、VBでやるなら「シンプルにFindを使うべき」です。 今回の件は「ネットの記事を鵜呑みにして馬鹿を見る良い例」ですので気をつけましょう。
お礼
回答有り難うございました。 無事解決致しました。 今回の件は「ネットの記事を鵜呑みにして馬鹿を見る良い例」ですので気をつけましょう。 確かにその通りですね。 Matchの性能を見たかっただけとは言え、何も知らず使おうとすると こんな感じで痛い目に会うということで・・・。 Matchの使いドコロ的にも見つからなかったら例外となってしまうということも含め、 おとなしくFind関数を使うことにしました。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは、No2です。 VB.NETでどうなのか分からないですけど、 Dim ret As Variantって指定出来ますか? 出来るなら、アプリケーション.Match ret = xlApp.Match("12345", rTemp , 0) で、エラーも取得出来るかも。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは 関係有るか無いか・・・ rTemp = xlSheet.Range("A1:A10") は Set rTemp = xlSheet.Range("A1:A10") かも。
お礼
回答有り難うございました。 無事解決致しました。
お礼
回答有り難うございます。 確認してみたところ、まさに [文字列値]なら ret = xlFunc.Match("12345", rTemp , 0) →数値12345しか無ければエラー [数値]なら ret = xlFunc.Match(12345, rTemp , 0) →文字列値"12345"しか無ければエラー このことでした。 また、データが見つからないことで例外エラーとなってしまっているということもわかり、大変助かりました。 ありがとうございました!