【その3】では、アンケートフォームにプログラムを組み込んでいきます。
プログラミングといってもアンケートデータ入力フォーム上に入力された内容をExcelに取り込むだけです。素人が作ったものなので間違いがあればご指摘願います。
※入力データの格納をSheet2に固定にしているので、実行時にはBookにSheet2がなければいけません。
・
Excel VBAでアンケートデータ入力フォーム
・
Excel VBAでアンケートデータ入力フォーム【その2】
からの続きです。
参考にしたのは下記の書籍です。
仕事に役立つExcelVBA業務活用編 (Excel徹底活用シリーズ)
著者: | 西沢 夢路 |
出版社: | ソフトバンククリエイティブ |
発売日: | 2008/8/27 |
価格: | 2,604円(税込み) |
CHAPTER 06 「ユーザーフォーム」のテクニックに今回作成したいことの内容が掲載されていました。サンプルを見ても何をやっているかわからない部分については、コードから逆引きをして調べました。
コードの表示
ユーザーフォームを選択して、右クリックして「コードの表示」をクリックします。
初期処理
左側の窓に「UserForm」を、右側は「Initialize」を選択します。
すると、下記のようなコードが表示されます。
Private Sub UserForm_Initialize()
End Sub
「Initialize」は、ユーザーフォームを開いたときに実行される初期処理です。
初期処理で3種類の処理を定義します。
コンボボックスの値を設定
・コンボボックスのリストに値を設定するにはAddItemメソッドを使います。
・フォームを開いたときに何も選択されていないようにQ3.ListIndex = -1とします。
後はおまじないです。詳細は書籍やヘルプを参照してください。
ID No.を付与するための番号を取得する
・A列の空白セルを探して、そこからひとつ上の値を返してくれます。
先頭行には項目名があるので、最初はA列の空白セルは2、そのひとつ前なので1となります。
フォームを開いたときにフォーカスをQ1にする
Private Sub UserForm_Initialize()
'****************************************************
' コンボボックスの初期値設定
'****************************************************
Q3.Style = fmStyleDropDownCombo
Q3.RowSource = ""
Q3.Clear
Q3.AddItem "選択肢1"
Q3.AddItem "選択肢2"
Q3.AddItem "選択肢3"
Q3.ListIndex = -1 'コンボボックスを未選択にする
'****************************************************
' ID Noに最終行列の値を挿入(データ未入力時は1)
'****************************************************
ID_No.Value = Sheet2.Range("A" & Rows.Count).End(xlUp).Row
'****************************************************
' Q1_1(MAサンプル 選択肢1)にフォーカス
'****************************************************
Q1_1.SetFocus
End Sub
登録処理
登録ボタンがクリックされたときに実行されます。
左側の窓に「登録」を、右側は「Click」を選択します。すると、下記のようなコードが表示されます。(フォームの登録ボタンをダブルクリックしてもコードが表示されます。
Private Sub 登録_Click()
End Sub
「登録処理」では、自動付与項目とフォームの入力値(アンケート回答値)をSheet2の最終行に追加していきます。そして次のデータエントリーに備えるために初期処理を行います。
ポイントとなるのは、下記の2つです。
With Worksheets("Sheet2")
End With
With から End With の間は、Worksheets("Sheet2")が適用されるので、セルに値を代入するのに都度ワークシートの定義をせずに .Range だ行うことができます。
.Range("A" & lRow + 1).Value = ID_No.Value
初期処理で設定したID_Noの値を列Aのn行目(lRowの値+1)に格納するという意味になります。
初めてデータ入力をするときであれば、lRowとID_Noには1が代入されているので、A列2行目に1が格納されることになります。
後は、プログラムを参照してください。わからないところがあれば書籍やヘルプで調べてください。
Private Sub 登録_Click()
'*************************************************************
' 登録ボタンが押されたらSheet2のA列の最終行にデータを入力する
'*************************************************************
Dim lRow As Long '変数として使うlROWの定義
With Worksheets("Sheet2") 'End WithまですべてSheet2に対しての処理
lRow = .Range("A" & Rows.Count).End(xlUp).Row 'データの最終行をlRowに代入
.Range("A" & lRow + 1).Value = ID_No.Value 'ID No.を代入
.Range("B" & lRow + 1).Value = Now '現在時刻を取得
.Range("C" & lRow + 1).Value = Environ("COMPUTERNAME") 'コンピュータ名を取得
.Range("D" & lRow + 1).Value = Environ("USERNAME") 'ユーザー名を取得
'************************
' Q1の値を代入 E~G列
'************************
If Q1_1 Then .Range("E" & lRow + 1).Value = 1 Else .Range("E" & lRow + 1).Value = 0
If Q1_2 Then .Range("F" & lRow + 1).Value = 1 Else .Range("F" & lRow + 1).Value = 0
If Q1_3 Then .Range("G" & lRow + 1).Value = 1 Else .Range("G" & lRow + 1).Value = 0
'************************
' Q2の値を代入 H列
'************************
If Q2_1 Then .Range("H" & lRow + 1).Value = 1
If Q2_2 Then .Range("H" & lRow + 1).Value = 2
If Q2_3 Then .Range("H" & lRow + 1).Value = 3
'************************
' Q3の値を代入 I列
'************************
.Range("I" & lRow).Value = Q3.Value
'************************
' Q4の値を代入 J列
'************************
.Range("J" & lRow).Value = Q4.Value
End With
'****************************************************
' 登録ボタン実行後のイニシャライズ処理
'****************************************************
ID_No.Value = Sheet2.Range("A" & Rows.Count).End(xlUp).Row 'ID No.の設定
Q1_1.Value = False 'チェックを外す
Q1_2.Value = False 'チェックを外す
Q1_3.Value = False 'チェックを外す
Q2_1.Value = False 'チェックを外す
Q2_2.Value = False 'チェックを外す
Q2_3.Value = False 'チェックを外す
Q3.ListIndex = -1 'コンボボックスを未選択にする
Q4.Value = "" '値をクリアする
Q1_1.SetFocus 'フォーカスをQ1_1に戻す
End Sub
終了処理
終了ボタンはクリックされたらフォームを閉じます。
Private Sub 終了_Click()
Unload Me ' 終了ボタンが押されたら入力フォームを閉じる
End Sub
以上でコードの入力は終了です。
タブ遷移
マウスを使えば問題にはなりませんが、データ入力の速度をあげるためにキーボードだけで入力できるようにタブの遷移を設定します。(Tabキーで遷移します)
ユーザーフォーム上で右クリックをして「タブ オーダー」を選択して起動します。項目を選択して「上に移動」「下に移動」で順番に移動するように変更してください。
これでプログラムもできあがりです。
次回は、実行方法について記載します。
今日の一曲
Kronos Quarter(クロノス・カルテット)を一躍有名にしたこの一曲です。カルテットという通り弦楽四重奏です。『
The Kronos Quartet Plays Sallinen, Glass, Sculthorpe, Hendrix, Nancarrow』というアルバムですが、邦題は『
紫のけむり~現代の弦楽四重奏曲/クロノス・クァルテット』。Jimi Hendrix(ジミー・ヘンドリックス)の Purple Haze(パープルヘイズ)です。バイオリンとは思えない音の出し方でとても格好いいです。Kronos Quartetは色々なミュージシャンと共演をしていますので、色々と聴いてみてください。
Kronos Quartet
Plays Sallinen, Glass, Sculthorpe, Hendrix, Nancarrow
Purple Haze
『purple haze』はもう少しテンポの遅いバージョンが『
紫のけむり~クロノス・スーパー』に収録されています。こちらもイケてます。しかし、邦題ではどうしても「紫のけむり」と付けたいみたいですね。
Kronos Quartet
Kronos Quartet: Released 1985-1995
Purple Haze