[[20110825165308]] 『ユーザーフォームを標準モジュール内マクロで作成』(てんて) ページの最後に飛ぶ

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

 

『ユーザーフォームを標準モジュール内マクロで作成する方法』(てんて)

ユーザーフォームのマルチページに多く(100個余り)のチェックボックスがあり
定期的にチェックボックスの名前や配置の順番を変更する必要があります。

そこで、更新用として標準モジュールにチェックボックスを再配置するマクロを組みたいのですが・・・

既存のユーザーフォームにあるマルチページ内のそれぞれのページのコントロールのみを削除しマルチページに再配置させる方法がわかりません。

 ↓ これだとユーザーフォーム内の全てのコントロールがクリアされてしまいます。

ThisWorkbook.VBProject.VBComponents("UserForm1").Designer.Controls.Clear

以下のユーザーフォームを新規に作成する場合ですと、
マルチページのページ1とページ2にチェックボックスを配置する方法が分かりません。

Sub Add_Control()

      Dim mynewform As Object
      Dim mymultipage As Object
      Dim mycheckbox As Object
'
      Set mynewform = _
        Application.VBE.ActiveVBProject.VBComponents.Add(3)
'
      Set mymultipage = mynewform.Designer.Controls.Add("Forms.MultiPage.1")
      With mymultipage
           .Width = 150
           .Height = 100
      End With
'
      Set mycheckbox = mynewform.Designer.Controls.Add("Forms.CheckBox.1")
      With mycheckbox
         .Name = "Check1"
         .Caption = "Check here"
         .Left = 10
         .Top = 10
         .Height = 20
         .Width = 60
      End With
End Sub

   御教授の程、宜しくお願い致します。
    [エクセルのバージョン]
   Excel 2000, WindowsXP

 VBProjectを操作してまでコントロールを追加するような事をしてるのは初めて見ましたが
 そもそも
 >ユーザーフォームのマルチページに多く(100個余り)のチェックボックスがあり
 >定期的にチェックボックスの名前や配置の順番を変更する必要があります。 
 この必要性とはどんな理由なんでしょうか?

 で、それが出来たとしてイベントProcはどうします?
 それもProjectから書きこむのでしょうか?

 その仕様から見直した方が良いと思いますけど・・・
 (momo)

御返信・御指導ありがとうございます。

定期的にチェックボックスの名前や配置の順番を変更する必要があります。

説明不足でした。すみません。

製造過程で出る不良内容項目が細かくあり、ユーザーフォームに入力するのは作業者です。
作業者よりよく出る不良項目は、“上の方に配置して欲しい”という要望があり、
また、新たに加わる不良項目もあります。

その為、近々に頻発している不良項目などを上の方に配置させてあげたいと考えました。

色々、調べてみて上記のコードを見つけた次第です。

が、初めから行き詰ってしまい、その後の事もまだです。

マクロの方もまだまだ浅学で、色々なサイトのコードを参考に繋ぎ合わせのマクロを組んでいる状態ですので・・・^^;

おかしな質問をしてしまいすみませんでした。

他に何か方法がありましたら御教授頂けませんでしょうか?
(てんて)


 では、
 >Add_Control
 以下のプログラムも作業者が何らかのタイミングで実行するのですよね?
 だとしたら、止めたほうが良いです。
 Excel2000では、規制はないですが、Excel2002からは、セキュリティを下げなければ
 Vbprojectの操作は出来ません。
 セキュリティを下げることの意味をわかっているプログラマがVBAコードを作成する
 ツールとしてなら、使用には賛成ですけどね。
 ただ。その場合は、もっと汎用性がないとねえ!!

 でも、
 >マクロの方もまだまだ浅学で
 と仰る割りには、よく調べてらっしゃるみたいですよね

 因みに

 Sub Add_Control()
      Dim mynewform As Object
      Dim mymultipage As Object
      Dim mycheckbox As Object
'
      Set mynewform = _
        Application.VBE.ActiveVBProject.VBComponents.Add(3)
