ユーザーからデータを受け取りたいときはInputBoxを使うんだけど
これだと1つしか受け取れなくて事足りないときがある
そこでつくってみたのがこれ↓
ボタンを押すとチェックの入った項目の配列を返す
チェックした「ささやき」と「いのり」が入っている
ユーザーフォーム
ユーザーフォームのコード
ユーザーフォームを呼び出す標準モジュール
思いつくエラー処理は
ユーザーが何も選択しないでボタンを押したとき
ボタンを押さずにフォームのXボタンを押して閉じられた時
ユーザーフォームコード
Private myWords() As String
'ボタン押した時
Private Sub CommandButton1_Click()
Call GetWords
Me.Hide 'ユーザーフォームを非表示にする
End Sub
Private Sub UserForm_Initialize()
'ListBoxの初期化
With Me.ListBox1
.AddItem "ささやき"
.AddItem "えいしょう"
.AddItem "いのり"
.AddItem "ねんじろ!"
.ListStyle = fmListStyleOption 'チェックボックスにする
.MultiSelect = fmMultiSelectMulti '複数選択可にする
End With
End Sub
'チェックされたリストを配列に入れる
Private Sub GetWords()
Dim i As Long, j As Long
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) Then
ReDim Preserve myWords(j)
myWords(j) = Me.ListBox1.List(i)
j = j + 1
End If
Next
End Sub
'標準モジュールから呼び出す関数
'ListBoxでチェックされた項目名群を返す
Public Function doModal() As String()
Me.Show
doModal = myWords
End Function
標準モジュールのコード
Sub GetMyWords()
Dim Ash() As String
Ash = UserForm1.doModal
Unload UserForm1 'ユーザーフォームはここで閉じる
End Sub
↑標準モジュールの
Ash = Userform1.doModal
ってのが呼び出しているところで、InputBoxなら
Ash = InputBox
こうなるところ
doModal関数のMe.Showでユーザーフォームが表示される
ユーザーがリストを選んで
GetWordsが実行されて
ユーザーから見るとボタンを押した時点でユーザーフォームが閉じられるのが自然だけど、処理はまだ終わっていないので閉じることはできないので
Me.Hide
これで非表示にして閉じたように見せかけている
この流れがよくわからん、こうなってくれないと困るんだけどね。
これでユーザーフォームの方は終わりで取得したmyWordsは標準モジュールの方へ送られる
標準モジュール
ここまで来てからユーザーフォームを閉じて完了
参照したところ
標準モジュールとフォーム間のデータ受け渡しⅡ|Excelユーザーフォーム入門ここがなかったら今回のは作れなかった
http://excel-ubara.com/excelvba3/EXCELFORM010.html
Office TANAKA - Excel VBA Tips[複数選択可能なリストボックス]
http://officetanaka.net/excel/vba/tips/tips144.htm
ダウンロード
関連記事
午後ツールその53、ウィンドウの整列、異なるブック(ウィンドウ)の整列 ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14655664.html