• ベストアンサー

VBAによる時間変換及び時間計算

 勤務表を作成しているのですが、書式変換及び残業計算できません。 (前提) Web勤怠システムの数値をコピー&貼り付けをしてエクセルへ転記しています。なので、書式が文字列になってしまいます。 A1==>19:40 ・・・書式は時刻 A2==>20:02 ・・・書式は文字列 Range("A3") = (TimeValue(Range("A2")) - Range("A1")) / 24 これでは、上手くできません。 他の方法(式)を、教えて下さい。 合わせて、6分未満は切り捨ての式を含めてくれると嬉しいです。

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

  • ベストアンサー
  • Randomize
  • ベストアンサー率70% (38/54)
回答No.3

どのようにうまく行けないかが分からないため正確な回答はできませんが、残業時間を6分単位の時刻形式で取得しようとしているが小数点付きの数字が表示される等して目的の結果を表示できないという風な推測の元、回答いたします。 まず、基本的な部分で >Range("A3") = (TimeValue(Range("A2")) - Range("A1")) / 24 ですが、A3にも日付の書式を与えると正しい結果が表示されます。(分単位ですと書式に"[m]"と指定してみてください) ただ、質問の内容に >合わせて、6分未満は切り捨ての式を含めてくれると嬉しいです。 とあることと、VBAでの回答でいいことから、プログラムを大きく改変させていただきます。 ---------------------------ここから--------------------------- Dim ZangyoMinutes As Integer '分単位の残業時間を格納する変数 Const MinimumTime As Integer = 6 '切り落とす分単位の設定 '差分の時刻を分単位で取り出す(A2>A1の場合に正になる) ZangyoMinutes = DateDiff("n", CDate(Range("A1").Value), CDate(Range("A2").Value)) '求めた分単位の残業時間を6分単位で切り落とす ZangyoMinutes = Int(ZangyoMinutes / MinimumTime) * MinimumTime '代入する前にA3の書式を0:00形式に指定する Range("A3").NumberFormat = "h:mm" 'A3に結果を代入する Range("A3").Value = TimeSerial(0, ZangyoMinutes, 0) ---------------------------ここまで--------------------------- TimeValue関数の変わりにCDate関数を使用しています。基本的な動作は変わりませんが、TimeValue関数がVariant型を返すのに対してCDate関数はDate型を返すのが違いです。 まず、DateDiff関数が2個の時間の差を年・月・日・時・分・秒単位で求められる関数です。"n"が分に相当しますのでこの部分で残業時間を分単位で取得します。 続いて、一定間隔数字ごとに切り落とす式が Int([元の数字]/[間隔])*[間隔] になります。 あとは、表示したい方法でセルに表示をするわけですが、分のままでしたらそのまま Range("A3").Value = ZangyoMinutes でもいいですし、Excelの時刻の形式にしたいのであればTimeSerial関数を使用する感じですね。 TimeSerial([時],[分],[秒]) 時・分・秒の3個は共に省略不可ですが、59を超えた数字を入れた場合は次の桁を繰り上げてくれるので何かと便利な関数です。 最後に、代入する前に書式を設定し、設定が終わったら値を代入すると完成です。(必ず書式設定を先に行ってください) 最後に .Value .NumberFormatなどプロパティーはきちんと明示しましょう。

25630
質問者

お礼

回答有難うございます。また、親切に式の説明してくれて大変有難く思っています。 おかげさまで、思い通りになりました。 大変勉強になり、有難う御座いました。

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

その他の回答 (4)

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

こんばんは。 すでに、回答は出ていますが、「書式は文字列」というのは、そこを参照するセルも文字列にしてしまうので、EXCELでは、単独で使うセルのみであって、書式に、A1が、時刻設定で、A2が、文字列設定というのはまったくうまくないです。マクロ以前の問題です。だから、書式をマクロで直します。 なお、TimeValue を使うなら、Rangeオブジェクトのプロパティは、.Text プロパティですね。 '------------------------------------------- Sub MacroTest1()   Dim t1 As Date   Dim t2 As Date   Dim t3 As Date   Dim t4 As Date   Dim dif As Long      t1 = Range("A1").Value   t2 = Range("A2").Value   If t2 >= t1 Then     t3 = t2 - t1     Range("A1:A3").NumberFormat = "h:mm" '書式を直す     dif = Minute(t3) Mod 6     t4 = TimeSerial(Hour(t3), Minute(t3) - dif, 0)     Range("A3").Value = t4   End If End Sub '-------------------------------------------

25630
質問者

お礼

わざわざ回答有難うございます。 参考資料として、使いたいと思います。 有難う御座いました。

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

