[[20161205191005]] 『めちゃくちゃになったコマンドボタンの整理』(むう) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『めちゃくちゃになったコマンドボタンの整理』(むう)

お世話になります。

ユーザーフォーム上でコマンドボタンを1つ作成します。
それをコピペでどんどん貼り付けていくと、名前の順序が
めちゃくちゃになります。

上から1,2,3と並んでいるものをコピペして貼り付けたら
4,5,6になるかと思ったら、6,5,4になったりします。

これを上から順番に名前、もしくはcaptionを整理する方法は
あるでしょうか?

これが出来ないと、例えばボタンが100個あるユーザーフォームを
作成するような場合、1つずつ貼り付けていくしかないと思うのですが、
皆どうやって複数のボタンを作成しているのでしょうか?
(あんまり順番とか気にしないケースが多いんでしょうか?)

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 多くのコントロールを配置するとき、必ず、この問題にぶつかりますね。

 >>4,5,6になるかと思ったら、6,5,4になったりします。

 これが、一番大きな不都合の1つですね。これさえなければ、我慢して 1列分配置してあとはコピペ。
 そのあと、必要ならコントロール群を選択して、編集メニューの様々な調整機能で見栄えを整えることも
 できますので。

 方法は、以下の3つの内のいずれかでしょうか。

 1.がまんして、手作業で、1つ1つ配置していく。1時間もあれば相当なコントロールを配置できます。
  おそらく、これが一番早いですよ。

 2.デザイン時は空っぽのユーザーフォームにしておいて Initialize で、動的にコントロールを配置するコードを書きます。
  これは、状況によっては非常に有効ですけど、配置するコード自体を仕様通りに書き上げる必要があります。
  やってみて、あぁ、並び順が悪いなとか、配置場所が悪いなと思えば、またコードを書き直して実行する必要がでてきます。
  また、通常、コントロールにイベント処理を紐つけて書きますけど、この方法の場合は、クラス処理が必要になります。
  まぁ、コードを書いて、書き直して、また書き直して・・・としている間に、1.の時間より長くかかることのほうが
  多いですね。
 3.コードとしては 2.と同じくらいのものを準備しなければいけないのですが、実行コードではなく
  1.で むうさんが手作業で配置する、そのお手伝いをするコードです。
  いってみれば、マクロで、ユーザーフォームを作成します。
  2.と違うのは、ユーザーフォームが作られますけど実行はされないところ。
  配置や並び順や、あるいはコントロールで配置忘れのものがあれば、コードを直さなくても、デザイン上で
  むうさんが、ふつうの作成作業と同じように調整できるところです。
  また、イベントプロシジャについても、手で配置したコントロールと同じ扱いでいけます。

 おすすめは、まず(がまんして)1. 次に、3. 最後に 2.でしょうかね。

(β) 2016/12/05(月) 20:03


 横から失礼します。βさんからレスがありましたので憚りながら
 アップします。

 ボタンの配置からでしたら↓で学校内を検索してみてください。

 「クラス ユーザーフォーム 配置」

ハードルは高いと思いますが、↑で検索してヒットする過去ログです。

[[20150602101200]] 『ユーザーフォームにカレンダー』(yuki)
(カリーニン) 2016/12/05(月) 20:07


お返事ありがとうございました。
現実的にどうしたらいいのか、という点がすっきりしました。

βさん 仰る通り、一度だけの作成ならば手作業が一番早そうですね。
しかしマイクロソフトは何故こんな嫌がらせのような仕様にしたのか気になります。
特別何も設定しなければ、普通に4,5,6になるような気がするのですが…。

3つもご提案頂きありがとうございました。
今回は素直に1の戦略を取らせて頂き、今後必要に応じて3と2も挑戦してみようと思います。
ありがとうございました。

カリーニンさん 参考になる検索ありがとうございます。
やり方は色々とありそうですね。
1つずつ嚙み砕いて理解していけたら、と思います。

