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

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

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

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

受付中

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

quark87139
quark87139

総合スコア6

VBA

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

1回答

0評価

0クリップ

197閲覧

投稿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

Sub 実験データ取込() Dim wb As Workbook Set wb = ThisWorkbook Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = wb.Sheets("実験結果") Set ws2 = wb.Sheets("実験データ") ws2.Rows("2:" & Rows.Count).ClearContents Dim opentxt opentxt = Application.GetOpenFilename("テキストファイル,*.txt") If opentxt = False Then Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Application.Cursor = xlWait Dim r As Long r = ws2.Cells(Rows.Count, "D").End(xlUp).Row + 1 Open opentxt For Input As #1 Dim buf As String Line Input #1, buf Do Until EOF(1) Line Input #1, buf Dim aryLine As Variant aryLine = Split(buf, vbTab) Dim i As Long For i = LBound(aryLine) To UBound(aryLine) ws2.Cells(r, i + 1).Value = aryLine(i) Next r = r + 1 Loop Close #1 '---------------------------------------------------------- '別データがあれば続いて取込 '---------------------------------------------------------- Dim que que = MsgBox("別の実験データを取り込みますか?", vbYesNo + vbQuestion) If que = vbYes Then opentxt = Application.GetOpenFilename("テキストファイル,*.txt") If opentxt = False Then Exit Sub End If r = ws2.Cells(Rows.Count, "D").End(xlUp).Row + 1 Open opentxt For Input As #1 Line Input #1, buf Do Until EOF(1) Line Input #1, buf aryLine = Split(buf, vbTab) For i = LBound(aryLine) To UBound(aryLine) ws2.Cells(r, i + 1).Value = aryLine(i) Next r = r + 1 Loop Close #1 Else MsgBox m & "取込完了" End If Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.Cursor = xlDefault End Sub

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

VBA

With ws .Range("H4:H" & mRow).TextToColumns Comma:=True .Range("I4:I" & mRow).TextToColumns Comma:=True .Range("J4:J" & mRow).TextToColumns Comma:=True .Range("K4:K" & mRow).TextToColumns Comma:=True .Range("L4:L" & mRow).TextToColumns Comma:=True .Range("M4:M" & mRow).TextToColumns Comma:=True . . End with

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

VBA

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

quark87139

2022/01/13 08:58

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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