
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件)
- 最新から表示
- 回答順に表示
No.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
まぁ、処理として正しいかと言われると……ですが。
No.3
- 回答日時:
仮に最大値が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とでもして有効な桁数を下からとればいい。
No.2
- 回答日時:
んと、前提の式がおかしい。
論理的でないんだな。
>仮に最大値が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で割るとその時点で
最大値が分かってしまいます。・・・何か良い求め方があれば
取り入れたいと思います。
単にメンテナンスする必要がないコードを作りたいので考えています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA セル間のリンク修正につい...
-
VBAでCOPYを繰り返すと、処理が...
-
vba textboxへの入力について教...
-
複数のExcelファイルをマージす...
-
【マクロ】開いているブックの...
-
VBA ユーザーフォーム ボタンク...
-
Excelのマクロについて教えてく...
-
WindowsのOutlook を VBA から...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
ワードの図形にマクロを登録で...
-
Excelのマクロについて教えてく...
-
VBAの質問(Msgboxについて)です
-
えくせるのVBAコードについて教...
-
[VB.net] ボタン(Flat)のEnable...
-
vbaにてseleniumを使用したedge...
-
Excel 範囲指定スクショについ...
-
ExcelのVBAコードについて教え...
-
【マクロ】並び替えの範囲が、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA セル間のリンク修正につい...
-
VBAでCOPYを繰り返すと、処理が...
-
vba textboxへの入力について教...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
Vba Array関数について教えてく...
-
Vba セルの4辺について罫線が有...
-
【マクロ】開いているブックの...
-
複数のExcelファイルをマージす...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【ExcelVBA】5万行以上のデー...
-
vbsでのwebフォームへの入力制限?
-
[VB.net] ボタン(Flat)のEnable...
-
Excelのマクロについて教えてく...
-
【ExcelVBA】値を変更しながら...
-
改行文字「vbCrLf」とは
-
算術演算子「¥」の意味について
-
VBAでセルの書式を変えずに文字...
-
VBAの「To」という語句について
-
VB.net 文字列から日付型へ変更...
おすすめ情報