• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:時刻の比較で質問です)

EXCEL2010で時刻の比較結果を元に処理する方法

このQ&Aのポイント
  • EXCEL2010で時刻の比較結果を元に処理する方法を解説します。B13セルにはいろいろな時刻の値が入ります。A17セルには9:00が入っています。B21セルには0:30が入っています。B13からA17を引いて0:30以上だったら、B12セルにA17セルの値9:00を表示し、それ以外はB12セルに前日16:00を表示するマクロを作成します。
  • しかし、Case文で条件を指定していますが、=が効いていない問題が発生しています。B13セルが9:30だとB12セルには前日16:00が表示され、9:31だと9:00が表示されます。実行した際に表示されるB23とB24セルには0:30と表示されます。正しく表示させる方法を教えてください。
  • なお、Range関数を使用してB23とB24に表示される値は0:30となっています。

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

  • ベストアンサー
回答No.3

こんにちは。お邪魔します。 時刻値は小数点数で、 小数点数をそのまま四則演算に掛けると、 二進数で計算するPCは、十進数との間に 丸め誤差に代表される演算誤差を避けることが出来ません。   MsgBox 0.1 + 0.2 = 0.3 の結果がFalseになってしまう例とかが有名です。 【浮動小数点数 誤差】のようなキーワードで検索すると、 たくさんの解説が見つかりますから、 今後の為にも軽く目を通してみてください。 そういうものがある、小数点数の演算には気を付けよう、 という程度に憶えておけば十分です。 [分](24時間=1440[分])として整数値 を対象に条件分岐するのが、[分](時分秒)の扱いの基本です。 ※ここで[分]と表記するのは、1:59 = 119[分] という意味です。 また、差を求めるにはDateDiff()関数が便利で優秀です。   MsgBox DateDiff("n", "9:00", "16:59") のように文字列値でも引き受けてくれます。 引数に指定した"n"が[分]単位を意味します。("m"を指定すると[月]単位です) 【[分]単位で整数値を扱う】ということを明示的にする狙いも込めて、 下に挙げるマクロの例ではDateDiff()関数を使っています。 念の為、強調しておきますが、 例えば、時刻として9:30 と表示されているセルがあったとして、 値(数式バーに表示される実際の値)には何パターンかあります。  9:30:00  9:30:59  2015/2/17 9:31:00 この内、今回の課題については、h:mm:00 のように[時:分]のみが 入力されたデータ(値)を対象に処理するもの、という解釈でいます。 ここに書くのは、もしも[秒]を採り込んだ時刻値の場合でも   MsgBox DateDiff("n", "9:00:59", "9:01:01") の結果が 1 となるように、それぞれの時刻値を[分]で丸めたものの差 を[分]として扱っていますので、実際のニーズと違いが出てくる場合もあるでしょう。 もし、  9:30:30 - 9:00:31 は30[分]未満だというようなお話でしたら、また別の方法になりますので、 補足欄にでも例示を添えて書いてみて下さい。 因みに、2015/2/17 9:31:59 のような日付時刻値を扱う場合は、 シートを作業グループにして入力確定すると、 非表示のシートでは 2015/2/17 9:31:00 のような丸めが発生する場合があって 集計時に思わぬ結果を招くこともあります。 VBAでセル範囲に時刻値を出力する場合は、文字列値として扱う場合が多いです。 [セルの書式][表示形式]が標準でも(時刻値でも)、 時刻値として確定させることが簡単に出来るからです。 なので、   Range("B12").Value = Range("A17").Text のように.Textプロパティを使っています。 似たような意味で、ご提示の記述の変数の宣言がVariant型であることは、 勿論正しいのですが、時刻値を扱う場合は特にVariant型がベストです。 なにか不足あれば遠慮なく、、、。 Sub Re8919282() ' ※すべて整数値としての[分](24時間=1440[分])で扱うことを明示 Dim st As Variant   st = Range("B13").Value   ' ' 【A17 と B13 との[分]の差】について条件分岐する   Select Case DateDiff("n", Range("A17").Value, Range("B13").Value)   ' ' 【B21の[分]】(30分)以上であれば   Case Is >= DateDiff("n", 0, Range("B21").Value)     Range("B12").Value = Range("A17").Text   ' ' 条件に当てはまらなかったらB12セルに前日16:00を表示   Case Else     Range("B12").Value = "前日16:00" ' ? DateAdd("h", 16, Date - 1)   End Select End Sub

3620313
質問者

補足

