[[20211121183345]] 『SUB()の位置の入れ替え』(kenN) >>BOT

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『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


「プロシージャの記載順序」といったテーマについて、
どんな議論がされているか承知していませんでしたが、
https://thom.hateblo.jp/entry/2018/06/14/004311
などの記事は同意するところが多かったですね。
ご参考まで。
(γ) 2021/11/22(月) 18:33

(まっつわん)さん、ご意見拝聴しました。

>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.