Win坊のパソコン用語辞典

アクセスカウンタ

zoom RSS トレーニングタイマーを作る

<<   作成日時 : 2017/07/06 13:47   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

●フォームを主体としたexcel

フォームというのは、excelのワークシートに直接データを入れるのが難しい人でも使えるようにするもので、フォーム自体はマクロで作るものです。通常は、ワークシートへの入力補助に使うので、ワークシートの上に表示させますが、今回のタイマーは、フォームしか表示しません。

msohtmlclipclip_image001

●この小さなフォームが起動ます。開始ボタンを押すと、開始時刻を記録し、ボタンが終了に変わります。終了を押すと、右上に、本日の回数と合計時間 時:分 が表示されます。「一日何回・合計何分」、などと決められたトレーニングを管理したり、ゲームや勉強をする時間を管理できます。

●excelなので、実際のデータはワークシートに保存されます。あとで、このデータを使って、グラフを作ったりもできます。そのワークシートは、フォームを終了すると見えるようになっています。この、データの設計がポイントです。

msohtmlclipclip_image002

●ワークシートを作る

A列が日付・B列が合計時間・C列が回数、D列以降開始時刻と終了時刻が記録されていきます。

これを、2行目に項目名を置いて、実際の記録は3行からスタートします。1行目の、緑色のセルにのみ関数が入り、3行以降は自動で記録されます。

msohtmlclipclip_image003

A1には、=COUNTA(A3:A1000) + 2 という式を入れます。これで、データ行の採集が求められます。次のデータは、この値に位置を加えた行に、同日のデータは この行に記録されます。

B1には、=TODAY() というお馴染みのトゥデイ関数で今日の日付を求めています。記録する日付が自動で求められます。書式は、m月d日にします。毎日記録するわけではないので、新しい日付はその都度入力されます。A1の式を見て分かるように、1000日くらいでいっぱいになりますが、もっと使いたい場合は、A1000をA20000 などと増やしてください。60000行にすれば、20年は使えるでしょうが・・・

一応、今日でない日付のデータをダミーで入れておきます。1行で良いです。

開始1 終了1は、二つ入れた後でドラッグすれば、開始2 終了2 開始3 終了3 と入ります。これも100でも入りますが、項目行の名前が無くても125回分くらい入ります。適当に10くらいで良いでしょう。

●excel2003形式で保存する。

関数とダミーデータが入ったところで、旧形式で保存します。旧形式なら、マクロは後から入れられます。新形式は、予め「マクロ有効」形式で保存しないといけません。完成してから、そのように直しても構いません。

msohtmlclipclip_image004

●開発・VisualBasicを開いて、標準モジュールとフォームを作成する。

挿入メニューで、標準モジュール・ユーザーフォームの順に挿入します。

msohtmlclipclip_image005

標準モジュールは、ただの白紙ですが、ユーザーフォームは、UserForm1という名前のフォームが作られます。これを、使います。

ツールボックスのAボタンで、ラベルを2つ、ボタンマークをクリックして、CommandButton1を作ります。何度もやると、名前が変わってしまうので、一回だけ作って、大きさや位置は後で直します。対角線にドラッグします。

msohtmlclipclip_image006

次に、コマンドボタンを一つ作ります。

msohtmlclipclip_image007

●フォームのオブジェクトを編集

左のプロパティウインドウで、色やフォントサイズなどを変更できます。

msohtmlclipclip_image008

大きさや位置は、ドラッグでも変更できますが、このウインドウで、topやheightなどを変えることで、細かな変更が可能です。後からも直せるので、適当に修正して下さい。

●Module1の編集

左の、Module1をWクリックすると、モジュールシートが開きます。

ここに、VBAのマクロを書きます。今回は、以下の内容を丸ごとコピーして貼り付けてください。

Sub Auto_Open()

gyo = Cells(1, 1)

With UserForm1

.CommandButton1.Caption = "開始"

.Label1.Caption = Cells(1, 2).Text

.Label2.Caption = Cells(gyo, 1).Text & " " & Cells(gyo, 3).Text & "回 " & Cells(gyo, 2).Text

If Cells(gyo, 1) <> Cells(1, 2) Then .CommandButton1.Caption = "開始"

If Cells(gyo, 3) > 0 Then

kai = Cells(gyo, 3)

If Cells(gyo, kai * 2 + 3) = "" Then .CommandButton1.Caption = "終了"

End If

End With

Application.WindowState = xlMinimized

UserForm1.Show vbModeless

End Sub

このマクロは、Auto_Openという名前で、エクセルを開いたときに実行されるマクロです。フォームを作ってもUserForm1.Show というコマンドを実行しなければ見えません。今回は、黄色の2行で起動時には、エクセルシートは最小化して、フォームだけを独立して表示させる、というコマンドを実行させています。フォームを表示する前に、UserForm1に初期値を設定しています。

