質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

325閲覧

時間合計が目に見える結果とは異なる原因について(正しくは25:00:00となるが、合計結果では24:59:59と表記される)

quark87139

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/01/13 06:27

編集2022/01/14 04:04

VBA処理で抽出反映した分において、時間の合計が正しく表示されない状況が発生。

問題点:
秒数は必ず0となるにも関わらず、合計するとHH:MM-1:59秒となるところが発生する
(例)本来であれば25:00:00となるところが24:59:59と表示
・全て秒数は00となっていることは確認済
・エクセル上の表示形式[h]:mm

対策点:
【手動】
・区切り位置ウィザードで処理
・F2 + Enter

【VBA】
TextToColumnsmメソッドを利用して、処理

現時点ではTextToColumnsmメソッドにより一時的に問題なく行えているのですが、
1列(対象範囲の列)ずつでしか処理が出来ないため、まとめて処理を行いたいと考えている。またそれまでの過程が間違っているのか、正しく処理行えているのか府に落ちない状況にあるため、ご質問させていただきました。


現時点では以下の3点が原因の一つでは?と考えています。
・テキストデータをVBA経由で取込した時点
・上記CSVデータを別シートリストへ抽出反映した時点
・条件別にCDate()を使って計算を行った分を反映した時点

どなたか有識者の方々、上記の合計すると正しくない時間となる要因・原因または対策点についてご教示頂けないでしょうか。

●テキストデータの取込におけるコード

VBA

1Sub 実験データ取込() 2 3Dim wb As Workbook 4Set wb = ThisWorkbook 5 6Dim ws1 As Worksheet, ws2 As Worksheet 7Set ws1 = wb.Sheets("実験結果") 8Set ws2 = wb.Sheets("実験データ") 9 10ws2.Rows("2:" & Rows.Count).ClearContents 11 12Dim opentxt 13opentxt = Application.GetOpenFilename("テキストファイル,*.txt") 14 15If opentxt = False Then 16 Exit Sub 17End If 18 19Application.ScreenUpdating = False 20Application.Calculation = xlCalculationManual 21Application.EnableEvents = False 22Application.Cursor = xlWait 23 24Dim r As Long 25r = ws2.Cells(Rows.Count, "D").End(xlUp).Row + 1 26 27Open opentxt For Input As #1 28 29Dim buf As String 30 31Line Input #1, buf 32Do Until EOF(1) 33 34Line Input #1, buf 35 36Dim aryLine As Variant 37aryLine = Split(buf, vbTab) 38 39Dim i As Long 40 For i = LBound(aryLine) To UBound(aryLine) 41 ws2.Cells(r, i + 1).Value = aryLine(i) 42 Next 43 44r = r + 1 45 46Loop 47 48Close #1 49 50'---------------------------------------------------------- 51'別データがあれば続いて取込 52'---------------------------------------------------------- 53Dim que 54que = MsgBox("別の実験データを取り込みますか?", vbYesNo + vbQuestion) 55 56 57If que = vbYes Then 58 59opentxt = Application.GetOpenFilename("テキストファイル,*.txt") 60 61If opentxt = False Then 62 Exit Sub 63End If 64 65r = ws2.Cells(Rows.Count, "D").End(xlUp).Row + 1 66 67Open opentxt For Input As #1 68 69Line Input #1, buf 70Do Until EOF(1) 71 72Line Input #1, buf 73 74aryLine = Split(buf, vbTab) 75 76 For i = LBound(aryLine) To UBound(aryLine) 77 ws2.Cells(r, i + 1).Value = aryLine(i) 78 Next 79 80r = r + 1 81 82Loop 83 84Close #1 85 86Else 87 88MsgBox m & "取込完了" 89End If 90 91Application.ScreenUpdating = True 92Application.Calculation = xlCalculationAutomatic 93Application.EnableEvents = True 94Application.Cursor = xlDefault 95 96End Sub

●TextToColumnsmメソッドを利用して対処

VBA

1With ws 2 .Range("H4:H" & mRow).TextToColumns Comma:=True 3 .Range("I4:I" & mRow).TextToColumns Comma:=True 4 .Range("J4:J" & mRow).TextToColumns Comma:=True 5 .Range("K4:K" & mRow).TextToColumns Comma:=True 6 .Range("L4:L" & mRow).TextToColumns Comma:=True 7 .Range("M4:M" & mRow).TextToColumns Comma:=True 8. 9. 10End with

追記:
●CDate(timeserial)を使って計算を行った分を反映する処理

VBA

1 tb = .Range("D4:R" & mRow) 2 ReDim x(1 To UBound(tb), 1 To 2) 3 For i = 1 To UBound(tb) 4 5 '◆判定:合計時間(実験①~③の合計時間が12時間を超えるかどうか 6 If tb(i, 13) > TimeSerial(12, 0, 0) Then 7 8 x(i, 1) = tb(i, 13) - TimeSerial(6, 0, 0) - tb(i, 15) 9 Else 10 x(i, 1) = TimeSerial(0,0,0) 11 12 End If 13 14 '◆判定:合計時間(実験④~⑥の合計時間が12時間を超えるかどうか 15 If tb(i, 14) > TimeSerial(12, 0, 0) Then 16 17 x(i, 2) = tb(i, 14) - TimeSerial(8, 0, 0) - tb(i, 15) 18 Else 19 x(i, 2) = TimeSerial(0,0,0) 20 21 End If 22 23 .Range("S4:T" & mRow) = x

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quark87139

2022/01/13 08:58

.TextToColumns Comma:=Trueの部分へ引数 FieldInfoを追加 追加後 .TextToColumns Range("セル"), xlDelimited, fieldinfo:=Array(1, 1)
guest

回答1

0

・テキストデータをVBA経由で取込した時点
・上記CSVデータを別シートリストへ抽出反映した時点

上記については目視で確認できると思いますが、正しく表示されていますか。

・条件別にCDate()を使って計算を行った分を反映した時点

どのような計算を行っているか不明ですが、この部分が怪しそうです。
CDate()はDate型に変換しますが、Date型は内部的には、倍精度浮動小数点数型(Double)ですので、演算誤差が出る可能性があります。
加減ならDatediff関数を使う、または分単位に変換してから計算する、などの工夫が必要かもしれません。

投稿2022/01/13 08:16

編集2022/01/13 08:17
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quark87139

2022/01/14 03:56

hatena19さん いつもご丁寧にご回答頂きありがとうございます。 指摘受けた件、一通り確認いたしました。 ・テキストデータをVBA経由で取込した時点 ・上記CSVデータを別シートリストへ抽出反映した時点 →確認できる範囲で見ると問題なく表示されています。 次点の・条件別にCDate()を使って計算を行った分を反映した時点 →確認すると、確かにCDate()を利用した計算した分を反映している列のみ正しく表示されてなかったので、 これが原因である可能性は高そうですね・・・。 CDate()の後にTimeserial()の方も使って試したのですが、同じ結果となったので、 指摘受けたようにTimeserial()もCDate()と同様にDate型に変換するものの、 内部的にはDouble型となるため誤差が出ているんですかね? ※計算を行っている部分について、本文へ一部掲載しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問