次の方法で共有

VBA7.1におけるDateAdd関数について

Anonymous
2014-10-28T02:09:19+00:00

DateAdd関数を使用して、Minute(分)の算出を行っています。

その際、3の倍数となる数値で減算し、結果が0:00:00となるパターンの際に以下のエラーとなります。

 実行時エラー'1004':

 アプリケーション定義またはオブジェクト定義のエラーです。

3の倍数以外の場合は、正常に0:00:00が返ってきます。

検証方法としては、B1セルに0:03:00を入力して、以下のVBAをマクロ実行にて実行しています。

Dim D1 As Date, D2 As Date, mm As Integer

    D1 = Range("B1").Value

    mm = 0 - Minute(D1)

    D2 = DateAdd("n", mm, D1)

    Range("C1") = D2

因みに現象が発生する環境はOffice2013で、VBAのバージョンは7.1です。

Office2010のVBAのバージョンは7.0では、上記の現象は発生せず、正常な値(0:00:00)が返ってきます。

同様の現象の原因、および回避方法等があれば、ご教授願います。

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2014-10-28T03:49:47+00:00

こんにちは。

エラーになるのは、Range("C1") = D2 だと思いますが、どうですか?

小数誤差により、D2が微小なマイナス値になっているのだと思います。

セルではマイナスのシリアル値が設定できませんので、表記のエラーになります。

シリアル値と時刻(時間)表示の変換では、凡そ ±0.5の範囲で丸められます。

0秒ならば -0.5~0.0~+0.5 の範囲が0秒として表現されます。

(5の位置が上へ行くか、下へ行くかは、その時の値により不定のようです)

一旦、時刻文字列を経由(小数誤差をなくして整数化)させれば回避可能です。

Dim D3 As String

D3 = Format(D2 , "h:m:s")

Range("C1").Value = TimeValue(D3)

2進法の小数計算には誤差は付き物。

CPU・OSの演算精度などで結果が変わる事もあるでしょう。

小数の計算(時刻・時間の計算)の際には、

そういう事もあるのだという前提で予め対応しておく必要があるでしょう。

もしくは、時刻・時間データを取り込んだら、

それを秒(整数、2分⇒120秒)に換算し、

計算の中では全て秒(整数)同士で行ない、

最終結果(秒)をシリアル値に変換(秒÷86400)する方法でも対応可能でしょう。

この回答は役に立ちましたか?

0 件のコメント コメントはありません

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2014-10-28T04:53:19+00:00

    AddinBox_Tsunodas様

    早速の回答、ありがとうございます。

    おっしゃる通り、Range("C1") = D2 の箇所でエラーが発生していました。

    ご教授頂きました通り、シリアル値の誤差だったようで、回避方法の通りで解決しました。

    ありがとうございます。本当に助かりました!!

    また、自分の知識不足に恥ずかしいばかりです。

    これを機に、もっと掘り下げて勉強しようと思います。

    本当にありがとうございました。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません