• ベストアンサー

ユーザーフォームのプロパティをVBAで設定したい

いつも楽しく勉強させていただいております。 Excelのユーザーフォームを使い始めたところです。 コントロールのプロパティの設定を細かいVBAで行いたいのですが、方法がわかりません。 たとえばラベルの位置をそろえたいので 黒いラベル2.Left = 黒いラベル1.Left 黒いラベル3.Left = 黒いラベル1.Left といったコードを書いてUserForm_Initialize()で実行してみたのですが、フォームを閉じると元の値に戻っています。 どうすれば黒いラベル2と黒いラベル3の左端を黒いラベル1と同じにできますか。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

Set Ctrl = .Designer.Controls("黒いラベル1") .Designer.Controls("黒いラベル2").Left = Ctrl.Left .Designer.Controls("黒いラベル3").Left = Ctrl.Left InitializeイベントはUserForm読み込み時に発生するもの。 UserFormを呼び出すから発生します。 書こうとしているのは 「UserFormの設計を管理するプログラムファイルを書き換えるプログラム」 です。 VBIDEに限った話ではありませんが 「設計」と「実行」を切り離して考えるようにしてください。 尚、コード全体の提示は無用に願います。 以上です。

meglin888
質問者

お礼

回答ありがとうございます。 おかげさまで意図したとおりの結果が得られました。

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

こんにちは。お邪魔します。 「UserForm.Controlsの初期設定(プロパティ)を効率よく再設定したい」 ということなのだと理解しました。 ただ、 原題の「ユーザーフォームのプロパティをVBAで設定したい」 ということに関して、 「UserForm.Controlsの初期設定をVBAで再設定したい」 という意図でお訊きになっているのだとすると、 プログラムファイルを書き換えるプログラムという意味になってしまいますから、 公開の場で直接の回答を付けることは私の主義に反するので致しかねます。 あしからず。 タイトル通りのことがしたいならば 「vba vbide userform designer」 で検索してみてください。 内容的には初級者に薦めるものではありませんし、様々な制約もあります。 技術的に、応用できる範囲の限られた特殊なものですし、 むしろ上達を阻むような面もありますから、教えたくない意味もあります。      再度、「UserForm.Controlsの初期設定を効率よく再設定したい」 というニーズに応える機能がVBE(Visual Basic Editor)には幾つか用意されています。 手順1(UserForm.Controlsの選択)  UserFormのDesignerが表示されている状態で、 ・方法1a  黒いラベル1を選択、  そのままCtrlキーを押しながら、黒いラベル2、黒いラベル3、を選択 ・方法1b  黒いラベル1,黒いラベル2,黒いラベル3を覆う範囲をドラッグ 以上の手順により→ 黒いラベル1,黒いラベル2,黒いラベル3  が、同時に(複数)選択された状態であることを確認してください。 手順2(UserForm.ControlsのProperty設定) ・方法2a  F4キーを押し、表示されるプロパティウィンドウで  Leftの項目に設定したい値(つまり黒いラベル1.Leftの値)を記入 ・方法2b  黒いラベル1が選択中であることを示すフレームの上をクリックして  選択中のControlsのうち黒いラベル1がアクティブな状態  (フレーム上の8方向を示すドットが白色)であることを確認してください。  黒いラベルの何れかを右クリック→整列→左 以上の手順により→ 黒いラベル1,黒いラベル2,黒いラベル3が整列されます。 他にも方法はありますし色々な教え方があるとは思いますが、 応用し易いように2*2例だけ挙げてみました。 VBEに備えられたその他の機能についても暇をみて調べて、習得しておくと 何かと効率よく作業できるようになるかと思います。     余談。UserFormの扱いに熟れてから、ですが、私の場合、 UserForm.Controlsのデザイン上のプロパティ設定は(#2のご回答主旨と同様) _Initializeイベントに書いて済ますことが多いです。 初期設定をやり直すより早く、できますし _Initializeイベントに書くことによって、処理の速さが 損なわれるというようなことを感じたことも無いからです。 Controlのオブジェクト名やIndexでループしたり、 Controls数の多少に係らず基本通りのことしかしませんけれども。 今回のご質問のような場合だと Private Sub UserForm_Initialize()   Dim i As Long   For i = 2 To 3     Controls("黒いラベル" & i).Left = 黒いラベル1.Left   Next i End Sub ↑のようなコードを用意して、 For Next ループのstart値end値を必要に応じて指定することで 用は足りてるようにも思えます。 ご検討してみてください。 以上です。

meglin888
質問者

お礼

本来はお礼を書く欄ですが、補足の訂正を。 Visual Basic For Applications Extensibilityがないと書きましたが、 Microsoft Visual Basic for Applications Extensibilityならありました。 これを参照設定して実行したところ、 Ctrl.Left = UserForm1!黒いラベル1.Left のところでUserForm_Initialize()に制御がうつり、そこで異常終了してしまいます。 なんとかVBAでプロパティの設定をした結果をデザインモードでも残せるようにできませんか。

meglin888
質問者

補足

回答ありがとうございます。 >「UserForm.Controlsの初期設定(プロパティ)を効率よく再設定したい」 まさにその通りです。 説明が足りませんでした。 足りないといえば環境を書くことも忘れていました。 Win7でExcel2010です。 実は私、軽い脳梗塞の後遺症でCtrlキーを押しながら複数のコントロールを選択といった作業が非常に苦手となりました。 一方キーボードを打つのはそんなに苦ではないのでできれば今回のような場合はプログラムで対処したいのです。 >「vba vbide userform designer」 検索して下記のようなコードを書いてみたのですが、VBIDE.VBComponentの参照設定をしないといけないようです。 ところが私のExcel2010では「Visual Basic For Applications Extensibility 」がありません。 どうすればいいですか。 Sub MyProc() Dim Frm As VBIDE.VBComponent Dim Ctrl As Control Set Frm = ThisWorkbook.VBProject.VBComponents("UserForm1") With Frm Set Ctrl = .Designer.Controls("黒いラベル2") Ctrl.Left = UserForm1!黒いラベル1.Left Set Ctrl = .Designer.Controls("黒いラベル3") Ctrl.Left = UserForm1!黒いラベル1.Left End With End Sub

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

> UserForm_Initialize()で実行してみたのですが、 実行時には揃ってるんでしょ? 「ユーザーフォームのプロパティをVBAで設定したい」は達成できてるのでは? > フォームを閉じると元の値に戻っています。 そりゃデザインモードだからでしょ? Ctrlキー押下で複数のオブジェクトを選択できます。 複数選択した状態でleftプロパティを設定することも可能ですよ。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

F4キー押下でプロパティウィンドウが開くので、黒いラベル1.Leftの"値"をコピー その後、黒いラベル2.Leftの"値"へペースト、黒いラベル3.Leftも同様 じゃないですか?

meglin888
質問者

補足

回答ありがとうございます。プロパティウィンドウで一つずつ設定するのではなく、VBAで連続してやりたいのです。コントロールの数が多いので。

関連するQ&A

専門家に質問してみよう