[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『SUB()の位置の入れ替え』(kenN)
標準モジュールに以下のSUB()がある場合
上からの記載位置が
sub all_?@to?D() sub ?Atest() sub ?Dtest() sub ?Btest() sub ?Ctest() sub ?@test()
これをVBA(マクロ)でソートした順番に並び変える事はできますか ?
つまり、以下のような順番に
sub all_?@to?D() sub ?@test() sub ?Atest() sub ?Btest() sub ?Ctest() sub ?Dtest()
< 使用 Excel:Excel2019、使用 OS:Windows10 >
VBEの画面でメニュー直下の右端エリアにある、 (Declarations)もしくはプロシージャ名が書かれている細いエリアをクリックすると、 昇順にソートされていませんか。 表示されている名前をクリックすると、そのプロシージャにジャンプします。
私も知識不足ですので自信はありませんが、 ご希望の機能は搭載されていないのではないでしょうか。 (まるごとバナナ) 2021/11/21(日) 19:32
そもそも、 ・コードは内容に応じて並べることが多く、 アルファベット順に並べることは少ないです。 ・指摘済みのように、ソート済みの順序で、プロシージャにジャンプする機能がついています。 ・どうしても並び替えたいということであれば、下記のようなことをすればできますが、 手でカットアンドペーストで対応したほうが手っ取り早いでしょう。
http://officetanaka.net/excel/vba/vbe/
にVBAでVBE(の内容)を操作する方法が書かれていますから、 これを参考に組み立てることができます。 ・すべてのプロシージャ名を取得する ・それらの対応するコードを取得 ・ワークシートのA列にプロシージャ名、B列にコードを転記 ・A列をキーにソート ・B列(コード)を文字列にしたものを、 新しいモジュールに AddFromStringメソッドで挿入する といったことになります。 (力を入れてコードを書くような気には、私はなれませんが、 質問者さんのほうでトライしてみてください。)
(γ) 2021/11/21(日) 20:11
>γさん 参考になるページのご紹介ありがとうございます。 無知な自分を恥じております。。。
>KenNさん 私の発言は「ご希望の機能は搭載されています」と訂正致します。 (まるごとバナナ) 2021/11/21(日) 21:01
余り実用性はないと思いますが、試しに書いてみました。(前言取り消し)
対象とするモジュール(module1)自身をいったん消して、 ソート済みのコードで書き換えるようにしています。 安全のためには、最初は別のモジュールに書き込むように修正したうえで 試したほうがいいと思います。 (いずれにしても、バックアップをとっておいたほうがよいでしょう)
Sub test() Dim sortedlist As Object Dim k& Dim num&, declarationCodes$ Dim codes$ Dim procname$ Dim startline&, numOfLines& Dim sortedCodes$
Set sortedlist = CreateObject("System.Collections.SortedList") 'key => valueのペアを管理するが、keyを自動的にソートする点が特徴。 '.Netのツールを援用
'"プロシージャ名"と"プロシージャごとのコード文字列"を取得 With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule '宣言部分のコードを取得 num = .CountOfDeclarationLines declarationCodes = .Lines(1, num)
'各プロシージャのコードを取得 For k = 1 To .CountOfLines If procname <> .ProcOfLine(k, 0) Then procname = .ProcOfLine(k, 0) startline = .ProcStartLine(procname, 0) numOfLines = .ProcCountLines(procname, 0) codes = .Lines(startline, numOfLines) sortedlist.Add procname, codes End If Next
'keyの昇順でコード文字列を連結 For k = 0 To sortedlist.Count - 1 sortedCodes = sortedCodes & sortedlist.getByIndex(k) & vbLf Next
'いったんすべてを消去して If .CountOfLines > 0 Then Call .DeleteLines(1, .CountOfLines) End If
'ソート済みのコードを書き込む .AddFromString declarationCodes .AddFromString sortedCodes End With End Sub
(γ) 2021/11/21(日) 23:07
>まるごとバナナさん、
右上のウインドウにある(Declarations)がある位置で (Declarations)と表示されるようにクリックしてみました。
(Declarations)の右側の「v」をクリックすると 右上のウインドウ内ではソートされた状態で表示されますが 標準モジュールにある実際のコードの並び方はに変化はありませんでした。 (「マクロの表示」(alt+F8)は、右上のウインドウ内の 並び方と同じソートされた形式で表示されています。)
私が希望の実際のコードがソートされた状態にはならないようです。
>(γ)さん、
実際のコードがソートされた状態に並び変えるコードありがとうございます。
お陰様でソートができました。
(kenN) 2021/11/22(月) 04:06
早々に返事をいただきありがとうございました。 使えるものであれば使ってください。
なお、VBEのプロシージャ・コンボボックス風のものは、 検索用のものでしょう。だから、ジャンプができると書いているわけです。 検索するときには、アルファベット順にならんでいると指定しやすいですから。 また、もう少し言えば、それで十分機能するとMS社はたぶん考えていると思います。
後学のために教えていただきたいのですが、 プロシージャの名前で、コードそのものをソートするメリットは何でしょうか。
私見では、 ・メインのプロシージャ main があり、 ・その中で、いくつかのサブプロシージャ convert1,convert2,sub1,sub2 を使っている といった状況にあるとき、 main convert1 convert2 sub1 sub2 と、トップダウンに並んでいたほうが、全体の構造とともに理解しやすいと思います。 これを単純にソートしてしまうと、これが崩れてしまうような気がするのですが、 そんなことはありませんか? (そうしたことも考慮して、pro1_main ,pro2_convert....などとネーミングしています、 ということなら一応の理解はできます。使いやすいとは思いませんが。) (γ) 2021/11/22(月) 13:01
>プロシージャの名前で、コードそのものをソートするメリットは何でしょうか。
メリットは無いです。
初心者のスキル不足が原因です。
私は、VBAの知識が初心者クラスなのでWEBの参考記事を参考にする事が少なくないです。
その場合、知識が無いので処理が簡素になるように
必要の箇所を分けて(昔のBASICではGOSUB的な)作成して 後で一つにまとめて呼び出すようなVBAを作成しています。
この場合、処理順番では2番目でも3番目の方がコードを作りやすいい場合は、
1番目のコードの後に2番に手を付けずに3番目を先に作成する事になります。 (難しそうな箇所は先送りする、初心者の悲しさ。。。)
>トップダウンに並んでいたほうが、全体の構造とともに理解しやすいと思います。
>これを単純にソートしてしまうと、これが崩れてしまうような気がするのですが、
全てのコードを作成した時点で
不合理に上か記載されたコードなので 全体の構造とともに理解しやすいようにSUB()の名前を書き換えるようにしています。
プロシージャ名が機種依存文字を使用しているので文字化けしています。 こちらのサイトは機種依存文字はNGのようです。
具体的な一例では、
sub ?Atest() ーーー> sub の次に丸付き数字が来ます。
sub「U+2460」test()が正解です。
もう少し、何とかしたいののですが
subの後に半角数値を書き込むことは出来ないので私の苦肉の策です。 (kenN) 2021/11/22(月) 13:53
プロシージャは分割しない主義ということなら、整合性は理解はできます。
でも、共通するロジックを独立させて重複を避ける、とか、
余りに長いプロシージャは流れがわかりにくくなるので、分割するといった考え方も
有益な気がしています。まあ、おいおいと。
# 変な人からコード提供を受けたが、
# それを使い始めたのが問題の始まりだった、などとならないよう願っています。
文字化けの件は無論承知していましたので(少なくとも私には)問題ありませんでした。
そのように受け止めていますので。
投稿者さんに丸つき数字は使わないでくださいといっても
殆ど効果がないことが経験上わかっています。
(γ) 2021/11/22(月) 14:51
sub ?Atest() sub ?Dtest()
↑これのAとDは直接関係ないのですよね?
関係なければ、ブックを分けたり、モジュールを分けてもいいのでは?
独自の関数群の保管なら、分ける必要ないですが。
そもそもたぶん、勉強中の動作確認用的なプロシージャの羅列ですよね?
保存しておかなくても、何度でも書いてみてはいかがですか?
何十回でも何百回でも書くことで覚えられるのでは?
完成したものを参考にしてもいいかもしれませんが、
コピペを多用しては、なかなか覚えられない気がします。
そもそも、全部を暗記する必要ないので、
マクロの記録や、ヘルプ、オブジェクトブラウザ、インテリセンス機能等を
駆使してコードが書けるようになるといいと思います。
(弁護士がすべての法律を暗記しているのではないのと同じ。
必要な時に必要なものがヘルプ等から得られればよいし、
いつも同じ決まったことをするのではない。)
あと、プロシージャ名は1とかAとかではなく、
日本語でもいいので機能がわかりやすい、または想像しやすい名前を命名してみては?
例)
sub 連番挿入()
sub 独自の並べ替え()
sub 各シートを別々のブックに分ける()
等
あと、残しておくなら、
後日(半年後や1年後)、見たときにわかりやすいように、
機能の説明や使い方等、コメントをコードといっしょに残しておくのもいいです。
そうすれば、「プロシージャの並び替え」という発想が出てこなくなるかと思います。
(まっつわん) 2021/11/22(月) 16:36
>sub ?Atest()
>sub ?Dtest()
>↑これのAとDは直接関係ないのですよね?
はい。
プロシージャ名が機種依存文字(丸数字)を使用しているので文字化けしています。 それぞれ、「U+2460 ー U+2463」 で 「丸数字の1 ー 丸数字の4」 です。
私のコードの作成方法は、前の書き込みで述べたように 昔のBASICでの作成方法から進歩が無い初心者レベルでシンプルです。 難しいコードを書けないので以前のコードの使いまわしが多くなります。
コード以外に説明用のコメントが約2−3割り増しなので後日見ても判るように心がけています。
並び替えのコードを(γ)さんが書いて下さったので個人的には満足しています。
(kenN) 2021/11/23(火) 05:26
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.