プロが教えるわが家の防犯対策術!

●質問の主旨
「開始時間」と「終了時間」を予め表示させておき、
「終了時間」-「開始時間」=「作業時間」とするには、
どのようなコード記述をすれば良いでしょうか?ご教示願います

●質問の補足
1.「作業開始」ボタンを押すと、「開始時間」が現在の時間に変わります。
2.「作業終了」ボタンを押すと、「終了時間」が現在の時間に変わります。
3.「作業終了」の処理が終わると同時に、赤色の部分が、
  「終了時間」-「開始時間」=「作業時間」の時間計算を行い、計算結果を
   表示させたいと考えています。
4.時間計算の上、表示を「0:00」(○時間○分)としたいと考えています。
5.現在のコードでは計算がされておらず、常に「0:00:00」が表示されます。

●コード
'開始時間をクリックするとラベル22が時間に変わる
Private Sub CommandButton6_Click()

With Me.CommandButton6
Me.Label22.Caption = FormatDateTime(Time, vbShortTime)

End With
End Sub

'終了時間をクリックするとラベル23が時間に変わる
Private Sub CommandButton7_Click()

With Me.CommandButton7
Me.Label23.Caption = FormatDateTime(Time, vbShortTime)

End With

Call sagyoujikan
End Sub

'作業時間の算出
Private Sub sagyoujikan()

Dim kaishi As Date
Dim syuryo As Date

kaishi = DateDiff("h", Label22, Label23)
syuryo = DateDiff("m", Label22, Label23)

Me.Label24.Caption = kaishi + syuryo

End Sub

以上よろしくお願い申し上げます。使用機種はWindowsVistaで、
Excel2007です。私はVBA初心者です。

「2つの時間から作業時間を算出したい」の質問画像

A 回答 (3件)

#2 です。



まったくの蛇足で質問とは何ら関係ない話になるけど。。。
練習のためのプログラムなんだろうかと思うけど、この手のアプリの場合、ボタンは 1つのほうがいいと思うよ。

Option Explicit

Dim inProcess As Boolean ' True なら計測中を表す
Dim startTime As Date ' 開始時刻
Dim endTime As Date ' 終了時刻

Private Sub CommandButton1_Click()
Select Case inProcess
Case False
' 計測を開始する
inProcess = True
startTime = Time

Label22.Caption = FormatDateTime(startTime, vbShortTime)
Label23.Caption = ""
Label24.Caption = ""

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

Label23.Caption = FormatDateTime(endTime, vbShortTime)
Label24.Caption = CDate(endTime - startTime)

CommandButton1.Caption = "作業開始"
End Select
End Sub

Private Sub UserForm_Initialize()
CommandButton1.Caption = "作業開始"
Label22.Caption = ""
Label23.Caption = ""
Label24.Caption = ""
End Sub
    • good
    • 0
この回答へのお礼

temtecomai2様

引き続きご回答をお寄せいただいてありがとうございます。

>ボタンは 1つのほうがいいと思うよ

そうですね。ボタン一つの方が入力する側にとって
間違いが少なくて済みそうです。

今回の私の質問は、データベース作成のための
ユーザーフォームを作るための練習用と
して考えていたものです。

本番のユーザーフォームを作成するときは
上記のコードを利用してボタンは一つにしておきます。

お礼日時:2011/07/06 12:22

単純に引き算しちゃえば?



Option Explicit

Private startTime As Date
Private endTime As Date

Private Sub CommandButton6_Click()
startTime = Time
Me.Label22.Caption = FormatDateTime(startTime, vbShortTime)
End Sub

Private Sub CommandButton7_Click()
endTime = Time
Me.Label23.Caption = FormatDateTime(endTime, vbShortTime)
Call sagyoujikan
End Sub

Private Sub sagyoujikan()
Me.Label24.Caption = CDate(endTime - startTime)
End Sub
    • good
    • 0
この回答へのお礼

temtecomai2様

単純に引き算するだけで、時間計算ができました!
ありがとうとうございます。

お礼日時:2011/07/06 12:16

色々と指摘点はありますので概要だけ。



DateDiff を使う時のパラメータは Date 型でないとダメです。
ボタンを押した時に、モジュールレベル変数に Now() を格納するようにしましょう。例えばこんな感じ。

Private m_Kaishi As Date
Private m_Syuryo As Date

Private Sub CommandButton6_Click()
m_Kaishi = Now()
Me.Label22.Caption = FormatDateTime(m_Kaishi, vbShortTime)
End Sub

m_Syuryoも同様にします。
そして DateDiff は m_Kaishi と m_Syuryo を使って求めます。
あと文字列の連結は & を使うべきです。

この回答への補足

edp3142様のアドバイスに基づいて
下記コードを作成してみました。
しかし残念ながら、時間計算がされず、
表示は「0:00:00」のままです。

私が記述したコードについて
edp3142様の意図をよみきれていない
可能性も考えられます。

たびたびで恐縮ですが、再度コードを
ご確認いただければ幸いです。

なお「文字列の連結」で& を使うと
表示が「0:00:000:00:00」となりましたので、
最後から2番目の行は、

Me.Label24.Caption = a

としています。



●コード
Option Explicit

'モジュールレベル変数の宣言
Private m_kaishi As Date
Private m_Syuryo As Date

'開始時間をクリックするとラベル22が時間に変わる
Private Sub CommandButton6_Click()

m_kaishi = Now()
Me.Label22.Caption = FormatDateTime(Time, vbShortTime)

End Sub

'終了時間をクリックするとラベル23が時間に変わる
Private Sub CommandButton7_Click()

m_Syuryo = Now()
Me.Label23.Caption = FormatDateTime(Time, vbShortTime)

Call sagyoujikan

End Sub

'作業時間の算出
Private Sub sagyoujikan()

Dim a As Date
Dim b As Date


a = DateDiff("h", m_kaishi, m_Syuryo)
b = DateDiff("n", m_kaishi, m_Syuryo)

Me.Label24.Caption = a

End Sub

補足日時:2011/07/05 18:26
    • good
    • 0
この回答へのお礼

edp3142様、ご回答ありがとうございます。
ご回答について補足質問がございます。
そちらの方もご確認いただければ、
幸いです

お礼日時:2011/07/05 18:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!