例えば、コマンドボタンの見出しを 開始 という文字にするのは、

UserForm1.CommandButton1.Caption = "開始" となります。.は、の という助詞のようなものです。UserForm1. は何度も出るので、これを省略するのが、 With UserForm1 と End Withです。この間は、UserForm1.は、.だけで済みます。

Cells(*,*)は、セルの座標を、行,列の数値で指定するもので、 gyo = Cells(1, 1)は、gyoという変数名に、A1のセルの値を持ってくる、という意味です。座標を文字であらわすのは、マクロの中では不便なので、A2はCells(2,1)のように書きます。A2は、一列二行なので逆になります。

label1には、今日の日付を、label2には履歴を入れます。if文は、ボタンの表示を開始にするか終了にするかを決めています。

いったん上書き保存して、エクセルを再起動してみます。

ワークシートは、最小化されているので、編集を継続するには、タスクバーのエクセルボタンをクリックして戻します。

●フォームの中だけで使うPrivateSub の登録

フォームのCommandButton1を右クリックし、コードの表示を開きます。

msohtmlclipclip_image009

PrivateSub Commandbutton1_Click() が登録できるように開かれます。このシートは、標準モジュールとは別のもので、フォームが開かれているときだけ使われるマクロを記録します。

ここに、ボタンをクリックしたときのマクロを書きますが、標準モジュールに kiroku というマクロを追加し、それを呼び出すことにします。それよりも、フォームの閉じるボタンをクリックしたときのマクロ Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)を追加しておきます。Kiroku を書き込み、End Sub の後に、

msohtmlclipclip_image010

Kiroku を書き込み、End Sub の後に、以下をコピーして貼り付けてください。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

If CloseMode = vbFormControlMenu Then 'フォームの×ボタンをクリックしたときのイベントを登録します

If UserForm1.CommandButton1.Caption = "終了" Then

gyo = Cells(1, 1)

retu = Cells(gyo, 3) * 2 + 3

Cells(gyo, retu).Value = Format(Time, "h:mm")

Cells(gyo, retu).NumberFormatLocal = "h:mm"

Cells(gyo, 2) = Cells(gyo, 2) + Cells(gyo, retu) - Cells(gyo, retu - 1)

Cells(gyo, 2).NumberFormatLocal = "h:mm"

End If

ThisWorkbook.Save

Application.WindowState = xlNormal

' Application.Quit

End If

End Sub

これは、フォームを×で閉じたとき、ワークシートを表示するだけでなく、ボタンが「終了」待ちの状態の場合は、終了記録をしたうえで、上書き保存する という内容です。

●標準モジュールに、kiroku マクロを追加する。

もう一度、標準モジュールを開き、以下の内容をコピーして貼り付けます。

Sub kiroku()

gyo = Cells(1, 1)

If UserForm1.CommandButton1.Caption = "開始" Then

If Cells(gyo, 1) <> Cells(1, 2) Then

gyo = gyo + 1

Cells(gyo, 1) = Cells(1, 2)

Cells(gyo, 1).NumberFormatLocal = "m月d日"

Cells(gyo, 3) = 1

Cells(gyo, 4).Value = Format(Time, "h:mm")

Cells(gyo, 4).NumberFormatLocal = "h:mm"

Else

Cells(gyo, 3) = Cells(gyo, 3) + 1

retu = Cells(gyo, 3) * 2 + 2

Cells(gyo, retu).Value = Format(Time, "h:mm")

Cells(gyo, retu).NumberFormatLocal = "h:mm"

End If

UserForm1.CommandButton1.Caption = "終了"

Else

retu = Cells(gyo, 3) * 2 + 3

Cells(gyo, retu).Value = Format(Time, "h:mm")

Cells(gyo, retu).NumberFormatLocal = "h:mm"

Cells(gyo, 2) = Cells(gyo, 2) + Cells(gyo, retu) - Cells(gyo, retu - 1)

Cells(gyo, 2).NumberFormatLocal = "h:mm"

UserForm1.Label2.Caption = Cells(gyo, 1).Text & " " & Cells(gyo, 3).Text & "回 " & Cells(gyo, 2).Text

UserForm1.CommandButton1.Caption = "開始"

End If

End Sub

End Subの下に張り付けると、自動的に仕切り線が入ります。

msohtmlclipclip_image011

マクロは、半角英語で書きます。張り付けずに、書いても良いです。スペルミスをなくすように、途中で自動的に選択が出ます。これを使えば、手書きも楽です。

●フォームのプロパティ画面で、位置やサイズ、色、表示文字の大きさなど好みに合わせて変更します。これで完成です。


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
トレーニングタイマーを作る Win坊のパソコン用語辞典/BIGLOBEウェブリブログ
文字サイズ:       閉じる