'
      Set mymultipage = mynewform.Designer.Controls.Add("Forms.MultiPage.1")
      With mymultipage
           .Width = 150
           .Height = 100
           With .Pages(0).Controls.Add("Forms.CheckBox.1")
               .Name = "Check1"
               .Caption = "Check here"
               .Left = 10
               .Top = 10
               .Height = 20
               .Width = 65
           End With
           With .Pages(1).Controls.Add("Forms.CheckBox.1")
               .Name = "Check2"
               .Caption = "Check here2"
               .Left = 10
               .Top = 10
               .Height = 20
               .Width = 65
           End With
      End With
 End Sub

 こんな風にすると、チェックボックスがマルチページに作成されます。
 これは、将来ここのVBAプログラマも喜ぶようなツール作成時の参考に・・。

 では、どのようにするか?

 ユーザーフォームとマルチページは、予め作成しておいてください。
 名前は、UserForm1 と
 MultiPage1(ページは既定の2ページで Widhtは、150 Heightは、100の設定)

 作成したUserform1のモジュールに

 '==============================================
 Option Explicit
 Private Sub UserForm_Initialize()
    With MultiPage1
       With .Pages(0).Controls.Add("Forms.CheckBox.1")
            .Name = "Check1"
            .Caption = "Check here"
            .Left = 10
            .Top = 10
            .Height = 20
            .Width = 65
       End With
       With .Pages(1).Controls.Add("Forms.CheckBox.1")
            .Name = "Check2"
            .Caption = "Check here2"
            .Left = 10
            .Top = 10
            .Height = 20
            .Width = 65
       End With
    End With
 End Sub

 標準モジュールに

 Sub test1()
    UserForm1.Show
 End Sub

 このようにすると、実行時にチェックボックスが作成されます。

 チェックボックスのイベントが沢山あるなら、また、工夫が必要です。

 ichinose


ichinose様

こんな風にすると、チェックボックスがマルチページに作成されます。

ありがとうございます!!
正に、これを望んでおりました。

 >Add_Control
以下のプログラムも作業者が何らかのタイミングで実行するのですよね?

いえ、作業者ではなく必要に応じて自分が操作します。

ユーザーフォーム実行時のほとんど必要のない操作ですのでUserForm_Initializeへ記述しなくて済む方法を模索していました。^^;

重ねて御教授をお願いします。

既存のユーザーフォームにあるマルチページ内のそれぞれのページのコントロールのみを削除する方法は、どのように記述すればよいでしょうか?
 ↓ これだとユーザーフォーム内の全てのコントロールがクリアされてしまいます。

 ThisWorkbook.VBProject.VBComponents("UserForm1").Designer.Controls.Clear

宜しくお願いします。

(てんて)


 >近々に頻発している不良項目などを上の方に配置させてあげたいと考えました。 
 というだけの問題なら、例えば私なら
 単に不良項目の優先順のテーブルを用意して、その順番に
 チェックボックスのCaptionを書き換えてしまいますけど。

 どのチェックボックスがどの項目かは、そのテーブルを読めばわかりますし。
 ichinoseさんのコードはとても有意義なのですが、本件はそこまで必要な要件とは思えないですね。
 (momo)

 横から失礼します。
ichinoseさんが、「VBIDEに関するテーマを公開の場でディスカスすることに必ずしも否定はしない」というお立場であることは承知しています。
ですから、そのことではなく、質問者さんに。

 >ThisWorkbook.VBProject.VBComponents("UserForm1").Designer.Controls.Clear 
基本的にデザイン時の作業であれば、自分でコントロールを選択して削除するのが最も確実で早い道。
わざわざVBProjectにアクセスして、VBAから削除したいという、その意図がわかりません。
コントロールを「動的に」配置したいという要件については、理解しています。
これについては、ichinoseさんの2番目のコードは、是非理解したうえで活用されるのはいいことだと思います。

 ただし、本件は、momoさんが指摘されるとおり、そこまで必要な要件とは思えません。

 (UO3)

 VBAProjectがからむと、プログラミングについて、改めて考えることができるので
 私は、是に付け、非に付け意見交換をすべきだと思っています。
 その意見交換を通じて、このVbprojectに関しては、厳しいチェックをプログラマ自身が
 行えると良いと思っています。
 >作業者よりよく出る不良項目は、“上の方に配置して欲しい”という要望があり、
 >また、新たに加わる不良項目もあります。

 Vbprojectを操作する大きな目的は、↑これですね!!
 >いえ、作業者ではなく必要に応じて自分が操作します。 

 これは、定期的にプログラムコードを変更する
