Excel VBA 基礎講座 マクロ演習
2024年12月24日
今回でExcelVBA基礎講座は最後の単元となります。
今回は質問フォームと回答フォームを作成する演習問題を基に、解答を動画で解説していく流れになります。今までの単元の学習を活用し、演習に取り組んでみましょう。
演習単元
【使用の概要説明】
顧客から、質問とそれに対する回答を入力するシステムを作成する。
以下の指示に従い、システムを完成させてください。
手順1
以下のようなデータシートに入力し、質問フォームを作成してください。


条件
フォームを表示した際にNoが自動的に入力されるようにする(Activecell.rowで行番号が取得できます。)
日時には、現在の日付が入るようにする(マクロ内に 変数名=date で日付を取得できます)
登録ボタンをクリックすると、表にデータが入力されるようにする
手順2
以下の入力フォームを作成してください。

条件
フォームを表示した際、質問総数や未回答数、回答済件数が表示されるようまた、最初の未回答の質問Noと、質問が表示されるようにする
「次の未回答を見る」ボタンをクリックすると、次の未回答の質問がでてくるように処理し、同様に前の未回答ボタンも処理する。
回答するボタンをクリックすると、回答が表に入力されるようにする
解説1(質問回答データベース手順1)
解説2(質問回答データベースの質問フォームのプログラム)
解説3(手順2の解答フォームの作成)
解説4(質問総数と未回答数と回答済数を求める)
解説5(回答フォームより回答を入力する)
解説6(未回答ボタンの処理を記述)
解説7(未回答ボタンの処理を記述 その2)
解説8(ここまでの動作チェックは念入りに)
●ソース
Private Sub UserForm_Activate( ) //ユーザーフォームが起動したときの処理
Range(“a100000”).End(xlUp).Offset(1,0).Select //セルA列の100000行目から上方向に、最後に入力したセルの一行下を選択
gyo=ActiveCell.Row-2 //変数gyoに最後に入力したセルの行数から2引いた数(Noの数字)を入れる
Label6.Caption=gyo //ユーザーフォームのNoの横に来るLabelのCaptionにgyoを入れる
Label7.Caption=Date //ユーザーフォームの日時の横に来るLabelのCaptionにData関数を入れる
End Sub
●ソース2
Private Sub CommandButton1_Click( ) //「登録」ボタンをクリックしたときの処理
Range(“a100000”).End(xlUp).Offset.(1,0).Select //セルA10万行目から最後に入力されたセルの1行下を選択する
ActiveCell.Value=ActiveCell.Row-2 //選択したセルの行番号から2引いた数をNoとして入れていく
ActiveCell.Offset(0,1).Select //上で選択したセルから一列右のセルを選択する
ActiveCell.Value=Date //選択したセルにData関数を入れる
ActiveCell.Offset(0,1).Select
ActiveCell.Value=TextBox1.Value
ActiveCell.Offset(0,1).Select
ActiveCell.Value=TextBox2.Value
no=Label6.Caption+1 //ユーザーフォームのNoの横に来るLabel(6)に1プラスし変数noに入れる
Label6.Caption=no //Label6.Captionの値をnoに入れる
TextBox1.Value=”” //TextBox1の値を空にする
TextBox2.Value=”” //TextBox2の値を空にする
●ソース3
Private Sub UserForm_Activate( ) //ユーザーフォームを開いた時の処理
Range(“a100000”).End(xlUp).Select
‘質問総数の計算
sousu=ActiveCell.Row-2 //選択したセルから-2した値を、変数sousuに入れる
Label6.Caption=sousu //フォーム「質問総数」の隣のラベル(Label6)にsousuを入れる(表示させる)
‘未回答数の計算
Range(“a10000”).End(xlUp).Select
saigo=ActiveCell.Row //アクティブセルの行番号を変数saigoに入れる
range(“e3”).Select
kazu=0
cnt=3
Do While cnt<=saigo //cntがsaigo以下の時は繰り返し下記の処理する
If ActiveCell.Value=”” Then //もしアクティブセルの値が何も入力されていない場合は
kazu=kazu+1
End If
ActiveCell.Offset(1,0).Select //処理が終わったら次に一行下を選択
cnt=cnt+1
Loop
Label11.Caption=kazu //フォーム「未回答数」の隣のラベル(Label11)にkazuを入れる(表示させる)
‘回答済みの計算
Label13.Caption=Label6.Caption-Label11.Caption //フォーム「回答済数」の隣のラベル(Label13)に(質問総数ー未回答数)の結果を入れる(表示させる)
●ソース4(※ソース3の続きから入力)
’質問Noと質問を表示
Range(“a3”).Select
Label7.Caption=ActiveCell.Value //フォーム「質問No」の隣のラベル(Label7)にセルA列のアクティブセルの値を入れる(表示させる)
ActiveCell.Offset(0,3).Select //3列右のセルを選択
Label8.Caption=ActiveCell.Value //フォーム「質問」の隣のラベル(Label8)に上記で選択したセルの値を入れる(表示させる)
’アクティブセルをE2にする
Range(“e2”).Select
‘最初の未回答の内容をフォームに表示
check_mikaito
End Sub
●ソース5(「回答するボタン」の処理)
Private Sub CommandButton3_Click( )
ActiveCell.Offset(0,1).Select
ActiveCell.Value=TextBox1.Value
TextBox1.Value=”” //ボタンをクリックした後TextBox1の値を空にする
End Sub
●ソース6(「次の未回答を見る」ボタンの処理)
Private Sub CommandButton2_Click( )
check_mikaito //マクロを実行
End Sub
●ソース7
Sub check_mikaito( )
’進み過ぎをブロックする
sousu=Label6.Caption+2
gyo=ActiveCell.Row
If gyo < sousu Then //もしgyoがsousu未満の場合に以下を実行
ActiveCell.Offset(1,0).Select
Do While ActiveCell.Value <> “” //アクティブセルの値が等しくない・空ではない場合に以下を繰り返し実行
ActiveCell.Offset(1,0).Select
Loop
End If
ActiveCell.Offset(0,-4).Select
Label7.Caption=ActiveCell.Value
Label8.Caption=ActiveCell.Offset(0,3).Value
ActiveCell.Offset(0,4).Select
End Sub
●ソース8
Private Sub CommandButton1_Click( )
gyo=ActiveCell.Row
If gyo > 3 Then
ActiveCell.Offset(-1,0).Select
Do While ActiveCell.Value<>””
ActiveCell.Offset(-1,0).Select
Loop
End If
End Sub