VBA技術解説
WorksheetFunction.Matchで配列を指定した場合の制限について

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2019-09-04

WorksheetFunction.Matchで配列を指定した場合の制限について


WorksheetFunctionでMatchを使いデータ検索する事は良くあります。


この時、他の部分の記述との関係で、配列を指定してMatchを行う事があります。

以下のようなVBAコードになります。

Sub sample1()
  Dim i As Long
  Dim ary As Variant
  ary = Range("A1:A10000")
  ・・・
  i = WorksheetFunction.Match("***", ary, 0)
  ・・・
End Sub


これは正しく動作します。


ただし、WorksheetFunction.Matchで配列を使うと、処理速度は遅くなります。

直接Rangeを指定した方が、はるかに処理速度は速くなります。

とはいえ、数万件の検索を1回実行するだけなら、体感速度はほとんど変わらないでしょう。

そこで、どうしてもこのような記述になる場合があります。

しかし、この場合、配列の要素数に制限があります。

Sub sample2()
  Dim i As Long
  Dim ary As Variant
  ary = Range("A1:A70000")
  ・・・
  i = WorksheetFunction.Match("***", ary, 0)
  ・・・
End Sub


これはエラーとなります。


具体的には、配列の要素数が、

65,536

これが限界値となっています。

さすがに、めったにあることではありません。

しかし、この情報が、ほとんどどこにも出ていない事が問題です。

以前、このエラー原因を問われた時に、いろいろ調べたのですが、どこにも見当たりませんでした。

と言う事で、自身の備忘録もかねて、ここに掲載しておきます。

※後日追記

本記事はExcel2010当時に書いたものですが、最近(2019年9月)以下のメールをいただきました。
要約すると、
「以前は確かにエラーだったが、最近確認したら問題なく検索できた」
ということでした。
そこで、改めて確認しましたところ、
Excel2013以降では、この制限はなくなっていることが確認できました。
ただし、
Excel2010では変わらずにエラーとなります。
Excel2010もまだまだ健在ではありますが、
マクロを共有する範囲のPCにおいてExcel2013以降しか存在しないのであれば、この制限は気にしなくても良いという事になります。



同じテーマ「マクロVBA技術解説」の記事

フォルダー・ファイル・ブック・シートの文字制限

フォルダーの作成、ファイルの作成、ブックの作成、シートの作成、これらには指定できない文字があります、使用可能な文字に制限があります、特にシートの文字制限について間違った解説が結構見受けられます。フォルダ・ファイル・ブックの文字制限 フォルダ・ファイル・ブックの使用不可文字は以下になります。
Excel2013におけるScreenUpdatingの問題点
今現在、Excelの最新バージョンであるExcel2013ですが、Application.ScreenUpdating の動作が、それまでとは違ったものになっています。Microsoftサポートにも掲載されています。Excel2013で複数のブックを開きAppliction.ScreenUpdatingプロパティ使用中にアクティブブックが切り替わるとウィ…
Dir関数の制限について
Dir関数は、VBAでフォルダ・ファイルの存在確認や一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。
よくあるVBA実行時エラーの解説と対応
VBAを書き終えて、いざ実行したら意味不明なメッセージが… ここでは初心者向けに、代表的な実行時エラーの解説とその対応について説明します。中級者以上の方は、実行時にトラップ可能なエラー番号一覧と対処 こちらを参考に、エラー対応(OnError等)を実装してください。
Application.Goto使用時の注意
Applicationのメソッドに、Gotoメソッドがあります、Application.Gotoメソッドは、指定ブックの、指定シートの、指定セル範囲を選択します、そのブック・シートがアクティブでなければアクティブにします。最初に、Application.Gotoの一般的な文法説明をします。
ScreenUpdating=False時にエラー停止後にシートが固まったら
VBAでは、処理の高速化や画面チラつきを防ぐために、Application.ScreenUpdating=False これを入れていることが多いと思います。これが入っていると、VBAがエラーで停止して、そこで「リセット」した場合に、Excelシートをクリック出来なくなったり、シートタブの切り替えができなくなってしまう場合があります。
標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる
VBAでスタイルの標準フォントが違うブック間のコピー等の処理では、列幅や行高の違いが問題となる場合があります。列幅や行高は、標準スタイルの1文字分を基本としているためです。上の画像は、標準フォントが違うブックにおいて、同じ列幅20の時の、列幅の表示です。
VBAでエラー行位置(行番号)を取得できるErl関数
VBAのデバッグでエラーが発生した行位置を特定する方法はいくつかあります。エラーが発生したVBAソースの行ラベルを取得することができる関数がErl関数です。Erl関数は、VB6に存在しVBAにも引き継がれ実装されているものです。
WorksheetFunction.Matchで配列を指定した場合の制限について
VBAでシート関数使用時の配列要素数制限
VBAでワークシート関数が使えるのはとても便利です。WorksheetFunctionのシート関数を使う事は多いですが、配列を引数に指定した場合は要素数に制限があります。この制限があることは、ワークシート関数だという事を考えれば仕方ないのかもしれません。


新着記事NEW ・・・新着記事一覧を見る

VBAのインデントについて|VBA技術解説(7月15日)
「VBA Match関数の限界」についての誤解|エクセル雑感(7月15日)
省略可能なVariant引数の参照不可をラップ関数で利用|VBA技術解説(7月12日)
100桁の正の整数値の足し算|エクセル雑感(7月9日)
LSetとユーザー定義型のコピー(100桁の足し算)|VBA技術解説(7月9日)
Variant仮引数のByRefとByValの挙動違い|エクセル雑感(7月5日)
Variant仮引数にRange.Valueを配列で渡す方法|エクセル雑感(7月5日)
Variantの数値型と文字列型の比較|エクセル雑感(7月1日)
VBAのVariant型について|VBA技術解説(6月30日)
VBAのString型の最大文字数について|エクセル雑感(6月20日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