こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

オプションボタンの使い分けによる時間計算

オプションボタンの使い分け(自動入力と手動入力)によって、
「●やりたい操作」を行うには以下のコードをどのように修正すれば、
良いでしょうか?ご存知の方ご教示願います。

使用機種はWindowsVistaでExcel2007です
私はVBAをはじめて2カ月程度の初心者です。

●やりたい操作

A)「自動入力」を選択(赤色部分)→原則の操作

1.「作業開始ボタン」を押すと「開始時間」が現在の時間になる。
2.「作業開始ボタン」を押すと表記が「作業終了」になる。
3.「作業終了ボタン」を押すと「終了時間」が現在の時間表記になる。
4.3と同時に「作業時間」が「終了時間」-「開始時間」の時間計算を行って
  表記される。

※このとき「手動入力ラベル」や「テキストボックス」には、それぞれロックが
かかり、入力不可状態にする


B)「手動入力」を選択(青色部分)→例外の操作

1.左から1番目のテキストボックスに「hh:mm」形式で任意の時間を入力
2.左から2番目のテキストボックスに「hh:mm」形式で任意の時間を入力
3.左から3番目のテキストボックスに「hh:mm」形式で2-1の時間計算
  を行う

※このとき「自動入力ラベル」、「作業開始ボタン」、「開始時間」、
「終了時間」にそれぞれロックがかかる。

●コード

Option Explicit

' True なら計測中を表す
Dim inProcess As Boolean
Private j_Kaishi As Date
Private j_Syuryo As Date
Private s_kaishi As Date
Private s_Syuryo As Date

Private Sub UserForm_Initialize()

OptionButton1 = True
OptionButton2 = False

TextBox5.Locked = True
TextBox6.Locked = True
TextBox7.Locked = True

Label22.Caption = "開始時間"
Label23.Caption = "終了時間"
Label23.Caption = "作業時間"

'オプションボタンが1「自動」にオンならば、CommandButton6_Clickを呼び出す
If OptionButton1 = True Then

Call CommandButton6_Click

'オプションボタン1が「自動」にオフならば、 OptionButton2_Clickを呼び出す
Else

Call OptionButton2_Click

End If

End Sub
'開始時間を自動入力クリックするとラベル1が時間に変わる
Private Sub CommandButton6_Click()

Select Case inProcess
Case False ' 計測を開始する

inProcess = True
j_Kaishi = Time

Label22.Caption = Format(j_Kaishi, "hh:mm")

Label23.Caption = ""
Label24.Caption = ""

CommandButton6.Caption = "作業終了"
Case True
' 計測を終了してインターバルを表示
inProcess = False
j_Syuryo = Time

Label23.Caption = Format(j_Syuryo, "hh:mm")
Label24.Caption = Format(j_Syuryo - j_Kaishi, "hh:mm")

CommandButton6.Caption = "作業開始"


End Select


End Sub

'開始時間を手動入力
Private Sub OptionButton2_Click()

CommandButton6.Locked = True

TextBox5.Locked = False
TextBox6.Locked = False

s_kaishi = Time
TextBox5.Text = Format(s_kaishi, "hh:mm")
s_Syuryo = Time
TextBox6.Text = Format(s_Syuryo, "hh:mm")

TextBox7.Text = Format(s_Syuryo - j_Kaishi, "hh:mm")

End Sub

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2011-07-11 18:25:44

QNo.6869205

困ってます

質問者が選んだベストアンサー

回答コードの継ぎ接ぎじゃなくて、
提示されたサンプルコードを理解して自分のものにする必要があるんじゃないでしょうか。
UserForm_Initializeイベントのコードを目で追ってますか?
そのコードが実行された時、どういう処理がされているのか、
完全に理解しないまでも、頭の中でイメージできてますか?

UserForm初期化でOptionButton1をTrueにしてますから、
後半
>If OptionButton1 = True Then
この条件が常に「真」ですよね。
それにそのまま
Call CommandButton6_Click
に進むと、その前に設定した
>Label22.Caption = "開始時間"
>Label23.Caption = "終了時間"
>Label23.Caption = "作業時間"
これが意味を為さないですね?



質問内容は理解できない事もないのですが、
>●やりたい操作
に既にできている事が含まれていて、
じゃ具体的に何がわからないのか解かりにくいです。

おそらく、ひとつには
OptionButton1_Clickした時に
CommandButton6.LockedをFalseにすれば良い、という事が言えます。
その時に、TextBox5~7をどうしたいのかは見えませんけど。

