2つの時間から作業時間を算出したい

このQ&Aのポイント
  • 開始時間と終了時間を表示させ、終了時間から開始時間を引いて作業時間を計算するコードの記述方法を教えてください。
  • 作業開始ボタンを押すと開始時間が現在の時間に変わり、作業終了ボタンを押すと終了時間が現在の時間に変わる仕組みです。計算結果を0:00形式で表示したいです。
  • 現在のコードでは常に0:00:00が表示されており、計算がされていません。
回答を見る
  • ベストアンサー

2つの時間から作業時間を算出したい

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

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

  • ベストアンサー
回答No.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

dradra33
質問者

お礼

temtecomai2様 引き続きご回答をお寄せいただいてありがとうございます。 >ボタンは 1つのほうがいいと思うよ そうですね。ボタン一つの方が入力する側にとって 間違いが少なくて済みそうです。 今回の私の質問は、データベース作成のための ユーザーフォームを作るための練習用と して考えていたものです。 本番のユーザーフォームを作成するときは 上記のコードを利用してボタンは一つにしておきます。

その他の回答 (2)

回答No.2

単純に引き算しちゃえば? 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

dradra33
質問者

お礼

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

noname#259269
noname#259269
回答No.1

色々と指摘点はありますので概要だけ。 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 を使って求めます。 あと文字列の連結は & を使うべきです。

dradra33
質問者

お礼

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

dradra33
質問者

補足

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

関連するQ&A

  • 「○秒」のところの表示を消したい

    ●質問内容 下記のコードを用いてユーザーフォーム上で ストップウォッチに時間を計測できるフォームを 作成しました。 添付の画像において計測時間は「0:02:29」となっていますが、 これを「0:02」としたいと考えています。 コードをどのように書き換えればよいでしょうか? ちなみに「○秒」のところは全て切り捨てにするつもりです。 ご存知の方ご教示願います。 ●コード Option Explicit Dim inProcess As Boolean ' True なら計測中を表す Private m_Kaishi As Date Private m_Syuryo As Date '開始時間をクリックするとラベル22が時間に変わる Private Sub CommandButton6_Click() Select Case inProcess Case False ' 計測を開始する inProcess = True m_Kaishi = Time Label22.Caption = FormatDateTime(m_Kaishi, vbShortTime) Label23.Caption = "" Label24.Caption = "" CommandButton6.Caption = "作業終了" Case True ' 計測を終了してインターバルを表示 inProcess = False m_Syuryo = Time Label23.Caption = FormatDateTime(m_Syuryo, vbShortTime) Label24.Caption = CDate(m_Syuryo - m_Kaishi) CommandButton6.Caption = "作業開始" End Select End Sub Private Sub UserForm_Initialize() CommandButton6.Caption = "作業開始" Label22.Caption = "" Label23.Caption = "" Label24.Caption = "" End Sub

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

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

  • ExcelVBAのイメージコントロールについて

    こんにちは。Excel2000を使用している初心者です。 フォーム上には以下のものがあります。 Image1 Label1、Label2、Label3、Label4 CommandButton1 ・CommandButton1を押すとImage1に画像Aをロードして、次に押すと消すという動作をさせます。 ・Image1の上をマウスが動くと座標をLabel1(x)、2(y)に常に表示させます。 ・Image1をクリックするとそのときの座標をLabel3(x)、4(y)に表示させたままにします。 コードは以下の通りです。 Dim Flg As Boolean Flg = False Private Sub CommandButton1_Click() If Flg = False then Me.Image1.Picture = LoadPicture ("C:\A.jpg") Flg = True Else Me.Image1.Picture = LoadPicture ("") Flg = False End If End Sub Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer,_ ByVal X As Single, ByVal Y As Single) Me.Label1.Caption = X Me.Label2.Caption = Y End Sub Private Sub Image1_Click() Me.Label3.Caption = Me.Label1.Caption Me.Label4.Caption = Me.Label2.Caption End Sub ・・・という記述なんですが、まず画像を表示させて、次にイメージをクリックしてLabel3、4に座標を表示させた後、CommandButton1を押してもイベントを受け付けてくれません。 イメージをクリックさえしなければ、画像の表示/非表示の切り替えはできます。 何が間違っている(足りない?)のでしょうか? よろしくお願いします。

  • VBA DoEvents関数の働きと使い方を知りたい

    下記のような UserForm上の Module コードを書いてももらったのですが、DoEvents の働きが分からないのです。どなたか分かりやすく説明していただけませんでしょうか? Private i As Integer Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.TextBox1.Value = Me.Label1.Caption Then Me.Label2.Caption = "正解です" Else Me.Label2.Caption = "不正解です" End If DoEvents If i < 20 Then i = i + 1 Label_Up Me.TextBox1.Value = "" Cancel = True Else MsgBox "終了です" End If End Sub Private Sub UserForm_Initialize() i = 1 Label_Up End Sub Private Sub Label_Up() Me.Label1.Caption = Sheets("Sheet1").Range("A1:A20").Cells(i).Value DoEvents End Sub

  • コードの添削お願いします(変数エラー)

    Option Explicit Private Sub CommandButton1_Click() Dim myStr As String If myStr <> "" Then myStr = TextBox.Value Label1.Caption = LTrim(myStr) Label2.Caption = RTrim(myStr) Label3.Caption = Trim(myStr) Else MsgBox "終了" End If End Sub 変数のエラーが出ますが、何処がおかしいですか? 宜しくお願い致します。

  • VB初心者です

    計算結果が"7"の時に限り、「当たり!」と表示される、ちょっと意味不明な計算機を作っています。 現在、下記のように書いてますが、何故かうまくいきません。(当たりが表示されない 何故でしょうか?お助けください。。m(_ _)m Private Sub Command1_Click() Label1.Caption = Str(Val(Text1.Text) + Val(Text2.Text)) Label3.Caption = "+" Label4.Visible = False '画像を隠す。 'いずれかの数字が「7」のとき、メッセージを表示する。 If Label1.Caption = "7" Then Label4.Visible = True End If End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Label1.Caption = Str(Val(Text1.Text) * Val(Text2.Text)) Label3.Caption = "*" End Sub Private Sub Command4_Click() Label1.Caption = Str(Val(Text1.Text) - Val(Text2.Text)) Label3.Caption = "-" End Sub Private Sub Command5_Click() Label1.Caption = Str(Val(Text1.Text) / Val(Text2.Text)) Label3.Caption = "/" End Sub

  • Visual Basic 6.0でのLabelについて質問です。

    Visual Basic 6.0でのLabelについて質問です。 今、Labelが100個あるとして、 どのラベルが押されても同じ処理をさせたい場合、どのようにプログラムを組めばよいかわかりません・・・ そこで、 Private Sub Label2_Click() Label1.Caption = "停止" End Sub Private Sub Label3_Click() Label1.Caption = "停止" End Sub Private Sub Label4_Click() Label1.Caption = "停止" End Sub    ・    ・    ・ Private Sub Label101_Click() Label1.Caption = "停止" End Sub のように100個繰り返しても良いのですが、だらだら長くなってしまうので、スマートに 処理できる方法を探しています。 もしご存知の方がいらっしゃいましたら教えていただけないでしょうか? よろしくお願いします。

  • [Q:VBA] 現在のオブジェクトの参照(JavaScriptのthisキーワードに相当するもの)

    こんにちは。 Excel VBAで現在のオブジェクトの参照をすることはできますでしょうか?(JavaScriptのthisキーワードに相当するものはあるのでしょうか?) 下記のようなことをしたいのですが(コード自体に意味はありません。検証用です)。 よろしくお願い致します。 -- Private Sub CommandButton1_Click() キャプション = CommandButton1.Caption MsgBox(キャプション) End Sub Private Sub CommandButton2_Click() キャプション = CommandButton2.Caption MsgBox(キャプション) End Sub ・・・×数十個 ↓↓↓ Private Sub CommandButton1_Click() funcCaption End Sub Private Sub CommandButton2_Click() funcCaption End Sub ・・・×数十個 Sub funcCaption() キャプション = this.Caption MsgBox(キャプション) End Sub

  • エクセルVBA 計算の繰り返し処理?

    エクセルのVBA フォーム内にて 下記、各テキストボックスの数値を変更することにより Label27にLabel28*TextBox12+TextBox13+TextBox14 Label33にLabel34*TextBox16+TextBox17+TextBox18 Label27、Label33に計算の答えを書き込みたいため 下記のように書き込みました。 Private Sub TextBox12_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox13_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox14_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox16_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub Private Sub TextBox17_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub Private Sub TextBox18_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub 計算は出来るのですが計算ラベル50程あるため、修正を考えて ももう少し簡素化して書き込みたいため 調べましたがヒント項目がずれているせいか回答を検索できませんでした。 どのようにすれば宜しいかご教示の程宜しくお願いいたします。

  • Word2000文書でのコントロールツールの使い方が(初心者)

    Word文書のコントロール(CommandButton1)を押して、 Label1に文字を表示させたいのですが、 いろいろヘルプを読んでも分かりません。助けてください。 Word文書に コントロールツールボックス から CommandButton1 と Label1 をオブジェクトとして置きました。 コントロールツールボックス の デザインモードをクリックして、 CommandButton1 をクリックして、 Microsoft Visual Basic のウィンドウを開きました。 コードを以下のように記述しました。 Private Sub CommandButton1_Click() Label1.Caption = "文字を表示します" End Sub コントロールツールボックス の デザインモードを終了しまして、 CommandButton1 を クリックすると、 Label1 には確かに、「文字を表示します」と表示されました。 ・・・ここまではいいのですが、 このWord文書を名前をつけて保存したあと再び開くと、 CommandButton1 を押しても、何もおこりません。 どうしてでしょうか?

専門家に質問してみよう