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

このQ&Aのポイント
  • オプションボタンの使い分けによって、時間計算を行う方法について教えてください。
  • 使用機種はWindowsVistaでExcel2007です。VBA初心者です。
  • 「自動入力」と「手動入力」における操作内容とコードの修正方法を教えてください。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

回答コードの継ぎ接ぎじゃなくて、 提示されたサンプルコードを理解して自分のものにする必要があるんじゃないでしょうか。 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にまとめるなど、 仕様検討も念頭においたほうが良いかもしれません。

dradra33
質問者

お礼

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の学習を 進めることも課題ですが…)。 こちらこそ個人的な事情を含んだ長文を読ませてしまい、恐縮です。 最後までお読みいただきありがとうございました。

関連する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

  • 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初心者です。

  • エクセル マクロ オプションボタン

    エクセル上にユーザーフォーム1を作り OptionButton1~4作成 Captionには OptionButton1)あ OptionButton2)い OptionButton3)う OptionButton4)え と名前を付けてOptionButton1をクリックすると TextBox1に”あ”と表示するようにしたいです! お願いします! 教えて下さい。 {宣言は何?} Dim i As Integer Dim s1 As String For i = 1 To 3 Step 1 s1 = Me.Controls("OptionButton" & i).Caption If Me.Controls("optionbutton" & i) = True Then With UserForm1 .TextBox1.Value = s1 End With End If Next i 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程あるため、修正を考えて ももう少し簡素化して書き込みたいため 調べましたがヒント項目がずれているせいか回答を検索できませんでした。 どのようにすれば宜しいかご教示の程宜しくお願いいたします。

  • LabelとTextboxの自動計算を希望

    ComboBox2のリスト選択で連動でlabel2とlabel12の数字変更 TextBox2には数字入力 Label12(数字) x TextBox2(数字) = Lavel22(乗算合計)で Label12変えないで、TextBox2の数字変えた時はLabel22の合計変動 Label12の数字変えて、TextBox2の数字変ない時はLabel22の合計変わらない現状です。 Private Sub TextBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case True 'TextBox2かLabel12が空白の時Label22空白 Case TextBox2.Value = "" Or Label12.Caption = "" Label22.Caption = "" Case Else 'TextBox2とLabel12が数字の時Label22はTextBox2の数字とLabel12数字を乗算する If IsNumeric(TextBox2.Value) And IsNumeric(Label12.Caption) Then _ Label22.Caption = TextBox2 * Label12 'Label22に数字がある時Label29に合計表示 Label29.Caption = Label22 End Select End Sub ComboBox2_change()作って、TextBox2_KeyUp書いてる内容を書けば動くでしょうが・・・ 同じ内容2つ書かないで動く方法があれば非常に助かります。 いい方法無さそうならComboBox2_change()作って書こうかな・・・と思ってます

  • Excel VBA オプションボタンについて

    こんばんは オプションボタンが5つあり、 登録ボタンが1つあるユーザーフォームを作りました。 このオプションにチェックを入れずに登録ボタンを押したときに 「必ず選択してください。」とメッセージを表示し、再度入力させるようにしたいのですが、どうしたらよいのでしょうか。 Excelのバージョンは2003です。 調べたところ (1)で動きそうだ。ということが判ったのですがチェックを入れ値がtrueになるとエラーが発生して止まってしまいます。(理由がわかりません) Private Sub commandbutton2_click() Dim opt As ControlFormat, flg As Boolean flg = False For Each opt In frame1.Controls If opt.Value = True Then '←ここの行でtrueだった場合のエラーが発生してしまう。 flg = True Selection.Value = opt.Caption End If Next Unload userform1 End Sub (2)この方法で何とか動いたのですが、初めの方に書いたとおり、オプションボタンが選択されずに登録ボタンが押された場合、チェックするように促すメッセージを表示する方法がわかりません。また、できればユーザーホームの×ボタンを押せなくする方法もしくは、閉じられた場合にマクロを抜けるようにするにはどうしたらよいのでしょうか。宜しくお願い致します。 Private Sub commandbutton1_click() Dim i As Integer For i = 1 To 5 If Me.Controls("optionbutton" & i).Value = True Then Selection.Value = Me.Controls("optionbutton" & i).Caption End If Next i Unload userform1 End Sub

  • オプションボタンについて

    VBAはまだやり始めたばかりで、ちょっとわからないので、教えて 下さい。 TextBox1~19に金額を入力すると、 TextBox60に小計 TextBox61に消費税 TextBox62に合計 が入るように設定してあります。 TextBox61のよこに OptionButton1 切捨て OptionButton2 切り上げ OptionButton3 四捨五入 OptionButton4 税込み(「-」を入力) を設定し、オプションボタンを選択するごとに、TextBox61の 消費税設定を変えたいと思っています。 標準では下記のコードでOptionButton1が選択されるように してあります。 オプションボタンで切り替えるにはどのようにしたら よいでしょうか。。。 Private Sub 合計Sub(ByVal myTextBox As MSForms.TextBox) Const cnsTax As Double = 0.05 Dim i As Long Dim v(1 To 19) As Long Dim y(60 To 62) As Long ' With myTextBox .Value = Format$(.Value, "#,##0") End With '再計算 On Error Resume Next For i = 1 To 19 v(i) = CLng(Me.Controls("TextBox" & i).Value) Next With Application.WorksheetFunction y(60) = .Sum(v) If myTextBox Is Me.TextBox61 Then y(61) = CLng(myTextBox.Value) Else y(61) = .RoundDown(y(60) * cnsTax, 0) End If y(62) = .Sum(y(60), y(61)) End With On Error GoTo 0 For i = 60 To 62 Me.Controls("TextBox" & i).Value = Format$(y(i), "#,##0") Next End Sub

  • VBA 年月日から日曜日に当たる日の文字を赤くする

    よろしくお願いします。 TextBox2に年号(西暦) ComboBox1に月 TextBox7に日 を、入力します。 入力方法は、Label1からLabel31を押下して日付けを入れます。 したときに各Labelの内、日曜日に該当するLabelならCaptionの文字を赤くする。 Private Sub Label1_Click() TextBox7.Value = 1 ’もし1日が日曜日ならLabel1のCaptionの文字を赤くする End Sub Private Sub Label2_Click() TextBox7.Value = 2 End Sub Private Sub Label3_Click() TextBox7.Value = 3 End Sub ~ Private Sub Label29_Click() TextBox7.Value = 29 End Sub Private Sub Label30_Click() TextBox7.Value = 30 End Sub Private Sub Label31_Click() TextBox7.Value = 31 End Sub 追 ComboBoxで日付けをダウンリスト表示したかったのですが、1列表示で 長くなってしまいます。 ※2列に表示する方法を知らないもので、Labelで2列表示にしました。 もし、ダウンリストを2列表示できるのであれば、ぜひともご教示をお願いします。 無識なものですみません。 何卒宜しくお願い致します。

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

    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 変数のエラーが出ますが、何処がおかしいですか? 宜しくお願い致します。

  • オプションボタンの名前を変更したい

    Excel2007を使用しています。VBAでの質問です。 ユーザーフォームに、タブストリップを作成し、その中にラベルとオプションボタンを配置しました。 タブは4ページありますが、切り替わるごとにラベルとオプションボタンの表示が下の様に変わるようにしたいのです。 (1) Label1 の value → ワークシート"緑"のA列に入力されている文字 (2) OptionButton1 の caption → ワークシート"緑"のB列に入力されている文字 (1)のラベルは、ネットで調べわかりました。  Private Sub TabStrip1_Change()    Dim myindex As Integer    myindex = TabStrip1.Value    Label1.ControlSource = "緑!A" & myindex  end sub (2)でも、(1)と同じように ControlSource で変わると思いましたが、valueでしかできないようです。 オプションボタンでも同じように表示を変えたいのですが、どのようにすればいいでしょうか? よろしくお願いします。