厳密な計算に基づく判定結果が必要というわけではありませんでした。セルの書式は時刻形式で指定しており、元々の私のマクロで正しく判定される時間帯13:30と13:00と、NGで判定される09:30と09:00の違いに疑問を持った次第です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.2

select caseを使用したいのであれば下記方法では如何でしょう。 (if文でも良いかと思いますが) 時間計算後に1440倍すると分換算出来ます。(1:30は90となります) Select Case の場合は 最初の比較をする場合は 必ず Case Isとなります。 Sub test() Dim st As Single '1440倍で分換算 st = (Range("B13").Value - Range("A17").Value) * 1440 Select Case st Case Is > 30 Range("B12") = Range("A17") Range("B12").NumberFormatLocal = "h:mm" Case Else Range("B12") = "前日16:00" End Select End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

小数点以下の数字を演算するときの丸め誤差によるものです。 すなわち、以下のような数式をシート上に入力することでも検証することができます。 「st - Range("A17").Value 」に対応する数式「=B13-A17」をB23セルに入力します。 この時刻とB21セルの値が完全に一致しているかどうかを「正確に」判定する数式「=B23-B21=0」を入力すると「FALSE]と2つのセルの値が同じではないことを示しています。 実際「=B23-B21<0」と入力すれば「TRUE」が返りますので、B23セルのほうがわずかに小さい値となっていることがわかります。 一般にExcelなどの計算ではこのような丸め誤差が発生しますが、状況によっては(Excelが気を利かせて)、これらの誤差を修正する機能が用意されている場合もありますので注意が必要ですが(上記の判定数式でいうと「=B23=B21」の判定式や、計算結果が2進数で表示できる数値になる場合など)、基本は丸め誤差を意識した処理をする必要があります。 たとえば、簡便には判定式の左辺に微小値を加えて判定式を「以上」ではなく「より大きい」などの処理をすることになります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マクロが動きません

    以下のようなプログラムでC3の値が変わるたびにA10の値に1を加えていきG3,H3が両方0になったらA10の値も0にする。C5の値が変わるたびにA15の値に1を加えJ3,K3が共に0になったらC5も0にするようにしました。 しかし、動作しません。 このシートの3行目は=シート名!セル番号 という形でほかのシートのセルの値が表示されるようになっています。G3、H3、J3、K3に手動で数値を入力した場合 は動作します。 ほかのシートのセルの値を表示させたセルの値が変化しても動作させる方法はないでしょうか> Private Sub worksheet_change(ByVal target As Range) With target If .Count > 1 Then Exit Sub If IsNumeric(.Value) = False Then Exit Sub If IsEmpty(.Value) = True Then Exit Sub If Not .Row = 3 Then Exit Sub Select Case .Column Case 3 Range("A10").Value = Range("A10").Value + 1 Case 5 Range("A15").Value = Range("A15").Value + 1 End Select End With If Range("g3").Value = 0 And Rang("h3").Value = 0 Then Range("A10").Value = 0 If Range("j3").Value = 0 And Rang("k3").Value = 0 Then Range("A15").Value = 0 End Sub

  • VBAのプロシージャについて質問です

    以下にA、B2つのプロシージャを書きます。 A  Sub kubun( ) Dim taipu As String Select Case Range("C27").Value Case 100,110,120 taipu="乗用車" Case 201,211,221 taipu="RV・4WD" Case 300,305,310 taipu="スポーツカー" Case Else taipu="正しいコードを入力してください" End Select MsbBox taipu ←←←← End Sub B  Sub iro( ) Select Case Range("C34").Value Case "RED" Range("C34").Font.ColorIndex=3 Case "BLUE" Range("C34").Font.ColorIndex=5 Case "PINK" Range("C34").Font.ColorIndex=7 Case "GREEN" Range("C34").Font.ColorIndex=10 Case Else MsbBox "RED,BLUE,PINK,GREENのいずれかを入力してください"←←←←     End Select End Sub A,Bの←←←←の部分ですが、End Selectの前に入れるか、 後ろに入れるかはどうやって決めるのですか。 こういう場合は前に入れる、こういう場合は後ろに入れるといった 決めごとを教えてください。 宜しくお願いいたします。

  • 指定した時刻になるとセルに色がつくようにしたい

    初心者です。エクセルのVBAで設定した時刻になったらセルに色がつくようにしたいです。 例えば、17:00時にA1セル、18:00にA2セルに色を自動でつくようにしたいと思っています。 OnTimeを使ったらよいと思っていろいろ試しましたが、設定した時刻になってもなにも起こりません。 標準モジュールに以下の内容を記述して、パソコンの時計を変更して確認しています。 できたらクリックしないでファイルオープンしてなにもせずに設定時刻に実行されるようにしたいです。 最初の3秒でB1に現在の時間を取得。 セルA1とA2をクリアしてから設定時間に色をつけるようにしたつもりです。 下記が記述内容です。 Sub 指定時間にマクロを開始() Dim stime As Date Range("A1") = "" Range("A2") = "" Range("B1").Select stime = Now + TimeValue("00:00:03") Application.OnTime TimeValue(stime), "マクロ実行内容", TimeValue("00:05:00") End Sub Sub 時刻の設定1() Application.OnTime EarliestTime:=TimeValue("17:00:00"), Procedure:="Test" End Sub Sub Procedure() Range("A1").Interior.ColorIndex = 8 End Sub Sub 時刻の設定2() Application.OnTime EarliestTime:=TimeValue("18:00:00"), Procedure:="Test" End Sub Sub Procedure2() Range("A2").Interior.ColorIndex = 9 End Sub 実行マクロは有効にしています。 ご教授よろしくお願いします。

  • Select Case の条件式

    VBAの初心者です。 家計簿の品目に対して値段を自動で入力したいです。 以下のように、Select Case の条件式の指定方法で、 列に入力された文字列の条件に対して、 自動でとなりのセルに入力したいのですが解らなくて困っております。 Sub TEST() ' A列セルの条件(文字列)でとなりのセルに文字列を入れたい Select Case Range("A1").Value 'A1をどうすればいいのでしょうか。 Case "a": Range("列のセルのとなりに入力したい").Value = "リンゴ" Case "o": Range("列のセルのとなりに入力したい").Value = "オレンジ" Case "b": Range("列のセルのとなりに入力したい").Value = "バナナ" Case Else: Range("列のセルのとなりに入力したい").Value = "error" End Select End Sub ご存じの方がおられましたら教えていただけませんでしょうか。 よろしくお願いします。

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • Excel Select Case で変数を使うと表示されない。

    Sub test1() Dim Fruits As String Dim Iro As String Sheets("Sheet1").Select Fruits = Range("A1").Value Iro = Range("B1").Value Select Case Fruits Case Is = "みかん" Iro = "オレンジ" End Select End Sub とすると、何の反応もありませんが、 Iro = "オレンジ" の箇所を Range("B1") = "オレンジ" とするときちんと表示されます。 なぜ変数ではダメなのでしょうか?

  • VBA コマンドボタンにおけるコードについて

    下記のようなコードを作成しました。 これを簡略化するにはどうすれば良いのでしょうか? よろしくお願いします。 Private Sub CommandButton1_Click() Sheets("sheet2").Select Select Case UserForm1.ComboBox1.Text Case Is = Sheets("sheet2").Range("A1").Value Sheets("sheet2").Range("B1").Value = "X" Case Is = Sheets("sheet2").Range("A2").Value Sheets("sheet2").Range("B2").Value = "X" Case Is = Sheets("sheet2").Range("A3").Value Sheets("sheet2").Range("B3").Value = "X" Case Is = Sheets("sheet2").Range("A4").Value Sheets("sheet2").Range("B4").Value = "X" Case Is = Sheets("sheet2").Range("A5").Value Sheets("sheet2").Range("B5").Value = "X" ・ ・ ・ End Select End Sub

  • エクセルの特定のセルの値が変化したらマクロを自動実行させたい。

    エクセルの特定のセルの値が変化したらマクロを自動実行させたい。 エクセルにてシート1のB5に英数字を入力すると シート2のA列を検索し同じ値があるとその行のB列にある値をH6に表示をします。  【例】   シート1のB5に「A5684」と入力   シート2     A   B   1:A5682 パイン    2:A5683 リンゴ   3:A5684 バナナ   シート1のH6に「バナナ」と表示される シート2のA列にない場合はメッセージボックスで「データがありません」と表示します。 またシート3のA1に数字を入れておき、以下のマクロ、  'Sheet3から印刷すべき連番を獲得します。 Worksheets("Sheet3").Select Range("A1").Select 番号 = ActiveCell 連番 = "A" & Application.WorksheetFunction.Rept("0", 5 - Len(番号)) & 番号  'Sheet3の番号セル「B1」を更新します 番号 = 番号 + 1 ActiveCell.FormulaR1C1 = 番号  'Sheet1のセル「H7」欄に連番を表示します。 Worksheets("シート3").Select Range("B1").Select ActiveCell.FormulaR1C1 = 連番 Worksheets("シート1").Select Range("H6").Select '調べたいセルを記入 If IsError(ActiveCell.Value) Then errval = ActiveCell.Value Select Case errval Case CVErr(xlErrDiv0) MsgBox "#DIV/0! エラー" Case CVErr(xlErrNA) If vbOK = MsgBox(" データがありません") Then Exit Sub End Select End If Sheets("シート1").PrintOut Copies:=1 Range("B5").Select Selection.ClearContents '消去 Range("B5").Select End Sub でシート1のH7に(=シート3!B1)として 印刷ごとに1、2、3、と連番を入れています。 フォームで作成したボタンを押すとH6とH7の値が印刷されます。 そしてB5の値がDeleteされ(よってH6は#N/Aとなる) B5にカーソルが行って入力待ち状態になるようにしてあります。 これで、シート1のB5の値が変化又はH6が変化したら 印刷ボタンを押して印刷ではなく自動印刷されるように出来ますか? Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Column = B And Target.Row = 5 Then を使いましたが 「コンパイルエラー」とか Targetの所が色つきになって「End Sub」が必要です。 となってうまく出来ません。 お願いします。

  • VBA のエラーがわかりません・・・w

    Sub Worksheet_Change(ByVal Target As Range) Dim 初期値 As Integer Dim 増減値 As Integer Select Case Target.Address Case "$C$5" Select Case Target.Value Case 1 Range("C6").Value = 24 Range("D5").Value = 600 Range("D6").Value = 0 Range("E5").Value = 400 Range("E6").Value = 0 Range("B7").Value = "★1 MaxAttackPoint:700 / MaxDeffencePoint:900" Case 2 Range("C6").Value = 32 Range("D5").Value = 1000 Range("D6").Value = 0 Range("E5").Value = 500 Range("E6").Value = 0 Range("B7").Value = "★2 MaxAttackPoint:1100 / MaxDeffencePoint:1300" End Select Case "$D$5" Select Case Range("C5").Value Case 1 初期値 = 600 Case 2 初期値 = 1000 Case Else Exit Sub End Select If Target.Value < 初期値 Then 増減値 = 4 Else 増減値 = 8 Range("D6").Value = (初期値 - Target.Value) / 100 * 増減値 Case "$E$5" Select Case Range("C5").Value Case 1 初期値 = 400 Case 2 初期値 = 500 Case Else Exit Sub End Select If Target.Value < 初期値 Then 増減値 = 4 Else 増減値 = 8 Range("E6").Value = (初期値 - Target.Value) / 200 * 増減値 End Select End Sub Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$F$5" Select Case Target.Value Case "炎" Range("F6").Value = 4 Case "水" Range("F6").Value = 4 End Select   Case "$G$5" Select Case Target.Value Case "ドラゴン" Range("G6").Value = -8 Case "海竜" Range("G6").Value = -8 End Select Case "$H$5" Select Case Target.Value Case "ドラゴン" Range("H6").Value = -16 Case "海竜" Range("H6").Value = -16 End Select Case "$I$5" Select Case Target.Value Case "○" Range("I6").Value = 40 Case "×" Range("I6").Value = 0 End Select End Select End Sub とあるカードゲームのステータス決定を行う為に組まれたマクロです。 作成者は私だけではないのですが、もう何回もしつこく質問をしているため 気が引けてしまい、こちらで質問することにしました・・・w   エラー内容は 2つ目のSub Worksheet_Change(ByVal Target As Range)の 「Worksheet_Change」の名称が間違っています。 という事でした。何を入れればいいのかサッパリです(;´ω)   エラーの改善方法について教えてください。 宜しくお願いします

  • Excelのセルの比較について

    Excelのマクロにてセルの比較を行っています。 A1に"123" A2をハイパーリンクに指定して"123"と表示しています。 表示形式はどちらも通貨で表示しています。 If Range(A1).Value <> Range(A2).Value Then   MsgBox "同じではない" Else   MsgBox "同じ" End If と比較しているのですが"同じではない"が表示されてしまいます。 試しに MsgBox Range(A1).Value と MsgBox Range(A2).Value を表示してみたところ、どちらも"123"と表示されました。 セルに表示されている値で比較するにはどうしたらいいのでしょうか?

専門家に質問してみよう