(Vbprojectを操作するということは↑ こういうことです)  ということも
 運用に必須な仕様ですよね?
 つまり、コードの変更もプログラムの仕様に含まれていることになります。

 少なくとも私は、このような仕様のプログラムを聞いたことがありません。
 プログラムって、コードの変更をなるべくしなくても済むように仕様を考える。
 これを私は、仕様決定時にかなり気を使っています。
 実行時にチェックボックスを作成したら? というのは、その一例で
 提示したつもりだったのです。

 よく、VBAコードを含んだブックとデータとして扱うブックを分けた構造にするべき
 なんて記述を目にします。これも上記の記述と重なってきますが、保存を繰り返すと
 VBAコードの動作が違ってくる場合もあります。特にUserform関連では、私も
 何度か体験したことがありました(Excel2000)。

 結論としては、この仕様にVbprojectを使うことは、反対です。

 >ユーザーフォーム実行時のほとんど必要のない操作ですのでUserForm_Initializeへ記述しなくて済む方法

 これは、どういう意味でしょうかねえ?
 考えられるのは、100個のチェックボックス実行時に作成すると、処理時間がかかる
 でしょうかねえ??

 それともコードがあまりに煩雑になるから でしょうか?

 もしこの辺りが気になるなら、チェックボックスを止めて、リストボックスで運用する方法も
 視野に入れてみてください。リストボックスは、メンバの複数選択も出来ますし、
 ビジュアル的にチェックボックスは無理ですが、オプションボタンに似せたものなら、
 可能です。

 検討してみてください。

 尚、ご質問の件ですが、

 ユーザーフォームにチェックボックスを作成するのは、

 mynewform.Designer.Controls.Add("Forms.CheckBox.1")

 マルチページへのそれは、

 mymultipage.Pages(0).Controls.Add("Forms.CheckBox.1")

 ユーザーフォームにコントロールの削除は、
 ThisWorkbook.VBProject.VBComponents("UserForm1").Designer.Controls.Clear 

 わかっているなら、マルチページのページにあるコントロールの削除は、想像できませんか?

 ichinose@あっ、お客様だ、商売商売


 >momo様・UO3様・ichinose様

 貴重な御意見ありがとうございます。

 VBAProjectを使用する事を随分、安易に考えていたようです。

 最初に記しましたように、色々なサイトを参考に繋ぎ合わせのマクロを組んでいる程度ですので、便利そうなコードに飛びついてしまいました。

 行き詰って、ここへの質問を逡巡・・・
 思い切って、質問して良かったです!
 怪我の功名?^^;
 すんなり進んでいたら突っ走ってました。^^;
 良い勉強になりました。いえいえ、もっと勉強します。

 momo様の“チェックボックスのCaptionを書き換えてしまいますけど。”
 UO3様の“自分でコントロールを選択して削除するのが最も確実で早い道”
 ichinose様の“リストボックスは、メンバの複数選択も出来ますし”

 目から鱗。
 大変参考になりました。
 もう一度、検討し直してみます。

 分からないままにしておくのも気持ち悪かったので・・・
 ThisWorkbook.VBProject.VBComponents("UserForm1").Designer.MultiPage1.Pages(i).Controls.Clear

 で、出来ました。^^

もう一つ。すごい余談なんですが・・・

皆さんの文字の大きさが揃っていてスマートなのに自分のは・・・なんだかみっともないです。

今後、また質問させて頂く為にも文字の大きさを小さくするにはどのようにするのでしょう?

 あ。出来ました。半角スペース。w
 この質問が、ずっと残ると思うとなんだか小っ恥ずかしいです・・・^^;

大変お世話になりました。ありがとうございました!

 (てんて)

コメント返信:

[ 一覧(最新更新順) ]


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