「VBA Match関数の限界」についての誤解
ツイッターで出したVBAのお題です。
発端はエゴサーチからです。(笑)
「教えて!goo」で引用されていたのを見つけました。
あちこちで引用されているのは見かけることはあるのですが、以下ではよく言うディスられているような文章を見かけました。
引用が多くなれば批判的な意見が出てくるのは当然だし構わないと思います。
ですが、今回見たものは回答者の理解不足からきているものです。
お題のツイート
> ここのサイトはあまり信用しないほうが良いでしょう
と言われてしまった。
> こちらの当面の目的は、「〇〇○○の神髄」とやらの内容の間違いを確認することでしたから、その目的は果たしたと思っていましたが…
なかなか素晴らしい目的だな。
ここでの論点のずれはどこにあるでしようか?
※VBAの問題としては結構難問です。たぶん。
そこがどこなのか、説明できますか?
それぞれでのテストコード自体は正しいものです。
では、どこが違うのでしょうか?
という問題です。
比較すべきページ
解説のツイート
最初に問題のページの再確認から。
https://oshiete.goo.ne.jp/qa/11436912.html
・1次元配列と2次元配列の違い
・全ての要素に対して正しく検索できる配列上限は
・この上限を超えている配列内のどこまで正しく検索できるか
これらは、それぞれ別々の問題であり、別々の結果になります。
回答者は、この点が完全に分かっていないようです。
Dim a(100000) As Long, i As Long, b As Long, j As Long
For i = 0 To 100000
a(i) = i
Next i
For j = 34400 To 65536
On Error Resume Next
b = WorksheetFunction.Match(j, a(), 0)
DoEvents
If Err.Number <> 0 Then
MsgBox b
この場合の配列aは1次元配列です。
それが34465でエラーといっています。
Matchで正しく扱える1次元配列の上限は65536までです。
65536までの1次元配列なら正しく検索できます。
先の34465でエラーというのは、たまたま100000の時の結果でしかありません。
試しに70000や150000でやってみると良いでしょう。
滅茶苦茶な結果になってしまうのが分かるはずです。
配列が上限を超えてしまっているので、結果がどうなるか分かりません。
Dim i As Long
Dim ary As Variant
ary = Range("A1:A70000")
i = WorksheetFunction.Match("***", ary, 0)
この配列aryは2次元配列です。
これに対して2010までのMatchはエラーになってましたが、
2013からはエラーにはならず、正しく扱えるようになっています。
「型が一致しません」のエラーになります。
1次元、2次元に関わらずエラーになります。
2013以降では、このエラーが出なくなっています。
ただし1次元配列で正しく検索できるのは65536までの配列になります。
これを超える配列は意図しない結果になります。
「Excel2013以降では、この制限はなくなっていることが確認できました。」
と書いているものです。
2013以降では、はるかに大きな2次元配列を正しく扱えるようになっています。
ただし、1次元配列は65536までしか正しく扱えません。
100000の1次元配列をMatchでどの位置まで正しく取得できるかの検証をただけになります。
2010までなら「型が一致しません」のエラーになったので直ぐに分かったはずですが、
2013以降では、中途半端に検索できてしまうので気が付かなかったのでしょう。
と書いています。
「エラーは出ますね。」は良いでしょう。ご自身で確認した範囲での回答なのですから。
しかし、私の提示しているコードを試しもせずに、
(ここのサイトはあまり信用しないほうが良いでしょう)
このような姿勢は、結果として自身が損をすることになると思います。
Matchで扱える配列は34465までだと思いこんでしまっているのですから。
なにより、間違った回答をもらった質問者がかわいそうにさえ思えてきます。
さすがにこれではお話になりません、テスト経験不足でしょう。
かといって、この回答者の人格を否定などするつもりはありません。
あくまで、ここでの回答がそうだというだけの事です。
他では良い回答を沢山しているかもしれません。
https://excel-ubara.com/excelvba4/EXCEL_VBA_434.html
この検証も全てが絶対に間違っていないとは言いません。
今後のバージョンや環境によっても違った結果になる事もあるでしょう。
もし違った結果が出たというのなら、連絡をもらえれば、可能な限り徹底的に再検証します。
同じテーマ「ツイッター出題回答 」の記事
Variant仮引数にRange.Valueを配列で渡す方法
VBAで数値を漢数字に変換する方法
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。