25630さん 今晩は! ■Excel(エクセル)関数の技:時刻・時間の計算に関する技↓ http://www.eurus.dti.ne.jp/~yoneyama/Excel/waza/jikan01.html 内容:1.時刻/時間のシリアル値・2.時刻/時間の計算・3.時刻/時間の丸め処理・4.シリアル値を数値に直す・5.時刻/時間の比較・6.数値を時刻/時間に変換する などの解説がされています。 ■Excel(エクセル)実用編:時給計算書の作成例↓ http://www.eurus.dti.ne.jp/~yoneyama/Excel/jituyou/jikyu.htm 内容:1.完成例・2.基本数値の入力・3.勤務時間の計算・4.支払時間の計算・5.支給額の計算・6.日付・7.時刻/時間の基本的な計算方法などは別ページで説明しています。 完成例はサンプルファイル(jikyu-01.zip 約20KB)のダウンロードが出来ます。 ■Excel(エクセル)講座 Q&A(Tips):時刻・時間関連↓ http://www.eurus.dti.ne.jp/~yoneyama/Excel/ex-q-a/q_jikoku.html 内容:1.時刻の計算→勤務時間の計算を例として説明します。 2.時刻のシリアル値→時刻のシリアル値は、0~0.99999999の範囲にある値で、0:00:00(午前0時)から 23:59:59 (午後11時59分59秒)までの時刻を表します。 3.勤務時間の計算→パートの人の勤務時間計算で、定時が 9:00~17:00となっている場合の計算方法を考えてみましょう。 上記の時間変換の基本関数を確実に身につけましょう。 回答者のRandomizeさんが親切にノウハウを回答されていますが、プログラムはノウハウの集まりですし同じ結果でも違うコードの書き方が異なります。

25630
質問者

お礼

回答有難うございます。 VBA不使用の時は、参考にさせて頂きます。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

こういうことでしょうか? Sub test1() Dim tv As Variant tv = TimeValue(Range("A2")) - Range("A1") Range("A3") = (Hour(tv) + Minute(tv) / 60) / 24 End Sub >合わせて、6分未満は切り捨ての式を・・・ 下記でどうでしょうか? Sub test2() Dim tv As Variant tv = TimeValue(Range("A2")) - Range("A1") If Minute(tv) < 6 Then Range("A3") = (Hour(tv)) / 24 Else Range("A3") = (Hour(tv) + Minute(tv) / 60) / 24 End If End Sub

25630
質問者

お礼

回答有難うございます。 検証して見ましたが、 答えが0.3にしたいのですが、0.015…になってしまいました。 色々とこちらで試しても出来なかったのですが、他の方の参考等を試したら出来ました。 参考式は、今後に活かしたいと思います。 有難う御座いました。

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

VBAに取り組む前に数式をよく理解する必要がありますね。 お示しの式ですとA1セルには>19:40とA2せるには>20:02と入力されているように見られますが、それでしたら両セルとも文字列になっているはずですね。時刻では>の入った形では存在しませんね。 ところで仮にそのような>の入った形で入力されているとしたら、それらを用いて式をたてるなどできないはずです。 A3への入力の式は次のようにしてセルの表示形式で時刻にすればよいでしょう。 =SUBSTITUTE(A2,">","")*1-SUBSTITUTE(A1,">","")*1

25630
質問者

お礼

回答有難うございます。 >は、矢印のつもりでしたが、 最後の式は、別の場所で参考にさせて頂きたいと思います。 有難う御座いました。

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

