- ベストアンサー
ACCESSVBAで桁数を調べる方法
- ACCESSVBAを使用して、テキストボックスに入力された数字の桁数を調べる方法について教えてください。
- 入力された数字が11ケタ以上の場合には、『オーバーフロー』のエラーが発生するため、その対処方法も教えてください。
- コード内で使用されている変数や処理内容についても詳しく解説していただけると助かります。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
実験した結果、\演算子とMod演算子に関しては 左右のオペランド(左右の数値)には 4バイトの範囲(Longの範囲と同じく、-2,147,483,648 ~ 2,147,483,647) でないとオーバーフローする模様。 ですので現状のコードでは仕様であるかと思われます。 /演算子であればもう少し大きな値まで扱えるようなので、 下記のように変更すれば14桁まで数えることができるでしょう。 Dim dat As Currency Const Temp As Integer = 10 Dim cnt As Integer dat = CCur("922337203685477") cnt = 0 Do While dat > Temp dat = dat / Temp cnt = cnt + 1 Loop MsgBox (cnt & "桁") これより大きな数値を扱うことなどほぼありませんし、大抵の場合はLongの範囲で事足りるはずです。 これ以上の桁数をもし数えたいのであれば手段を変えろってことです。
その他の回答 (5)
- kenpon24
- ベストアンサー率64% (66/102)
VBA データ型 で検索するといくらでも出てきます。 質問して答えが付くまで待つ必要はどこにもありません。 自分で調べたほうが多くの情報が得られるはずです。 調べた結果、悩むようなことがあれば質問するのがよいかと。 ご自分でどんどん調べてスキルアップしてください。 一応、参考になりそうなページのURLを張っておきます。
お礼
返事大変おそくなり申し訳ありません。 多くのVBAのサイトでサイズ容量の記載がありました。 この度の適切な回答ありがとうございました。
- kenpon24
- ベストアンサー率64% (66/102)
>通貨型にしてもオーバーフローになりました> 変数だけ通貨型にしたのではありませんか? CLngをCCurにしてみてください
補足
はい。以下のように修正したのですが、変わらず『オーバーフロー』になり、 "dat = dat \ 10"の行が黄色く表示されます。 どうしたらいいですか?? Private Sub コマンド2_Click() Dim dat As Currency Dim cnt As Integer dat = CCur(Me!テキスト1) cnt = 0 Do While dat > 0 dat = dat \ 10 cnt = cnt + 1 Loop MsgBox (cnt & "桁") End Sub
- Hayashi_Trek
- ベストアンサー率44% (366/818)
Visual Basic 6.0 の場合(Access Basicも同じ) 長整数型(Long)の範囲は、-2,147,483,648 ~ 2,147,483,647 です。 通貨型(Currency)は、-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 なので通貨型の変数なら14桁(整数部分)まで対応できます。 >今Do while…Loopステートメントの勉強をしていてこの例題がテキストに載ってました。 >データ型変数関数のClngとかCvarでは11桁の出力はできないんでしょうか。 例題なので11桁の数字までは想定していない。 日常生活で11桁の数字を使いますか? 電卓も8桁あれば大抵用が足りる。
補足
はい。通貨型にしてもオーバーフローになりました。 なぜでしょうか?
- kenpon24
- ベストアンサー率64% (66/102)
Len(Me!テキスト0) で文字列の長さを調べることができます。 数字しか入力されないなら、 わざわざ数値に変換するまでもない気がするのですが。
補足
そうですが。 今Do while…Loopステートメントの勉強をしていてこの例題がテキストに載ってました。 データ型変数関数のClngとかCvarでは11桁の出力はできないんでしょうか。
- t_nojiri
- ベストアンサー率28% (595/2071)
バッファオーバーフロー出るんですよね? Longの最大桁超えてるからだと思うんですけど、バリアントとかでまず桁数調べてから数値変換するとか入力規制掛けるとかしないと、バッファあふれますね。
補足
初心者な為分かりやすい回答望みますm(_ _)m
補足
教えていただいたコードを以下のように修正したら、出来ました!! cnt=0 ⇒ cnt=1 Do While dat > Temp ⇒ Do While dat >= Temp >実験した結果、\演算子とMod演算子に関しては >左右のオペランド(左右の数値)には >4バイトの範囲(Longの範囲と同じく、-2,147,483,648 ~ 2,147,483,647) >でないとオーバーフローする模様。 そうなんですね、知りませんでした・・・。 あの・・・、ちなみに『4バイト』の範囲がなぜLong型になるのでしょうか? 計算からですか? よろしければこちらを教えていただければありがたいです。 本当にありがとうございます。