VBA100本ノック 68本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ
問題
#VBA100本ノック68本目
フォームの「登録」ボタンをクリックしたら、全てのTextBoxの値をアクティブシートに出力した後にフォームを閉じてください。
シート出力位置
・データ最終行のすぐ下の行
・シートの1行目にあるコントロール名で探した列
・列が見つからない場合は、右端に追加してください
・改行は全て削除する

解答
Private Sub btn登録_Click()
Dim ctl As Control
Dim col As Long: col = 1
Dim lastrow As Long: lastrow = Range("A1").CurrentRegion.Rows.Count + 1
For Each ctl In Me.Controls
If TypeName(ctl) = "TextBox" Then
Cells(1, col) = ctl.Name
Cells(lastrow, col) = ctl.Value
col = col + 1
End If
Next
Unload Me
End Sub
■考え方・流れ
0:00 冒頭・問題確認
2:08 登録ボタンにマクロを登録する
4:13 全てのコントロール名と種類を取得する
6:46 種類が”TextBox”の場合、値を取得
8:09 シートに値を追加していく
※黄色の条件部分のみの解説となっております!


ユーザーフォームが使えると、
できることが格段に増えますよね!

そうか?
俺はそうは思わないけど?

出た…アマノジャク部長…
登録ボタンにマクロを登録する
さて!じゃあまずは…
“登録”ってボタンに、マクロを登録(設定)するところからだ!!
サンプルのExcelファイルは神髄さんが用意してくれてるぞ!!
ありがとう神髄さん!!

登録したいボタンを、ダブルクリックすると…

オブジェクト名_Clickってプロシージャが登録されるぞ!!!

処理は最初はなんでもいいけど…
今回の問題で忘れてはいけないのが、Unload Me!!!
フォームを終了させる一文だね!

ユーザーフォームを実行すると…↓

全てのコントロール名と種類を取得する
よし!そしたらお次!
全てのコントロールに対して処理をしていくぞ!!
ちなみにコントロールって言うのは…
これらのことね!↓

全ての…って言うと…
お決まりのFor Eachさんが活躍!!!

ほんで…コントロールの種類(ラベルとか…テキストボックスとか…)を取得したい場合は…!
こんな感じだ!↓

試しに実行してみるぞ!!
※Nameプロパティも取得してみてるよ

種類が”TextBox”の場合、値を取得→シートに転記
よし!最後に!!
コントロールの種類によって条件分岐して、シートに転記して終わっちゃうぞ!
まずは条件分岐!
これは説明するまでもないかな?↓
※Debug.Printのところを、NameとValueに変更してるぞ!

実行結果↓

そして!ここからは取得した値を、シートに転記していくぞ!
イメージとしてはこんな感じだ!

これをどうするか…!!
一旦、テキストボックスの数に応じて列を変更できるよう、colって変数を作ってるぞ!

実行結果↓

じゃ、最後に…
2行目になっていいたところを、lastrowって変数を作って…
最終行の一つ下のセルに代入するように変更してあげる!!
最終行の一つ下は…CurrentRegion.Rows.Count + 1で求められるよな!

実行結果↓

とま、こんなところかな!

お疲れさままままま!

お疲れさまでした!
あとがたり
おはこんばんちは。uぷ主です。
68本目、全テキストボックスの値を転記する問題でした…
ユーザーフォームはむずい!!
冬の朝はねむい!!
以上!!
コメント