[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.