『VBA 配列のソート』(TKG)
お世話になっております。 取り急ぎ解決したい、というわけではありませんが 好奇心で皆さんの知識をご披露いただければと思い投稿します。
VBAで配列のソートを行う直接的なメソッドは存在しないと認識していますが 皆さんバブルソート等のFunctionを毎回コピペしているのでしょうか? 面倒臭くありませんか?
他の多くのプログラミング言語では.sort一発なのに なぜVBA開発者は実装しなかったのでしょう。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
こんな風に Sub nm() 配列 = Array(5, 4, 20, 2, 10) '第3引数がTrueで並び換え基準に列方向を指定 配列 = WorksheetFunction.Sort(配列, , , True) '注意:代入先の変数の型はバリアント型でないとダメ MsgBox 配列(5) End Sub (たぶん) 2025/05/16(金) 19:43:05
>なぜVBA開発者は実装しなかったのでしょう。 おそらく、シート上のソート機能が充実しているからだと思います。 (jindon) 2025/05/16(金) 21:41:38
たぶん様 ありがとうございます。 一次元ならワークシート関数でいけるのですね。 とはいえ、二次元が多く。。。 (TKG) 2025/05/17(土) 10:36:16
xyz様 ありがとうございます。 参考にしてみます。
やはり考えられる方法は一時的なシートを使用してsortメソッドですよね。 (TKG) 2025/05/17(土) 10:40:56
jindon様 ありがとうございます。
私はどちらかというと逆の感想を持っておりまして。 Range.ValueなどでVariant型の変数に代入した時 「シートのセル番地」を「配列インデックス」 として自動的に認識させることができるのに、 ワークシートの並び替え機能を流用・応用し VBAの配列にソートメソッドを実装できなかったのか という疑問でした。
とはいえそこまで内部処理に詳しいわけではないのでよくわかりませんが笑 (TKG) 2025/05/17(土) 10:44:38
>とはいえ、二次元が多く。。。
??? https://qiita.com/takahasinaoki/items/2594acd86f2e5442b456 ここに二次元の方法も書いてなかった? (たぶん) 2025/05/17(土) 10:50:31
たぶん様 セル範囲に対するSortではなく 配列を直接引数に渡してSortできないだろうか、という主旨でした。 そしてその配列が二次元を想定している、ということです。
(TKG) 2025/05/17(土) 11:31:48
たぶん様 失礼いたしました。 ご提示いただいたページでは 配列を直接渡す方法は一次元のみの記載でしたが 二次元でテストしたところ正常にSortできておりました。 ありがとうございます。 (TKG) 2025/05/17(土) 11:37:03
つまりワークシート関数SORTに対応していないバージョンでは 実行できないということですよね? (TKG) 2025/05/17(土) 11:38:41
>やはり考えられる方法は一時的なシートを使用してsortメソッドですよね。 sortメソッドのほかにsortオブジェクトがあります。こちらのほうが高速です(特に、大きなものでは)。
ちなみにVBA配列に要素をひとつずつ直接入れていくなどということは少なく、 たいていはワークシート由来のことが多いことも影響しているかもしれません。
(xyz) 2025/05/17(土) 16:14:48
> バブルソート等のFunctionを毎回コピペしているのでしょうか? 「コピペ」だと思わない様にしてます。
例えば「Sortモジュール」にしてインポートする。 それだけでも 参照設定を追加したり、APIをDeclareしたり、と同じ操作に思えてくる自己暗示。^^;
(白茶) 2025/05/17(土) 16:56:02
> バブルソート等のFunctionを毎回コピペしているのでしょうか?
これの意味が分からないんだけど? バブルソートぐらい 2度目以降は別にして 1度目ぐらいは自分で書けませんか? まあ、私は面倒なので書かないけど (たぶん) 2025/05/17(土) 17:04:24
xyz様 Sortオブジェクト、恥ずかしながら初見でした。 キー3つしか設定できねえのかよ!と思ってましたが 64個に増えてるみたいですね。笑 ありがとうございます。まだまだ知らないことが沢山ありますね。。 (TKG) 2025/05/17(土) 22:04:00
白茶様 ありがとうございます。 Sortごときでファイル持ってかなきゃいけねえのかよ、、、 と思ってしまう自分がおりまして。笑 面倒くさがりなだけですが。 (TKG) 2025/05/17(土) 22:05:49
たぶん様 自分で書いて実装できるか否かというより、 わざわざ流用すること自体が面倒という主旨でした。 最初の投稿で記している通り VBAにおける配列の不自由さに対しての嘆きです。 今回はSortを例に出しましたがAppendなどもそのうちの一つです。 (TKG) 2025/05/17(土) 22:09:55
昔話になります。 Visual Basic for Applications https://ja.wikipedia.org/wiki/Visual_Basic_for_Applications Visual Basic https://ja.wikipedia.org/wiki/Visual_Basic
VBAって古いんですよ。Visual Basic 6.0がベースです。 現在64bit対応されて7.0となってますが、機能はそれほど大きく追加されてません Visual Basic 6.0が出たのが、1998年です。 その頃のPCのスペックは現在と比べて貧弱でした。 どんなものだったかというと、こんな感じ https://ascii.jp/elem/000/000/312/312446/
メモリは32MB〜64MB、HDDは4GB〜数10GB 現在と比べて、まさに桁が違います。
なので、VBやVBAを始め、その他の言語も標準ライブラリは厳選されコンパクトでした。
高機能で一般的な機能は、どうしても大きく重くなるので、そのような機能は ダイナミックリンクライブラリやCOMで提供されます
古くて機能追加の止まったVBAと、最近新しく開発されたり、頻繁に機能追加され続けている言語を比較して
>他の多くのプログラミング言語では.sort一発なのに >なぜVBA開発者は実装しなかったのでしょう。 という疑問の答えは「古くてメンテナンスされてないから」です
>皆さんバブルソート等のFunctionを毎回コピペしているのでしょうか? という質問の答えは、「2000年くらいだったらそうだったかも」です
>VBAにおける配列の不自由さに対しての嘆きです
VBAは Microsoftはからすでに見捨てられており、 高機能なワークシート関数やPython in Excelなどが活発に機能追加されてます VBAにこだわらず、新しい機能も使ってうまくやるしかないのだとおもいます。 (´・ω・`) 2025/05/18(日) 06:09:27
ちょっと違いました >他の多くのプログラミング言語では.sort一発なのに >なぜVBA開発者は実装しなかったのでしょう。 開発当時は、PCスペックや他言語との比較の上でも、それが普通だったから というほうが妥当ですね (´・ω・`) 2025/05/18(日) 06:13:06
そして、なぜ今も実装されないてないのかは、MicroSoftにやる気がないから (´・ω・`) 2025/05/18(日) 06:14:52
既にコメントいただいていますが、蛇足で追加しておきます。
Visual Basicは6.0が最終版だったかと思います(Wikipediaではそうなっているようです) Visual Basic言語の後継としてVB.Netが開発され、それが現在につながっています。 もちろんVB.NetにはSort機能はあります。
VBAはVB6というBasic言語部分に、Excelを扱うオブジェクト指向的言語をつぎはぎしたものです。
VBAというのは最新の言語のように思っているかもしれませんが、既に指摘がありますように、 Basic言語としては言ってみれば老いぼれで、もうだれもメインテナンスしていないようなものだと思います。 (その分、枯れている(つまり安定している)とも言えますが。)
ですので、なぜソート機能が付いていないのだ、と言われてもそれはもう過去の歴史であって、 それを現時点で議論しても殆ど益がありません。今後も拡張されることもありえないと思います。
Microsoftは一時期Pythonを組み込むことを試行して今も機能としてありますが、 VBAに慣れた人からは乗り換えるインセンティブは殆ど無いように見えます。
とはいっても、入出力のところは万人が使うことになってしまっているので、 例えば、金融系のシステムでは、入出力部分は従来のExcelを使い、根幹のところでは 別の言語で開発を行い、DLLとして呼びだす形のシステムにすることが多い、と聞いたことがあります。 そうした形で今後も細く長く生き延びるのかもしれません。 (xyz) 2025/05/18(日) 07:32:27
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.