今回はとりあえず手作業でやってみようと思います。
(むう) 2016/12/05(月) 21:48


 現段階では手作業がベストだと思います。

 ただ、コメントのアップ逃げ(?)もなんですので、参考までに。
 いずれ、暇ができたら、眺めてください。

 ★その前に

  1,2,3 を 選択して マウスで引っ張って 別の場所にコピーすると
  確かに番号順がおかしくなります(ただ、5,6,4 だと思いますが)
  マウスで引っ張らず、選択したら Ctrl/c。 で、Ctrl/v。
  これで、新しく出来上がるのは 4,5,6になっているはずですので
  この新しくできたもの(選択済になっています)をマウスで集団移動させれば
  作業は楽ですね。

 とりあえず、2.と3.のサンプルです。
 いずれも CommandButton を、縦に10個、それを横に10列 生成しています。
 各ボタン名は cb_行番号_列番号 で cb_1_1 から cb_10_10 まで生成されます。
 キャプションも、コード内でルールづけて設定してもいいのですが、以下のサンプルでは
 キャプションシート(コード内では Sheet2 にしています)を準備して
 A1:J10 に、それぞれのキャプションを記入しておく方法をとっています。

 ●2.実行時に自動生成

  生成するCommandButton以外は、前もって配置しておきます。
  また、各ボタンのイベント処理、通常の方法では書くことができないのでクラス処理をしています。
  とりあえず、クリックされたら、クリックされたボタン名とキャプションをメッセージで表示しますが
  実際には、このロジックをボタン名などで処理分岐させてください。

  でも・・・やってみると、これは使えないな! と思うでしょうね。
  ボタンは配置されたけど、他のコントロールにかぶさったとか、ボタンの位置をもう少し変えたいとか
  ボタンのサイズをもう少し変えたいとかとかとか・・・・

  どうするか。これは実行コードですから完成させないと、このユーザーフォームは動きません。
  で、ロジックをいじって、場所やサイズを変更する。で、実行。 あぁ、でも、もう少し・・・
  再びロジックをいじって・・・

  手作業でやったほうが早かったね という結論になると思います。

  (ユーザーフォームモジュール)

 Option Explicit

 Dim btnPool As Collection

 Private Sub UserForm_Initialize()
    Dim shM As Worksheet
    Dim L As Double
    Dim T As Double
    Dim i As Long
    Dim j As Long
    Dim w As Double
    Dim h As Double
    Dim cls As Class1
    Dim cb As MSForms.CommandButton

    Set btnPool = New Collection

    Set shM = Sheets("Sheet2")  '★キャプションリスト
    L = 20

    For j = 1 To 10
        T = 20
        For i = 1 To 10
            Set cb = Me.Controls.Add("Forms.CommandButton.1", "cb_" & j & "_" & i)
            w = cb.Width
            h = cb.Height
            cb.Left = L
            cb.Top = T
            cb.Caption = shM.Cells(i, j).Value
            T = T + h + 10
            Set cls = New Class1
            cls.init cb
            btnPool.Add cls
            Set cls = Nothing
        Next
        L = L + w + 10
    Next

 End Sub

  (クラスモジュール Class1)

 Option Explicit

 Dim WithEvents myCB As MSForms.CommandButton

 Sub init(cb As MSForms.CommandButton)
    Set myCB = cb
 End Sub

 Private Sub myCB_Click()
    MsgBox myCB.Name & "/" & myCB.Caption
 End Sub

 ●3.手作業のお手伝い

  ロジックは、2.とほとんど同じです。ただし、このコードを動かすことによって新規のユーザーフォームが
  VBAのプロジェクトに追加されます。追加されたユーザーフォームは標準サイズですので、縦横拡大して
  配置したコントロールがすべて見えるまで広げます。
  位置やサイズは、編集機能などを活用してお好みのものに。
  2.とは逆に これらボタン以外のコントロールを、この後、手作業で追加します。
  また、2.同様、キャプションは Sheet2 からひっぱってきます。
  実行すれば、このコードや、SHeet2 は不要ですから消しておいてもかまいません。

  この実行には一時的にエクセルのセキュリティレベルを下げます。
  以下のコードを標準モジュールに貼り付けた後、ファイルメニューのオプション->セキュリティセンタ->セキュリティセンタの設定
  ->マクロの設定 で、VBAプロジェクト オブジェクトモデルへのアクセスを信頼する(V) にチェックしてOK。

  以下のコード実行後、速やかに、このチェックを外してOKをおしてください。

  (標準モジュール)

Sub FormGen()

    Dim x As Long
    Dim shM As Worksheet
    Dim L As Double
    Dim T As Double
    Dim i As Long
    Dim j As Long
    Dim w As Double
    Dim h As Double
    Dim cb As MSForms.CommandButton

    With Application.VBE.ActiveVBProject.VBComponents.Add(3).Designer.Controls

        Set shM = Sheets("Sheet2")  '★キャプションリスト
        L = 20

        For j = 1 To 10
            T = 20
            For i = 1 To 10
                Set cb = .Add("Forms.CommandButton.1", "cb_" & j & "_" & i)
                w = cb.Width
                h = cb.Height
                cb.Left = L
                cb.Top = T
                cb.Caption = shM.Cells(i, j).Value
                T = T + h + 10
            Next
            L = L + w + 10
        Next

    End With

End Sub

(β) 2016/12/05(月) 22:04


 作業のお手伝い版、以下のようにもできます。

 2.と同じように、あらかじめユーザーフォームを準備し、必要であれば、自動配置以外のコントロールを
 貼り付けておきます。(自動作成後に手動で追加したほうがやりやすいとは思いますが)

 これが、たとえば UserForm1 だとします。
 この既存の UserForm1 に対してコントロールを自動追加します。

 コードは、アップ済みの FormGen の

    With Application.VBE.ActiveVBProject.VBComponents.Add(3).Designer.Controls

 これを

    With Application.VBE.ActiveVBProject.VBComponents("UserForm1").Designer.Controls

 こう変えるだけです。

(β) 2016/12/06(火) 00:04


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.