2022/01/13 08:58 編集
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