現在実験の結果をまとめる集計表を作成しており、
合計ポイントの乖離を出すために日と時、分それぞれの要素取り出して合計ポイントを求めたいものの
DAY関数が正しい数値を抽出できていないため正しい数値が得られません。
※実際のデータから一部抜粋したコード
VBA
1Sub calresult() 2 3Dim wb As Workbook 4Set wb = ThisWorkbook 5Dim ws As Worksheet 6 7Set ws = wb.Sheets(1) 8Dim mRow As Long 9Dim i As Long 10Dim tb, x 11 12mRow = ws.Cells(Rows.Count, "B").End(xlUp).Row '最終行取得 13 14tb = ws.Range("B4:G" & mRow) '配列格納 15 16ReDim x(1 To UBound(tb), 0) '格納配列 17 18For i = 1 To UBound(tb) '要素1-最大要素数 19 20 x(i, 0) = WorksheetFunction.RoundDown(((24 * Day(tb(i, 5) + Hour(tb(i, 5)) * tb(i, 4)) + (Minute(tb(i, 5)) / 60 * tb(i, 5)), 0) 21 22Next i 23 24'▼配列出力 25ws.Range("H4:H" & mRow) = x 26 27End sub
補足①
実験に掛かった合計時間を入力しており24時間以上かかる場合もあるため、
エクセル上の表記形式は[h]:mmとしています。
補足②
小数点以下切り捨て(ROUNDDOWN)で計算を行うため、
①時間*24 * 数値で計算
②DAY・HOUR・MINUTEでそれぞれの要素を取り出して計算
計算方法は固定(指定)されているため後者のやり方を採用した次第です。
※①と②の計算結果に誤差1が生じる場合があることもあるため
参照先:
①https://teratail.com/questions/239127
②https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheetfunction.weeknum
②の参照先より抜粋
Visual Basic for Applications (VBA) では、Excel と異なる方法でシリアル日付が計算されます。
VBA では、シリアル日付値 1 は 1900 年 1 月 1 日ではなく、1899 年 12 月 31 日に該当します。
とあるので、恐らくVBA上の仕様が原因と思われます。
以上のことからVBA上でDAY関数使っての計算は難しいと踏まえているのですが、
エクセル上に直接関数を入力する他対策はありますでしょうか。
追記①
コードだけでは分かりづらいといった指摘を受けております。
そもそもVBA上の仕様が原因だと私の思い込みが原因となります。
実際に自分で読み返したところ、抽出的な書き方で分かりづらい点があり大変申し訳ございません。
取り急ぎ以下実際の処理結果ページと検証結果を以下にて記載します。
「DAY関数が正しい数値を抽出できていないため正しい数値が得られません。」とありますが、
試行時間(F列)から日と時と分の要素を取り出して、固定値と掛けて合計値を抽出するといった処理部分となるのですが、
図にもあるように正しくない計算結果(H列)が反映されています。
※エクセル関数の場合、VBA上と同じ処理で行われているにも関わらず正しい結果が表示
▼正しい処理が行われていないということを踏まえ、
それぞれの要素を変数に格納して確認してみました。
4行目 の試行時間(4:53)の場合
Day(4:53) = 30
Hour(4:53) = 4
Minute(4:53) = 53
※分かりやすいように4:53と表記していますが、実際は配列で格納した分を入れています。
検証結果にもあるように、Day関数のところにおいて
本来であれば24時間以下なので0とするところ、30となっていることが
正しい計算が行われていないことの要因と結論に至りました。
今気づいたのですが、
当初僕が思い込んでいたVBA上の仕様が正しいとすると、
31となるところですが、30となっているので検討違いである可能性が高いかも知れません。
回答3件
あなたの回答
tips
プレビュー