重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

EXCEL VBA

電力計などのメーターで最大値を超えると0に戻るメーターがありますが、
メーターがゼロに戻った時の計算方法が分かりません。
仮に最大値が1000と考えると1000-993+49=56で計算できますが
最大値を使わない方法はありませんか?
993-49=56
9993-49=56
93-49=56
試に下記のようなコードを作ってみましたが、他の方法はありませんか。
Dim lonStart As Long
Dim lonEnd As Long
Dim lonBuf As Long
Dim lonEndBuf As Long
Dim lonAns As Long

lonStart = 933
lonEnd = 49
lonBuf = 1

Do
If lonEnd < lonStart Then
lonBuf = lonBuf * 10
lonEndBuf = lonBuf + lonEnd
Debug.Print lonBuf & " " & lonEndBuf
If lonStart < lonEndBuf Then
lonAns = lonEndBuf - lonStart
Debug.Print lonAns
Exit Do
End If
End If
Loop

上記は、メーター最大値が無限とか2回まわったとかは無で作りました。

A 回答 (4件)

最大値1000では無くて999ですよね?(999の次は0)


その前提で、StartよりEndが小さかった場合、カウンタが一回転したと考え、Startの値は最大桁(この場合3ケタ)であるとすると、こんな感じでも行けると思います。

rtn = Round(Log(lonStart) / Log(10) + 0.5, 0)
lonAns = lonEnd - lonStart
If lonAns < 0 Then lonAns = lonAns + 10 ^ rtn

まぁ、処理として正しいかと言われると……ですが。
    • good
    • 0

仮に最大値が10^n-1としても、最大値が解るか桁数がわからなければ計算できません。



質問のコードも、最大値が1000としてlonStart=993なら答えはlonAns =56になるが、lonStart=93なら答えは956のはずなのにlonAns =56にしかならないでしょう。最大値が解らないのに適当にlonStartの直近上位10^nを最大値と思って、Do~Loopしているからです。

最大値がわかれば素直に、1000-993+49=56の計算でも、1000000-993+49=999056とでもして有効な桁数を下からとればいい。
    • good
    • 0

んと、前提の式がおかしい。


論理的でないんだな。

>仮に最大値が1000と考えると1000-993+49=56で計算できますが

値は正しい物が返ってくるけど、式の意味が違う。

  1000+49-993=56

数字の並び方が違うだけですが、この式が示す意味を間違えると正しいアルゴリズムにたどり着けません。
まあ、質問者さんならこれを見ただけで気がつくと思うんですけどね。

この回答への補足

ご指摘ありがとうございます。
Do
lonBuf = lonBuf * 10
lonEndBuf = lonBuf + lonEnd
Loop While lonStart > lonEndBuf
lonAns = lonEndBuf - lonStart
改良してコード短くなりましたが、結果的に同じ方法です。
koujikuuさんのコメントにもありますが、1000で割るとその時点で
最大値が分かってしまいます。・・・何か良い求め方があれば
取り入れたいと思います。
単にメンテナンスする必要がないコードを作りたいので考えています。

補足日時:2012/06/03 15:50
    • good
    • 0

表示行数の問題だと思います、表示行数3行なら1000で割った余りを表示すれば?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!