[[20090428013052]] 『ユーザーフォーム上の多数のスピンボタン』(まゆーる) ページの最後に飛ぶ

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

 

『ユーザーフォーム上の多数のスピンボタン』(まゆーる)
 たとえば、ユーザーフォーム上に、50このスピンボタンがあって、それぞれのスピン
 ボタンに連動して表示する値が変わるテキストボックスがやはり50個あります。
 で、たとえば

 Private Sub SpinButtonX_change()

     TextBoxX.value=sheet1.cells(X,10).value*SpinbuttonX.value/20

 End Sub

 というように、スピンボタンXとテキストボックスXを連動させたい場合、このような
 コードを50回分書くしかないのでしょうか?
 よろしくお願いします。

 記述されただけで100個のコントロール・・・、実際には、ラベル等もあることを考えるとコントロールの数が結構多いですよね?
 これだけ多いと一度仕様の見直しも行ってください。本当にこの仕様でなければ、実現できないのか?
 それでもやはり必要なのだという結論だとすると・・・、
 >このようなコードを50回分書くしかないのでしょうか?
 クラスモジュールを使うとコードの短縮はできます。

 仮に テキストボックスは、TextBox1〜TextBox50というオブジェクト名(既定名)だとします。
 また、スピンボタンは、SpinButton1〜SpinButton50というオブジェクト名(既定名)だとします。

 クラスモジュールを作成してください(クラス名は、既定名のClass1)

 このClass1のモジュールに

 '==================================================================
 Option Explicit
 Public txt As MSForms.TextBox
 Public WithEvents spn As MSForms.SpinButton
 Public id As Long '何番目のコントロールのペアかを示す数値
 '======================================================================
 Private Sub spn_Change() 'ここにスピンボタンのイベントコードを記述します
   txt.Value = worksheets("Sheet1").Cells(id, 10).Value * spn.Value / 20
 'Sheet1の参照セルもTextboxやSpinButtonによって違うという仕様でよいですよね?
 '上記のコードは、参照セルも変えています
 End Sub

 上記のコントロールを配置したユーザーフォームのモジュールでは、
 UserForm_Initializeイベントプロシジャーに

 '=======================================================================
 Option Explicit
 Private cls(1 To 50) As Class1
 Private Sub UserForm_Initialize()
    Dim g0 As Long
    For g0 = LBound(cls()) To UBound(cls())
       Set cls(g0) = New Class1
       With cls(g0)
          Set .spn = Controls("spinbutton" & g0)
          Set .txt = Controls("textbox" & g0)
          .id = g0
          .spn.Min = 1
          .spn.Max = 100
          .spn.SmallChange = 1
          .spn.Value = 1
       End With
    Next
 End Sub
 '========================================================================
 Private Sub UserForm_Terminate()
    Dim g0 As Long
    For g0 = LBound(cls()) To UBound(cls())
       Set cls(g0) = Nothing
    Next
    Erase cls()
 End Sub

 尚、SpinbuttonのMax、Min、SmallChange及び、Valueプロパティの初期値は、例題として適当に決めました。

 このようなコードで実現できると思います。
 まず、上記のクラスモジュールを使った擬似コントロール配列のコードを理解してください。

 そのためには、クラスモジュールとは何なのか? オブジェクトとは何なのか?
 から言及しなければならないかもしれません。

 >このようなコードを50回分書くしかないのでしょうか?
 これを実現するだけなら、上記のような方法で可能ですが・・・。
 ただ、上記の擬似コントロール配列が理解できたら、更に深く探らないと勿体無いです。

 上記のコードが理解できたら、次に上記のコードの構造的な不備に対して考えて見てください。

http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm

 擬似コントロール配列と擬似からの脱却について、説明しています。

 実は、擬似からの脱却ということを実現するには、結構大変です。
 でも、上記サイトを理解されると、クラスモジュール(オブジェクト)のあり方を学ぶことで
 新たにプログラムを設計する際の指針を見つけることができるかもしれませんよ!!

 ichinose


 ichinoseさま、ありがとうございます。
 ...が、理解にはいたらないので、コード、リンク、これから時間をかけて解読しようと思います。
 仕様の見直しも、自分のスキルと、実際に使う人のスキルと相談しながらしていきます。。。
 ほんとうにありがとうございました。

ありがとうございました!
このページに出会わなければ、320個のスピンボタンと320個のテキストボックスについてコードを書かなければなりませんでした。
感謝感謝です。
(ぶいびーしょしんしゃ) 2015/06/05(金) 08:06

コメント返信:

[ 一覧(最新更新順) ]


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