• ベストアンサー

EXCEL VBA 比較方法

こんばんは。 EXCEL VBAで、SUM関数で時間の合計を求めたセル(B15)と8:00 を比較して、8:00より大きければメッセージを表示するとしたいのですが、上手くいきません。また、メッセージ後「はい」の場合は、そのままElseの作業を続行。「いいえ」を押した場合は、セル(b2)を選択し、VBA画面が出てくるのを避けたいのです。 勉強途中でいろいろとお聞きし申し訳ありませんがよろしくお願い致します。 IF ~Then ~~~~ ElseIf Range("B15").Value > "8:00" Then MsgBox "8時間を越えています。" Else Range(Range("b65536").End(xlUp).Offset(0), "c22").Copy

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

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

こんにちは。 #2さんの回答への補足について。 > 『セルに時間を代入するときも同様です。』とは > range("a1").value=TimeValue("8:00:00") ←のようなことでしょうか。 そのようなことです。 > 通常に入力した7:00(表示形式を日付)にして、各セルをSumで合計を出したものと > TimeValue("8:00:00") を比較するためにはどうしたらよいのでしょうか。 まず、セルに時刻(日付を含まない時刻だけの値)を入力した際のセルの表示形式は、 「日付」ではなく「時刻」に設定した方が良いかと思います。 「日付」で設定すると日付部分も表示されてしまいますので。 それで、 > 各セルをSumで合計を出したものと > TimeValue("8:00:00") を比較するためにはどうしたらよいのでしょうか。 これは、そのまま比較すれば良いです。 例えば、A7セルに時刻データをSUM関数で合計した値が入っているとして、 IF文で比較する場合は、   If Range("A7").Value > TimeValue("8:00:00") Then      ~~   End If といったような感じになります。 <補足1> #2さんが書かれているように、Excel内部で保持している「日付」や「時刻」のシリアル値は、  ・小数点以下を除いた整数値部分 → 日付単位の値(値=1が1日に相当する)  ・小数点以下の数値         → 時刻単位の値(値=1のときが丁度24時間分となる) となっています。 <補足2> 参考までに、TimeValue関数を使ったサンプルマクロを書いてみました。 Rangeへの値の代入、Rangeの値との比較などの処理を行っています。 宜しければ実験してみて下さい。 ■サンプルマクロ ※標準モジュールへ記述するコードです。 注)インデントのため全角スペースを入れています。   もしも使用する際は、タブなどに一括置換して下さい。 '== TimeValue関数を使用したサンプルマクロ(1) == '  ※RangeにTimeValue()の値をセット ' Public Sub MakeTime()   Dim i As Integer   'A列の表示形式を設定   Columns("A:A").Select   Selection.NumberFormatLocal = "h:mm"  '表示形式=時刻   Range("A1").Select   'A1~A6に時刻をセット(1時間単位で増分)   For i = 1 To 6     Range("A" & i).Value = TimeValue("01:00:00") * i   Next i   'B列の表示形式を設定   Columns("B:B").Select   Selection.NumberFormatLocal = "h:mm"  '表示形式=時刻   Range("B1").Select   'B1~B6に時刻をセット(10分単位で増分)   For i = 1 To 6     Range("B" & i).Value = TimeValue("00:10:00") * i   Next i End Sub '== TimeValue関数を使用したサンプルマクロ(2) == '  ※If文でのRangeの値とTimeValue()の値との比較 '  ※ワークシートのセル上の式として利用可能なユーザー定義関数 '   の形式にしています。 ' Public Function GetHantei(ByVal Rg As Range) As String   If Rg.Value > TimeValue("08:00:00") Then     GetHantei = "8時間を超えています。"   Else     GetHantei = "8時間以内です。"   End If End Function 上記のマクロを使用したExcelワークシートのキャプチャ画像を添付しましたので ご参照下さい。 以上です。参考になれば幸いです。

その他の回答 (2)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

日付や時間のセルは、シリアル値として登録されています。 シリアル値とは、日付の場合は、1900年1月1日からの経過日数、時間の場合は、24時間を1とした数値です。 たとえば、8:00 と表示されているセルは、実際は0.333333という数値が入っています。 このセル値と時間とを比べるには、"8:00" のように文字列と比較するのではなく、#1さんが書いているように、TimeValue("8:00:00") とする必要があります。 ちなみに、セルに時間を代入するときも同様です。

mugigohan
質問者

補足

『セルに時間を代入するときも同様です。』とは range("a1").value=TimeValue("8:00:00") ←のようなことでしょうか。 通常に入力した7:00(表示形式を日付)にして、各セルをSumで合計を出したものと TimeValue("8:00:00") を比較するためにはどうしたらよいのでしょうか。 宜しくお願い致します。

noname#144013
noname#144013
回答No.1

こんにちは。 見当違いでしたらすみません。 以下のようなマクロで如何でしょうか? ご希望の処理と違う部分は、適宣変更して下さい。 注)インデントのため全角スペースを入れています。   もし、ご利用の際はタブなどに一括置換して下さい。 ==================== Sub test1()   Dim dummy As Integer  'ダミー変数   Dim ians As Integer    'MsgBoxの戻り値   Dim iflg As Integer     '範囲コピーフラグ(=1で範囲コピー)   Dim strMsg As String   'MsgBoxのメッセージ文字列   iflg = 0           '範囲コピーフラグを初期化   dummy = 0         '←If文の分岐テストのためのダミー値   If dummy = 1 Then    '←これは仮の判定です。     '~~~~   ElseIf Range("B15").Value > TimeValue("8:00:00") Then     strMsg = "8時間を越えています。" & vbLf     strMsg = strMsg & "処理を続行しますか?"     ians = MsgBox(strMsg, vbYesNo, "処理続行の確認")     If ians = vbYes Then       iflg = 1          '「はい」なら範囲コピーフラグON     Else       Range("B2").Select  '「いいえ」ならB2セルを選択     End If   Else     iflg = 1       'その他の条件なら範囲コピーフラグON   End If   If iflg = 1 Then    '範囲コピーフラグONなら範囲コピー実行     Range(Range("B65536").End(xlUp).Offset(0), "C22").Copy   End If End Sub ====================