関連するQ&A

  • エクセル2007で時間を足したり引いたりできます?

    エクセル2007を使っている者です。 A1、A2のセルに文字列でそれぞれ3時間45分、1時間30分と入っていたとして、その2つを足したり、引いたりすることはできますか? TIMEVALUE関数で文字列を時刻に直した後でセルの書式設定で時刻表示にすればできるというようなことが書いてあるページがあったのでそれをやろうとしたのですが、うまくいきませんでした。 まずA1のセルを時間に直そうとして「=TIMEVALUE(A1)」と入れたのですが、#VALUEとのエラーが出てしまいます。 どなたかお願いいたします。

  • タイムカードから就業時間計算

    Excel2000でタイムカードの出勤・退出時刻を入力して、就業時間を出そうとしています。 定時は8:30~17:15、休憩は12:00~12:50、14:50~15:00、17:15~17:30です。 http://www.h3.dion.ne.jp/~sakatsu/WorkingTimeCalc.htm ↑このサイトを参考に、 A列に出勤時刻(手入力)、 B列に退出時刻(手入力)、 C列に24時補正、 =IF(OR(A2="",B2=""),"",IF(A2<B2,B2,B2+1)) D列に深夜1(0:00~8:30)、 =IF(OR(A2="",C2=""),"",IF(AND(A2<TIMEVALUE("8:30"),C2>=TIMEVALUE("0:00")),MIN(C2,TIMEVALUE("8:30"))-MAX(A2,TIMEVALUE("0:00")),0)) E列に午前(8:30~12:00)、 =IF(OR(A2="",C2=""),"",IF(AND(A2<TIMEVALUE("12:00"),C2>=TIMEVALUE("8:30")),MIN(C2,TIMEVALUE("12:00"))-MAX(A2,TIMEVALUE("8:30")),0)) …の要領で、F列に午後1(12:50~14:50)、G列に午後2(15:00~17:15)、H列に夜(17:30~24:00)の式をそれぞれ入力し、I列でD~H列を合計しています。=SUM(D2:H2) このうち午前・午後1・午後2は正確に表示されるのですが、深夜・夜が0:00のままで表示されません。(退出を夜or深夜にしても0:00のままです) 午前・午後と同じような式を使っているのにどうしてなのでしょうか。どうすれば正確に出るのでしょうか。 セルの書式設定はユーザー定義で[h]:mmにしています。 今日午後から連休明けまではここを覗けないのでお礼ができませんが、よろしくお願いします。

  • 時刻の計算結果を15分未満で切り捨てたい、他

    勤怠簿を作っています。以前に↓にて質問させていただきました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1652568 質問した結果、無事「深夜」「夜」の時間が出るようになりました。 そこで新たに質問が2つあります。 (1)今度はこの「深夜」「夜」の計算結果を15分未満切捨てにしたいのですが、どうすればいいのでしょうか。 「午前」「午後1」「午後2」は15分未満切捨てができています。この式を元に自分でも格闘してみたいのですが、できませんでした。。。 ちなみに「深夜」の式は =IF(OR(B2="",D2=""),"",IF(OR(B2<TIMEVALUE("8:30"),D2>=1),TIMEVALUE("8:30")-MIN(B2,TIMEVALUE("8:30"))+MAX(D2,1)-1,0)) 「夜」は =IF(OR(B2="",D2=""),"",IF(AND(B2<1,D2>=TIMEVALUE("17:30")),MIN(D2,1)-MAX(B2,TIMEVALUE("17:30")),0)) になっています。 (2)出勤が8:15以前の場合に早出としてカウントしないようにするには、どうすればいいでしょうか。 よろしくおねがいします。。。

  • エクセルで残業時間を分数表示する計算式は??

    日毎の残業時間を小数点で表すにはどういう式を入れればいいのでしょうか。 条件は、30分未満は切り捨てです。   残業時間→表示 月 3:29→3.0 火 3:30→3.5 水 3:59→3.5 木 3:00→3.0

  • 24時間以上の表示

    いつもお世話になります。 Excelで勤務実働時間の変換作業を行ってます。 元のデータは"文字列"で表示されてて、"=TIMEVALUE(A1)"を使って 12:1 → 12:01 と表示させてます。 そこで質問ですが、"24:1"以上の場合ですが、"TIMEVALUE"を使うと当然"00:01"に表示されるので、 =IF(TEXT(LEFT(A1,2),"#,###")>="24",TIMEVALUE(A1)+"24:00" と数式を入れました。続いて、同じ様に"IF"を並べて">=96"、">=72"、">=48"と作ったのですが、今度は"100:00"以上の場合です。同じく =IF(TEXT(LEFT(A1,3),"#,###")>="120",TIMEVALUE(A1)+"120:00",IF(TEXT(LEFT(A1,3),"#,###")>="100",TIMEVALUE(A1)+"96:00"を追加してみたのですが、そうすると今度は "100:1"以上はうまく表示できたのですが"36:1"以上"99:59"いかが正しく表示されなくなりました。中身を確認すると"=TEXT"表示に問題があるようです。 長々と説明させていただきましたが、ようするに、3桁~6桁の文字列表示の時刻を"TIMEVALUE"に表示させ、それを元に関数を使ってまた別の計算式を作りたいのです。 解りにくい内容ですみませんがよろしくお願いします。

  • TIMEVALUEと"時刻"の違いを知りたいです

    エクセルで残業時間を計算しています。    A     B     1 退社時間 残業時間   2  20:00   ? という表があり退社時間が 18:00を過ぎた場合→残業時間を求める 18:00を超えない場合→0を表示させる というようになっています。 実は既に関数は組まれており =IF(A2>TIMEVALUE("18:00"),A2-"18:00",0) という関数がB2には入っています。 そこで質問なのですが このIF関数中の論理式 「A2>TIMEVALUE("18:00")」の意味は分かるのですが、 真の場合は「A2-"18:00"」なぜこれだけで答えがでるのでしょうか? 17:30を""で囲むだけでシリアル値に戻してくれるのでしょうか? だったら、論理式の「A2>TIMEVALUE("18:00")」中にTIMEVALUEは いらないのではないでしょうか? と思い、論理式のTIMEVALUEを「A2>"18:00"」に置き換えてみたのですが答えはでませんでした・・・ 「TIMEVALUE」と「時刻をダブルクォーテーションで囲む」 違いを教えてください。

  • 時間の計算が分かりません

    時間の計算で、B列にいれる式が全く分からなくて困っています。 A列が 空白だったら”空白” 7:30以下だったら”空白” 8:00以上だったら”0:30” 7:31~7:59の間だったら"7:30を超えた0:30未満 =IFS(A1="","",A1<="7:30","",A1>="8:00","0:30"にANDやMAXなどを組み合わせてみたのですが出来ません。 教えてください。 宜しくお願い致します。

  • エクセル 時間の合成

    インターバル = TimeValue("00:50:00") 早速ですが インターバル = TimeValue("00:50:00") Debug.Print Now + インターバル これは エラーになりません。 しかし If Format(Now, "hh:mm:ss") < Format("3:00:00", "hh:mm:ss") Then 終了時刻 = Format(Now, "yyyy/mm/dd") & " " & TimeValue("3:02:00") Else 終了時刻 = Format(DateAdd("d", 1, Now), "yyyy/mm/dd") & " " & TimeValue("3:02:00") End If Debug.Print 終了時刻 + インターバル これは、型が合わないエラーです。 終了時刻は 文字列的に合成されただけ・・・だろうと 推察するのですが では、「終了時刻 + インターバル」 が 可能な終了時刻は どうして 作ればいいのでしょうか?

  • セルの書式が標準なのに文字列にできるのはなぜ?

    会社のシステムで吐き出したデータですが セルの書式設定が標準なのに文字列となっています。 マクロを利用して、あるセルの値を別セルへ転記すると、 数字は数値に変換され、先頭の0は消え、桁数が多いと指数表示になってしまいます。 会社のシステムが吐き出したエクセルはセルの書式が標準なのに 中の数字が文字列でいられるのが疑問です。 会社のシステムの吐き出したデータは Microsoft Excel 2.1ワークシートで 全てのセルの書式設定は「標準」です。 で例えば 12345678901234 は 12345678901234 と表示されていて 「数値が文字列として保存されています」 となっています。(先頭に ' は入っていません) 0101という値のセルでも 表示は0101ですが 「数値が文字列として保存されています」 となっています。(先頭に ' は入っていません) それらのセルの値をマクロとかで別セルに転記すると 転記先では1.23457E+13 と表示されてしまいます。 (0101は101になります。) まっさらなエクセルに自分で手入力すると ・セルの書式設定が標準だと 12345678901234 ↓ 1.23457E+13になります。 ・セルの書式設定が数値だと 12345678901234 ↓ 12345678901234 ・セルの書式設定が文字列だと 12345678901234 ↓ 12345678901234 (ただし 数値が文字列と保存されています と注釈有) なのに会社のシステムの吐き出しデータは セルの書式設定が標準なのにもかかわらず 12345678901234 ↓ 12345678901234 (ただし 数値が文字列と保存されています と注釈有) となっています。 手入力で書式設定が標準の状態でセルに12345678901234 と表示させるには先頭に ' をつける方法しか知りませんが ' が無いのに表示されています。 でもこの該当セルをマクロで別セル(書式設定:標準)に転記すると 1.23457E+13 となります。 またシステムが吐き出したエクセルの同じシート内に 以下のマクロで転記すると ↓ Sub 転記() 行 = 2 Do If Cells(行, 6).Value = "" Then Exit Do If Cells(行, 6).Value >= 10 Then Cells(行, 7).Value = Range("A2") Else Cells(行, 7).Value = Range("A3") End If 行 = 行 + 1 Loop End Sub ↓ このマクロだと A列~F列が書式設定が標準なのに文字列として表示されているのですが 転記先のG列が書式設定が標準であっても 12345678901234 (数値が文字列と保存されています と注釈有) と同じ状態のまま転記できます。 新しいBOOKのシート2に 会社の吐き出しデータをシートコピーした後、 (セルの書式設定:標準だが文字列で表示されている) そのBOOKに登録されているマクロで シート2のセルからシート1のセル(書式設定:標準)に転記すると 数字は数値に変換され、先頭の0は消え、桁数が多いと指数表示 となってしまいます。 ちょっと混乱しています。 理屈等教えていただければと思います。お願いします。

  • VBAの記述方法について

    罫線や色がつけられたコピー先のエクセルファイルに値だけ貼り付けて、データを転記しようと考えています。 .Worksheets(1).Range("B2:B145").Copy xBk.Worksheets(1).Range("C5").xlPasteValuesのような式をかきまし たが、貼り付け先では、値だけコピーされず、罫線や色の情報が失われてしまします。 値のみを転記し、罫線や色、フォントの情報を残すには、どのようにコピー文を書き換えればよろしいでしょうか。 お手数をおかけいたしますが、よろしくお願いいたします。

専門家に質問してみよう