それと
>B)「手動入力」を選択(青色部分)→例外の操作

>3.左から3番目のテキストボックスに「hh:mm」形式で2-1の時間計算
>  を行う
これをどのタイミングで表示させるのか、決めてますか?
例えば何かのButtonクリックイベントでもいいですから、
まずは自分で書いてみる事です。

ユーザーが任意に入力するわけですから、
TextBox5とTextBox6に入力された内容を読み取って時間計算すれば良い事になります。
この時、TextBox5,6には時間を表す文字列が正しく入力されていないと、
時間計算されませんから、不正値のチェックも必要になってきますね。

#あくまでサンプルですが
Dim x As String
x = InputBox("h:mmで入力", , FormatDateTime(Time, vbShortTime))
If (InStr(x, ":") > 0) And IsDate(x) Then
  MsgBox FormatDateTime(TimeValue(x), vbShortTime)
Else
  MsgBox "error"
End If
#こんな感じのチェック。



後は蛇足ですけど
「自動」と「手動」で、時間を表示|入力するコントロールを別物にする必要があるのかどうか。
ユーザーの使用感にもよりますが、TextBoxにまとめるなど、
仕様検討も念頭においたほうが良いかもしれません。

投稿日時 - 2011-07-12 23:03:08

お礼

end-u様

いつもご丁寧なご回答ありがとうございます。
お礼が遅くなり恐縮です。

時間の入力について「自動入力」か「手動入力」に関する件は、
当面はユーザーが任意で判断してもらい下記のようにするつもりです。

・「自動入力」→従来通り(Private Sub CommandButton6_Click()のコード通り)
・「手動入力」→テキストボックスには、ロックをかけない。
       コマンドボタンを設けてそのボタンを押すことによって
       時間計算を行うことにします。

※フォームからデータベースへの転記の段階で、どちらか入力されている方を
転記の対象とするようにコードは書き換えるつもりです。


>例えば何かのButtonクリックイベントでもいいですから、
>まずは自分で書いてみる事です。

「時間計算ボタン」設けて押したら、時間計算が可能となるようにしました

'作業時間を手動で入力
Private Sub CommandButton8_Click()

Dim s_Kaishi As Date
Dim s_Syuryo As Date


s_Kaishi = TextBox5.Text
s_Syuryo = TextBox6.Text

TextBox7.Text = Format(s_Syuryo - s_Kaishi, "hh:mm")

End Sub


>ユーザーが任意に入力するわけですから、
>TextBox5とTextBox6に入力された内容を読み取って時間計算すれば良い事になります。
>この時、TextBox5,6には時間を表す文字列が正しく入力されていないと、
>時間計算されませんから、不正値のチェックも必要になってきますね。

今のところ、上記のコードに対応した不正値チェックのコード記述は、
できていません。下記のコードを記述してみましたが、エラーが返されます。
もう少し考えてみます。

'作業時間を手動で入力
Private Sub CommandButton8_Click()

Dim s_Kaishi As String
Dim s_Syuryo As String

If (InStr(s_Kaishi, ":") > 0) And If (InStr(s_Syuryo, ":") > 0) Then

s_Kaishi = TextBox5.Text
s_Syuryo = TextBox6.Text

TextBox7.Text = Format(s_Syuryo - s_Kaishi, "hh:mm")

Else: TextBox5.Text=""
TextBox6.Text=""

SetFocus.TextBox5

End If

End Sub



>後は蛇足ですけど
>「自動」と「手動」で、時間を表示|入力するコントロールを別物にする必要があるのかどうか。
>ユーザーの使用感にもよりますが、TextBoxにまとめるなど、
>仕様検討も念頭においたほうが良いかもしれません。

私がVBAに取り組んでいる理由の一つは、従業員の日々の仕事内容を
データベース化することです。その入力作業をできるだけ省力化
するためにユーザーフォームの作成に取り組んでいます。

今いる会社では、営業(外勤)も技術(給与計算作業・内勤)も
経験しています。当然、他の人の使用感も聞かなければなりませんが、
たたき台がまず必要と考えています。

「とりあえず使えるもの」を作成することが、喫緊の課題となるので
私の経験をもとに作成しています(もちろんその間に私のVBAの学習を
進めることも課題ですが…)。


こちらこそ個人的な事情を含んだ長文を読ませてしまい、恐縮です。
最後までお読みいただきありがとうございました。

投稿日時 - 2011-07-14 10:23:16

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問