• 締切済み

エクセルVBAの時間計算

Excel2000を使用しています. VBAで時間計算をしていまうが、日をまたぐ時間計算がうまくいきません. 例 dim a as date  ’入室時間 dim b sa date   ’退室時間 dim x as date  ’滞在時間 x= b - a で aが23:00 bが25:30 だと xが2:30 になりません. 日付データはありませんので、時間だけで計算したいのです.

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

>日付データはありませんので、時間だけで計算したいのです. これは乱暴なはなしですよね。翌々日の場合とか、朝8時に入室し、9時に退室する場合と、翌日あさ9時に退室する場合が区別できない。午前4時で全員退室の仮定をおき、0-4時は24時間足した時間から引き算するとかどうですか。 25:30と入れる(表現する)のも、一般になじみがないのでは。 エクセルVBAはセルの値を主に計算しますので、エクセルの時刻の表し方、扱い方にあわせて、VBAコードを組み立てないとしょうがないでしょう。 B11に23:30 B12に25:30:00 の場合 例えば25時30分はセルの値では、1.062500 になるから Sub test02() Range("B15") = Range("B12") - Range("B11") End Sub B15の値は0.083333333 時刻表示では=B15*24の2 のように考える。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.4

元のデータはどこに入力されているのでしょうか? VBAでは24時を越える時刻は許容されませんが ワークシート上なら25:30というのもOKです 内部的には翌日の1:30として格納されます

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 それは、代入値の入れ方の問題ですね。 なるべく、セルから入力して、それをDate型にしないで、Double型で扱うとうまくいくはずです。ただ、この場合、最初から、Rangeオブジェクトのプロパティを、Value2 にすると、楽に出来ます。 VBAで、日付や時間を、そのまま、Date型の変数に文字列代入というのは、ある程度の経験のある人ならしないはずです。コーディングだけだったら、日付型のリテラル値を使いますが、それも、今回は使えません。 それで、やむを得ず、Excelに備えられている Evaluate関数を使用してみました。VBなら、おそらく、一旦、「:」を区切り文字にして、時間と分を分離して行うことになるかと思います。最後まで、その解は、VBAの中では、中途半端な形のままで、文字列としてしか扱うことが出来ないように思います。出来れば、ワークシートの中で行ったほうがよいです。VBA上だけですと、これは、なかなか、難しい内容ですね。 ---------------------------------------------------------- Sub HoursColculate()   Dim input1 As String 'テキストボックスなどから   Dim input2 As String ' ""   '   Dim a As Double '入室時間   Dim b As Double '退室時間   Dim x As Double '滞在時間   '   Dim d As String      input1 = "23:00" '代入値   input2 = "25:30" '代入値      If IsDate(input1) Then     a = CDate(input1)   Else     a = Evaluate("=" & "(""" & input2 & """)*1")   End If   If IsDate(input2) Then     b = input2   Else     b = Evaluate("=" & "(""" & input2 & """)*1")   End If      If b >= a Then     x = b - a   Else     MsgBox "マイナスの計算できません": Exit Sub   'ただし、ここは、Abs にしても良い。   End If      If x < 1 Then     d = Format$(CDate(x), "hh:mm")   Else     d = CStr(Int(x * 24)) & ":" & Format$((x - Int(x * 24)) * 60, "00")     'ここの行で、文字列によって端数が切り捨てになっています。   End If      MsgBox d End Sub

  • taka0028
  • ベストアンサー率33% (19/57)
回答No.2

#1の方のとおり日付をつけないとコンパイルエラーになりますね 23:59:59を超える場合には日付を+1して演算すればうまくいきます Dim a As Date '入室時間 Dim b As Date '退室時間 Dim x As Date '滞在時間 a = "1900/1/1 23:00" b = "1900/1/2 2:30" x = b - a

回答No.1

エクセルでの時間計算は、すべての時間を数値に置き換えて計算されます。 で、25:30というのは、24時間を超えているので翌日の01:30を表すことにはならないと思います。日付もつけて時間計算すればうまくいくと思います。

