🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

3回答

13187閲覧

VBA 除算オーバーフローの回避方法

Cabriolet

総合スコア3

VBA

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

0グッド

0クリップ

投稿2020/12/13 02:05

いつもお世話になっております。
VBA初心者ですが、ご教授頂ければ幸いです。

前提・実現したいこと

業務進捗を確認できるExcelを作成しております。
日付ごとの製品の進捗率を求めたいのですが、
目標値"0"が発生してしまう為、オバーフローとなってしまいます。
その際に"0"を代入したいですがうまくいきません。

(例)下記図の様に、0の時は0としたいです

![イメージ説明

該当のソースコード

即席でsampleコードを作成致しました。
至らないところもありますが、ご確認お願い致します。

dim saisho as long dim saigo as long dim result_a as single dim result_b as single dim i as long with ActiveSheet saisho = .Cells(Rows.Count, 1).End(xlUp).row + 1 saigo = .Cells(Rows.Count, 2).End(xlUp).row For i = saisho To saigo '(例)下記からが進捗率の計算です。本来は変数ですが、今回はあらかじめ値を入れてます。 result_a = (5 - (5 - 0)) / 5 '目標値5 実績0の場合 = 0% result_b = (0 - (0-0)) / 0 '目標値0 実績0 = 0%だがオバーフローとなる .Cells(i,3).Value = result_a .Cells(i,4).Value = result_b next i end with

試したこと

IFを使用し、目標値0 = 進捗率0という回避はできましたが、
同じような計算式がたくさん繰り返されている為、出来れば避けたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

IFを使用し、目標値0 = 進捗率0という回避はできましたが、

同じような計算式がたくさん繰り返されている為、出来れば避けたいです。

関数にすれば少し楽できます。

vba

1Public Function zDiv(num1, num2) 2 If num2 = 0 Then 3 zDiv = 0 4 Else 5 zDiv = num1 / num2 6 End If 7End Function 8 9 10'使用例 11Sub Test() 12 Dim x, y, result 13 14 x = 1 15 y = 0 16 17 result = zDiv(x, y) 18 MsgBox result 19 20End Sub

投稿2020/12/13 02:33

hatena19

総合スコア34073

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

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

Cabriolet

2020/12/13 07:35

hatena19 様 ご教授頂きありがとうございました。 IFを多用せずに、欲しい結果を得ることが出来ました。 これからも宜しくお願い致します。
guest

0

除算用の関数を作成し、それで処理してはどうでしょう
分母がゼロのときの除算エラーを回避するには?

投稿2020/12/13 02:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Cabriolet

2020/12/13 07:37

radian 様 いつもお世話になっております。 ご教授頂きありがとうございました。 初心者でも分かり内容でした。
guest

0

これってVBAである必要のある処理なのでしょうか。

Excel関数だけで、仮に B1/A1 を表示するとして、 A1 が 0 の場合は 0 を表示するのであれば、

=IF(A1=0,0,B1/A1)

でできますね。

投稿2020/12/13 02:58

kaz.Suenaga

総合スコア2037

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

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

退会済みユーザー

退会済みユーザー

2020/12/13 03:33

IFを避けたいと書いてあるのでは
Cabriolet

2020/12/13 07:43

kaz.Suenaga 様 radian様 いつもお世話になっております ご回答頂きありがとうございました。 本件に関しては、radian様の仰る通り"IF"を多用せずに結果を得たかったです。 当方の質問が見づらい為に、ご迷惑をお掛けしました。 今後は補足等に記載するように致します。
kaz.Suenaga

2020/12/13 11:56

radian さん、ご指摘ありがとうございます。 「IFを多用」の解釈が違ったようですね。 1セル内に1回のIF関数でかけるならいいかと思ったのですが。 というか、VBA内の関数内でIf分岐するのとの差がわからなかったので・・・。 ※hatena19さんの回答で =zDiv(B1, A1) とするのと =IF(A1=0,0,B1/A1) と書くので違いはないと考えたということです。 > Cabriolet さん いえいえ、読み取れなかったわけではないのでお気になさらず。。 ちゃんと質問すればよかったのですが、 - VBA(かつ、非関数)で解決したいのか、 - VBA(セル内で利用できるユーザー関数)で解決したいのか、 - Excel 関数でも構わないのか で要件が異なりそうだったのですが、既にVBAでの回答は hatena19さんのものでどちらの回答でもある状態でしたので、Excel関数でのものを回答しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問