- ベストアンサー
フォームに引数を渡す方法のやり方
はじめまして ---------------------------- 配列Aにシート名を全て格納 ↓ フォームに引数を渡す ↓ UserForm_Initialize にて コンボボックスに引数を羅列させる ---------------------------- というようなマクロを作成しようと思っているのですが、フォームに引数を渡す方法がわからず困っています どなたかご教授をお願いします よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
どうしても Initialize イベントで初期設定を行いたいのなら、標準モジュールに書いた Public な変数に情報を持つしかないと思います。 呼び出し元から、最初にシート名一覧を Public 変数である "配列A" にセットしてからフォームを Show する。 Initialize じゃなくても良いのなら、フォームに独自のプロパティを作成する方法。 例えばこんな感じとか。 ' 呼び出し元のコード Dim sheetNames As String ' シート名に使えない文字を区切り文字に使う sheetNames = "a/b/c/d/e/f" UserForm1.OpenArg = sheetNames UserForm1.Show ' ユーザーフォームのコード Option Explicit Public Property Let OpenArg(aArg As String) Dim argArray As Variant argArray = Split(aArg, "/") Dim arg As Variant For Each arg In argArray Me.ComboBox1.AddItem arg Next End Property フォームを Show する前にプロパティを呼び出すので、その瞬間にますフォームの Initialize イベントが実行され、そのあとプロパティに値がセットされてコンボボックスに値が入ります。 したがって Initialize イベント内でコンボボックスの値を元に他の初期化もすることはできませんので、コンボボックスに入れる値を使って初期化するコードはすべてこの独自プロパティの中で処理する必要があります。 ということで、初期化のコードが多い場合はコードが煩雑になる可能性があります。
その他の回答 (3)
ウーン! AddItem だけでは、表示されなくて当然です。 Private Sub CommandButton1_Click() With UserForm1.ComboBox1 .AddItem "AAA" .AddItem "BBB" .AddItem "CCC" .Value = "AAA" ' Value の設定が必要 End With UserForm1.Show End Sub ただ、ドロップダウン表示するには、次の仕掛けも必要です。 Private Sub UserForm_Activate() ComboBox1.DropDown End Sub なお、どうしても局所的な配列を渡したければ、<フォームのCaptionを経由して渡す>ことが可能です。 が、簡単なのは、広域変数を使うことです。 Private Sub CommandButton1_Click() WSName(0) = "AAA" WSName(1) = "BBB" UserForm1.Show End Sub Private Sub UserForm_Activate() With ComboBox2 .AddItem WSName(0) .AddItem WSName(1) End With End Sub
Private Sub CommandButton1_Click() UserForm1.ComboBox1.AddItem "AAA" UserForm1.ComboBox1.AddItem "BBB" UserForm1.ComboBox1.AddItem "CCC" UserForm1.Show End Sub シート側で一気が判りやすいかと・・・。
- papayuka
- ベストアンサー率45% (1388/3066)
VBカテですが、Excel-VBAですか? こういう意味ではない? Private Sub UserForm_Initialize() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ComboBox1.AddItem ws.Name Next ws End Sub
お礼
この方法でも問題ないと思いますが この方法では、再度Worksheetのset を行わなくてはならないので避けたい方法です ちなみに配列に格納されているsheet名は別Bookのsheet名全てです 回答ありがとうございました
お礼
この方法では、フォームを開くと同時に コンボボックス内にアイテムが表示されないので 解決にはつながらなさそうです 回答ありがとうございました