質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

1393閲覧

オーバーフローの原因は特定できたものの、対策が思い浮かばないため皆さんの意見を聞きたいです

nakagen

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

1グッド

1クリップ

投稿2023/10/31 01:28

実現したいこと

VBAにて、オーバーフローの原因とデータ型の仕組みを知りたい

前提

VBAの練習サイトを見ながら、自分でコードを記述するのをやっておりました。
その中で、二点の疑問が生じました。
・自身の記述したコードの「客単価 = 売上 / 客数」において、客単価はどのようなデータ型適しているのか?
・練習サイトに記載してある回答のコードだと問題なく実行されるのは何故か?
です(詳細は以下に記載しております)。どなたか回答してくださると助かります。

発生している問題・エラーメッセージ

オーバーフローしました。

該当のソースコード

自身が作ったコードをデバックしたところ、 「客単価 = 売上 / 客数」に問題があり、客単価のデータ型が間違えているのではと考えています。この場合、どのようなデータ型が一番適しているのでしょうか・・・?

Option Explicit Sub 客単価() Dim 売上 As Long Dim 客数 As Long Dim 客単価 As Long Dim i As Long For i = 1 To 10 Cells(i + 1, 2).Value = 売上 Cells(i + 1, 3).Value = 客数 客単価 = 売上 / 客数 Cells(i + 1, 4).Value = 客単価 Next End Sub

下記の練習サイトの回答を実行したところ、問題なく実行されました。
計算結果は、どのようなデータ型で表されているのでしょうか・・・?

Sub 練習問題1()   Dim i As Long   For i = 2 To 11     Cells(i, 4).Value = Cells(i, 2).Value / Cells(i, 3).Value   Next End Sub

試したこと

デバッグ、データ型の検索

補足情報(FW/ツールのバージョンなど)

こちらが練習サイトとなっており、練習1の問題です。
https://excel-ubara.com/excelvba9/EXCELVBA601.html

YellowGreenを押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2023/10/31 01:58

Cells(i + 1, 2).Value = 売上 の意図はなんですか。
YellowGreen

2023/10/31 02:34 編集

変数への値の代入は、変数 = 値(value) と書きます。 売上も客数も 客単価 = 売上 / 客数 と同じように左辺に書いて代入します。
nakagen

2023/10/31 07:29

変数への値の代入のコードは、自身の記述ミスです。 正しくは、「売上 = cells(i+1,2).value」です。 yellowgreenさんありがとうございます。
nakagen

2023/10/31 08:01

解決いたしました、どの回答もベストアンサーにしたかったのですが、シンプルなコードを書いてくださったotnさんをベストアンサーにしました。皆さん、ありがとうございました。
guest

回答3

0

vba

1Dim 売上 As Long 2Dim 客数 As Long

vba

1Cells(i + 1, 2).Value = 売上
  • 上記は「 i + 1 行目の 2 列目のセル」、変数売上の値(この時点では初期値の 0 のまま)代入するステートメントである。売上にセルの値を代入するステートメントではない。

vba

1Cells(i + 1, 3).Value = 客数
  • 上記は「 i + 1 行目の 3 列目のセル」、変数客数の値(この時点では初期値の 0 のまま)代入するステートメントである。客数にセルの値を代入するステートメントではない。

vba

1客単価 = 売上 / 客数
  • この時点での変数売上と変数客数の値は共に 0 である。

  • この時、 / 演算子によって 0 を 0 で割ろうとしているため、オーバーフローエラーが発生する(被除数が 0 ではなく、かつ除数が 0 であれば 0 除算エラーとなる)。

修正例

vba

1'プロシージャ名とプロシージャレベルの変数名を同じにしない 2Sub 客単価計算() 3 4 Dim 売上 As Long 5 Dim 客数 As Long 6 Dim 客単価 As Variant 7 Dim i As Long 8 9 For i = 1 To 10 10 If IsNumeric(Cells(i + 1, 2).Value) Then 11 売上 = Cells(i + 1, 2).Value 12 Else 13 売上 = 0 14 End If 15 If IsNumeric(Cells(i + 1, 3).Value) Then 16 客数 = Cells(i + 1, 3).Value 17 Else 18 客数 = 0 19 End If 20 If 客数 = 0 Then 21 客単価 = Empty 22 Else 23 客単価 = 売上 / 客数 24 End If 25 Cells(i + 1, 4).Value = 客単価 26 Next 27 28End Sub

投稿2023/10/31 03:07

編集2023/10/31 03:09
sk.exe

総合スコア1077

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakagen

2023/10/31 07:38

sk.exeさん ご回答ありがとうございます。 修正例のコードを見る感じ、「該当するセルに数値があれば変数(売上など)に該当するセルの数字を代入する」といったプロセスでしょうか?
sk.exe

2023/10/31 08:38

> 修正例のコードを見る感じ、「該当するセルに数値があれば > 変数(売上など)に該当するセルの数字を代入する」 > といったプロセスでしょうか? もし参照元のセルに格納されている値(もしくは数式の計算結果)が "ABC" のような「数値データに変換できない文字列」である場合、その値を Long 型の変数に代入しようとしたり、その値を使って算術演算を行おうとしたりすれば型不一致エラーが発生します。 そうした事態に備えて、まず IsNumeric 関数によって「数値データとして評価/変換することが出来るか否か」を判別し、変換可能な場合はそのセルの値を、変換不可能な場合は 0 をそれぞれの変数に代入するようにしています。 https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/isnumeric-function
nakagen

2023/10/31 12:49

なるほど…、そのような事態に備えて数値であるかを確認するIsNumeric関数を使っているということですか。 詳しく教えてくださり、ありがとうございました!
guest

0

ベストアンサー

おそらく、

VBA

1 For i = 1 To 10 2 売上 = Cells(i + 1, 2).Value 3 客数 = Cells(i + 1, 3).Value 4 客単価 = 売上 / 客数 5 Cells(i + 1, 4).Value = 客単価 6 Next

初心者にたまにある勘違いで、代入の=は数学の=とは全く意味が異なります。
おそらく「Cells(i + 1, 2).Value売上とします」的な意図だったのでしょう。
なまじ同じ記号なので混乱する人もいるようです。
また、VBAでは「代入の=」も「等値比較の=」も同じ=なのでさらに紛らわしい。

投稿2023/10/31 02:44

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakagen

2023/10/31 07:59 編集

otnさん ご回答ありがとうございます。 やはり、自身の勘違いで、変数の元々の数0をセルに代入していたことが分かりました。 実行結果、整数のみに整理されました(longでまとめられたということだと思っています)
otn

2023/10/31 08:39

多くの言語で、代入は = ですが( A = 123 とか) 、 「A ← 123 」「A := 123 」のように違う記号を使う言語もあります。
nakagen

2023/10/31 12:51

代入に→だったり:=を使うのは初耳でした…! 今回教えて頂いたことをもとに今後も頑張って参ります!
guest

0

実行してみたわけではないのでパッと見ての印象で失礼します
・データ型について
「客単価」は割り算の結果が入るため、これについては整数型(Long)ではなく小数も使える実数型(Double)の方がよさそうです
・割り算の実行について
Cells(i + 1, 2).Value = 売上だと、「売上」という初期化されてない(=0のままの)変数をセルに代入していることにならないでしょうか?
客数=0で売上=0を割っているのでオーバーフローしている、ということのような気がします

投稿2023/10/31 02:00

AkiFuku

総合スコア129

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakagen

2023/10/31 07:31

akifukuさんの仰るとおり0を0で割ってしまっているので、オーバーフローが生じたのだと考えています。 また、doubleを使ってはどうかのアドバイスもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問