- 締切済み
993-49=56の計算式は?
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回まわったとかは無で作りました。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- mt2008
- ベストアンサー率52% (885/1701)
最大値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 まぁ、処理として正しいかと言われると……ですが。
- okormazd
- ベストアンサー率50% (1224/2412)
仮に最大値が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とでもして有効な桁数を下からとればいい。
- Cupper-2
- ベストアンサー率29% (1342/4565)
んと、前提の式がおかしい。 論理的でないんだな。 >仮に最大値が1000と考えると1000-993+49=56で計算できますが 値は正しい物が返ってくるけど、式の意味が違う。 1000+49-993=56 数字の並び方が違うだけですが、この式が示す意味を間違えると正しいアルゴリズムにたどり着けません。 まあ、質問者さんならこれを見ただけで気がつくと思うんですけどね。
- koujikuu
- ベストアンサー率43% (429/993)
表示行数の問題だと思います、表示行数3行なら1000で割った余りを表示すれば?
補足
ご指摘ありがとうございます。 Do lonBuf = lonBuf * 10 lonEndBuf = lonBuf + lonEnd Loop While lonStart > lonEndBuf lonAns = lonEndBuf - lonStart 改良してコード短くなりましたが、結果的に同じ方法です。 koujikuuさんのコメントにもありますが、1000で割るとその時点で 最大値が分かってしまいます。・・・何か良い求め方があれば 取り入れたいと思います。 単にメンテナンスする必要がないコードを作りたいので考えています。