関連するQ&A

  • エクセルVBAでの時間計算方法

    エクセル2000のVBAで時間の計算をしていますが、0:00を超えたデータの計算がうまくいきません. 例えば dim a as date 開始時間 dim b as date 終了時間 dim xas date 使用時間 x = b - a 例えば 終了時間(25:10:00)ー開始時間(23:15:00)の場合,終了時間が1:10:00になっているようなのですが、24:00以降セットする方法はありますか? 他にVBAを使用してなにか簡単な方法がありますか?

  • Excel VBAの非表示について(初心者)

    Excel VBAを勉強中の者です。 A列に日付が連続で入っている表で、A1に入力されている一番古い日付から 昨日の日付までを非表示にし、今日の日付を先頭に表示したいと思っています。 Findメソッドで昨日の日付が入っているセルを検索し、A1セルから昨日のセルまでを 非表示にしようと思い下記のようにしてみたのですができませんでした。 Dim i As Range Dim x As Byte Dim y As Byte Set i = Range("A1:A65536").Find(What:=Date-1) x = i.Row Rows("1:x").Hidden = True または x = i.Address Range("A1:x").EntireRow.Select Selection.Hidden = True 教えてください。 よろしくお願いします。

  • VBA での日付の計算

    お世話になってます。 Access VBA 初心者です。 string型変数に日付(YYYYMMDD)がセットされています。 その日付に1日プラスした日付を算出したいのですが、 どうすればよいのかよく分かりません。 たとえば Dim w_Date As String w_Date = "20070726" としたならば、 w_Dateは"20070727"となるようにしたいのですが。。。 よろしくお願いいたします。

  • VBAでの年齢計算がうまくいきません。

    失礼いたします。  VBAで年齢の計算を行いたいのですがなかなかうまくいきません。 =sub Dim 開始日付 As String Dim 終了日付 As String Dim 年齢 As String 開始日付 = "S54/4/1" 終了日付 = "H22/4/1" 年齢 = "=DATEDIF(開始日付,終了日付,""Y"")" =endsub としても、DATEDIF関数は引数をうまく処理してくれないのです。 エクセル関数を使わずに、年齢を算出するか。 エクセル関数内に引数を代入する方法があれば教えていただけないでしょうか?

  • エクセルVBAのエラー

    よろしくお願いします。 VBA初心者のものです。 下記のコードを作成しましたが、 アプリケーション定義?がされていません というエラーが出ます。 わかりやすく教えていただけないでしょうか。 修正方法を教えてください。 0901名簿.xlsという名前の ファイルAのsheet1の 情報(ファイルBのセルBD1に日付4桁が記入されている)を ファイルBのセルA1の情報を元にファイルBのセルB1に抽出したい Sub 関数の挿入() Dim i As Long Dim あ As String Dim い As String Dim う As String あ="=VLOOKUP(A1,[" い=Range("BD1") う="名簿.xls]Sheet1!$F:$I,1,0)" For i = 2 To 50 Range("A" & i )= あ & い & う Next i End Sub

  • 日付に関するSQL分で

    wonddows2000,Access2000 VBAで勤怠管理をしたいのですが日付に関するSQL分でDATEDIFFの使い方が今ひとつわかりません。 SELECT * ,DATEDIFF(day,入室日,退室日)  FROM TABLE WHERE 部署コード=700  WHERE後部分はどう表現したらいいでしょうか。 検査条件(1) 入室日(YYYY/MM/DD)=退室日(YYYY/MM/DD) 且つ入室時間(hh:mm:ss)が09:00:00より後且つ 入室日(YYYY/MM/DD)=退室日(YYYY/MM/DD)+1 且つ退室時間(hh:mm:ss)が09:00:00より前且つ 部署コードが700に対応するテーブルの全データを出力 検査条件(2)上記以外の全データ TABLE (文字型)  (文字型) (日付型) (日付型) (日付型) (日付型) 部署コード | 氏名  | 入室日  |入室時間 | 退室日  | 退室時間 | 1000 A 2000/12/01 8:16:30 2000/12/01 18:10:20 2000 B 2000/12/02 8:16:30 2000/12/03 8:10:20 700 C 2000/12/03 9:16:30 2000/12/03 18:10:20 3000 A 2000/12/04 8:16:30 2000/12/01 18:10:20 700 D 2000/12/04 8:16:30 2000/12/05 8:10:20 700 E 2000/12/04 8:16:30 2000/12/04 18:10:20 結果(1) 700 C 2000/12/03 9:16:30 2000/12/03 18:10:20 700 D 2000/12/04 8:16:30 2000/12/05 8:10:20 結果(2) 1000 A 2000/12/01 8:16:30 2000/12/01 18:10:20 2000 B 2000/12/02 8:16:30 2000/12/03 8:10:20 3000 A 2000/12/04 8:16:30 2000/12/01 18:10:20 700 E 2000/12/04 8:16:30 2000/12/04 18:10:20

  • Excel 2010 VBAで教えてください。

    Excel 2010 VBAで教えてください。 Doubleの配列 Dim A(100) as double に ワークシート "Sheet1" セル A1:A100 の値を一発(For loop等を利用しない) で読み込むにはどうすればよいのでしょうか。 同じく、 Doubleの配列 A(100)を ワークシート "Sheet2" セル B1:B100 に一発で書き出すのはどうすればよいのでしょうか。  Variantにて Dim A as Variant では  A = Sheets("Sheet1").Range("A1:A100") で 読み込めました。 また Sheets("Sheet2").Range("B1:B100")で書き込みできましたが、double等でどうすれば良いのか知りたいです。

  • ExcelVBAで年齢計算

    VBAで年齢計算をしたいのですが、「型が一致しない」と怒られます。 A列に誕生日が入っており、B列に年齢が入るようにしたいです。 Sub old() For i = 2 To Cells(2, 1).End(xlDown).Row Dim t As Date Dim b As Date t = Date b = Cells(i, 1) y = DateDiff(b, t, "y") Cells(i, 2) = y Next End Sub どこかおかしいところはありますでしょうか? 教えてください!

  • SQLで時間差分とその合計の求め方

    VB2010とACCESS2007にて管理区域の入退室管理をしています データは以下のような感じになります。 職員名   入室時間   退室時間 A       8:30       10:00 B       8:40       9:00 A       11:00       11:30 C       13:00       16:00 と言ったデータを 職員ごとの入室している時間を計算したいと思っています。 「結果」 A       2:00 B       0:20 C       3:00 色々調べたのですがSQLの『DATEDIFF』ではひとつのデータしか計算できないようなのですが、 いい方法があるでしょうか? よろしくお願いします

  • VBAでわからなくなってしまったので質問します。

    VBAでわからなくなってしまったので質問します。 初心者なのですが、下記の問題にあたってしまい困っています。 製品Aと製品B~xまでEXCEL2007で表を作ってあります。 A~xまで同じVBA構文を使っていますが、 Aは名前を付けて保存すると 製品名A2456【0506】と製品名+コード番号+年月になります。 しかし、B~xは製品名B~Xのみがファイル名になってしまいます。 構文A~xともRangeの参照以外共通で下記です。 Sub 最終保存() Dim wSeq As String Dim wStr As String Dim Flnm As String Dim wFlnm As String ' Flnm = "C:\Documents and Settings\user\My Documents\受検ファイル\受検済み\" '←保存先フォルダ Flnm = Flnm & Range("B11") & Range("G20") & Format(Range("B6"), "【mmdd】") '←保存ファイル名 Flnm = Application.GetSaveAsFilename(InitialFileName:=Flnm, _ filefilter:="Excel ファイル (*.xlsx), *.xlsx", Title:="名前を付けて保存") If Flnm = "False" Then Exit Sub End If ' wSeq = 0 ExitFlg = False wFlnm = Flnm Do While ExitFlg = False If Dir(Flnm) <> "" Then '存在したら、連番を加算 wSeq = wSeq + 1 wStr = "(" & wSeq & ")" Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xlsx" Else '存在しない時、保存 ActiveWorkbook.SaveAs Filename:=Flnm, FileFormat:=xlOpenXMLWorkbook ExitFlg = True End If Loop End Sub Rangeの「B11」が製品名、「G20」がコード番号、「B6」が2010年5月○日という日付になっています。 なお、最初のRange("B11")を取り除くとコード+日付がファイル名になります。 なぜ、製品Aは出来てB~xが出来ないのか分かりません。 アドバイスお願いします。

専門家に質問してみよう