EXCELユーザー関数でISERRORを使うには?

このQ&Aのポイント
  • EXCELユーザー関数を使用して除算エラーを回避する方法について教えてください。
  • 作成したユーザー関数で#VALUE!エラーが表示されてしまう問題があります。
  • 改良方法を教えてください。
回答を見る
  • ベストアンサー

EXCELユーザー関数でISERRORを使うには?

皆様、いつもお世話になっています。 0で除算すると、エラーになるのですが、それを回避するユーザー関数を作ろうと思っています。 下記のように作ったのですが、#VALUE!と、表示され、上手くエラーを回避出来ていません。 どのように、改良したら良いか教えて下さい。 Function DD(A As Integer, B As Integer) Dim RT As Range RT = A / B If Application.WorksheetFunction.IsError(RT) Then DD = "" Else DD = RT End If End Function

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

アナタのヤリタイ延長で作成するなら 例えば: function ddx(a as double, b as double) as variant  dim res as variant  on error goto errhandle  res = a / b  ddx = res  exit function errhandle:  ddx = "" end function などのようにします。 #補足 変数resを介する必要はなく直接「ddx = a / b」とすることで十分ですが,そこは敢えてアナタのマクロの延長として作成しています。 #以下余談 >今回は、なんとかエラーの回避の仕方をマスターしたいと思いますので、私の作ったマクロか、回答1の延長でやってみたいと思います。 という事でしたら,まずご自分で書いたマクロをご自分でデバッグできるようになってください。 ■手順:不明の箇所はご自分でネットで調べるか,別途ご質問を投稿して解決してください  マクロにブレイクポイントを設ける  マクロを実行する(今回はセルにユーザー定義関数を記入して計算させる)  デバッグを開始し,ステップ実行でマクロの実行を一行ずつ追いかける  ローカルウィンドウを表示し,各変数の内容の推移を確認する ■先にも回答したとおり,マクロの中でゼロ割りを試みても,「エラー値は計算されません」。 結果してアナタが試みた >If IsError(FORMULA) Then も,意図したようには機能していません。 アナタのマクロで,変数FORMULAには意図したようにはエラー値が格納されていないこと,では代わりに何が格納され,マクロはどこへと向かっていったのか。 そういった事をデバッグの操作によって確認しながら,間違いを見つけ正しい道筋を探ってください。

toshi-xx
質問者

お礼

ユーザー定義関数の添削をありがとうございました!(当たり前なんでしょうけれども)見事に、私の思い通りのものが出来ました。 以下余談・・と、おっしゃってますが、まさに図星で、私のマクロの作成能力で足りないところだと思います。デバックは知っているのですが、ローカルウィンドウでの表示の仕方は知りません・・・。Orz 早速に、職場から本を持ってきて、今晩勉強したいと思います。 マクロが動くようになったことよりも、デバックに関してのことが、よっぽどタメになったと思います。 今回は、本当にありがとうございました。感謝感激です。 今から、勉強です!!

toshi-xx
質問者

補足

ご丁寧に、ありがとうございます。キーワードがちりばめられていますので、1つ1つ地道に理解して行きたいと思います。 (お礼の方に入れてしまうと、結果報告が出来なくなりそうなので、とりあえずこちらへレスしました・・。)

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

回答1) 下記など参考にしてみて下さい。 Excel の数式エラーを非表示にするユーザー定義関数のサンプル http://support.microsoft.com/kb/280094/ja 使い方 =iferror(A1/B1,"") =iferror(2/0,"err") 回答2) >下記のように作ったのですが、#VALUE!と、表示され、上手くエラーを回避出来ていません。 ふつーのマクロで sub macro1() dim a,b,c a = 1 b = 0 c = a / b msgbox c end sub なんて具合に作成してみると判りますが,マクロの途中でゼロ割りを試みると「エラー値が計算される」のではなく,即座に実行時エラーを起こしてマクロが停止します。ユーザー定義関数の場合は,無条件にエラー値が返ります。 前述参考資料ではこれを回避するためにon errorで逃がしていますが,今回のご質問でとりあえずやりたかったのは >0で除算すると、エラーになるのですが、それを回避するユーザー関数を作ろうと思っています。 なので,もっとシンプルに function ddx(a as double, b as double) as variant  if b = 0 then   ddx = 0  else   ddx = a / b  end if end function などのように組み立てるだけです。

toshi-xx
質問者

お礼

keithinさん、深夜にもかかわらず丁寧に教えて頂きありがとうございました。 回答2は、よく理解出来ます。1つの方法だとは思うのですが、今回は、なんとかエラーの回避の仕方をマスターしたいと思いますので、私の作ったマクロか、回答1の延長でやってみたいと思います。 (順序が逆になりましたが)回答1を参照して、下記のようなマクロを作ってみました。 Function XX(A As Integer, B As Integer) Dim FORMULA As Variant Dim SHOW As String On Error GoTo ErrorHandler FORMULA = A / B SHOW = "" If IsError(FORMULA) Then XX = SHOW Else XX = FORMULA End If Exit Function ErrorHandler: Resume Next End Function ところが、(0で割り算をした場合)答えを求めたいセルには、スペースでなく、0となってしまいます。 引き続き、(keithinさんに限らず)、ご教示頂けると幸いです。

関連するQ&A

  • ユーザー定義関数をボタンに登録したい

    数式のエラーを回避するユーザー定義関数を作りPERSONAL.xlsに登録しました。 その後アドインに保存して、関数の挿入ダイアログボックスのユーザー定義関数から選んで使用していますが、頻繁に使用するのでボタンに登録したいのです。 どのようにすればいいのでしょうか? ネットで検索して色々やってみてるのですが分かりません。 ボタンのマクロの登録で「PERSONAL.xla!vlookupエラー回避」と直接打ち込んで登録してみましたが、実際にボタンをクリックすると「コンパイルエラー End Subが必要です」というエラーメッセージが出ます。 どこをどうすればいいのか教えてください。よろしくお願いします。 Sub vlookupエラー回避() ' ' vlookupエラー回避 Macro ' マクロ記録日 : 2006/7/25 ユーザー名 : ******** ' Function myVLookup(Rg As Range, Area As Range, col As Integer, opt As Integer) Dim vlk As Variant vlk = Application.VLookup(Rg, Area, col, opt) If IsError(vlk) Then vlk = "" End If myVLookup = vlk End Function

  • if関数の順番 iserrorが認識されない

    タイトルは検索用のためぶっきらぼうですが、よろしくお願いします。 以下のように、A列からB列までの日数を求めるのですが、AやBに ””(空白)や #VALUE!エラー が入ることがあるので、IF関数で回避させています。      A    B      C列 2行  10/1  10/25    =B2-A1+1                 (C2は25となる)                  ↓                =IF(B2="","甲",B2-A1+1)                または                =IF(ISERROR(B2),"乙",B2-A1+1) ところが、 =IF(ISERROR(A2),"丙",IF(ISERROR(B2),"乙",IF(B2="","甲",B2-A2+1))) という複合式なら、甲、乙、丙はきちんと判別されるのに、 =IF(B2="","甲",IF(ISERROR(A2),"丙",IF(ISERROR(B2),"乙",B2-A2+1))) という風に順を変えると、結果は   #VALUE! になってしまいました。      A    B      C列 2行  10/1  #VALUE!   =IF(B2="","甲",IF(ISERROR(A2),"丙",IF(ISERROR(B2),"乙",B2-A2+1)))                (C2は #VALUE! となる。乙にならない) また、 =IF(OR(B2="",ISERROR(A2),ISERROR(B2)),"",B2-A2+1) でも、同じように #VALUE!エラーになってします。 関数の順番を変えただけで、なぜ ISERROR が正常に値を返さないのでしょうか?

  • Excelマクロの配列計算が♯VALUE!となる

    Excelマクロの複素数を扱う配列計算がエラーとなります.  下記HPからマクロを標準モジュールに取り込み,以前のQAで助けて頂き 一部修正により動作するようになりました. しかし,このマクロで定義した「 IMINVERS 」関数を実行すると,大きい 配列では「#VALUE!」となってしまいます. 助けて頂けませんか! http://www.geocities.jp/tomtomf/denki/AC2/ac2.htm http://www.geocities.jp/tomtomf/denki/AC1/ac1.htm 〔問題の現象〕  整数の行列(6×6)以上の配列計算は「#VALUE!」となる.  複素数の行列(5×5)以上の配列計算は「#VALUE!」となってしまう. 小さい配列では正しく計算できているので,手順には問題ないようにみえます. どこに問題があるのでしょうか. 問題の「 IMINVERS」関数に関するマクロは以下の通りです。 ----------------------------------------------------------- Public Function IMABSa(a As Variant) As Variant IMABSa = Application.WorksheetFunction.ImAbs(a) End Function Public Function IMDIVa(a As Variant, b As Variant) As Variant IMDIVa = Application.WorksheetFunction.ImDiv(a, b) End Function Public Function IMPRODUCTa(ParamArray a()) As Variant IMPRODUCTa = Application.WorksheetFunction.ImProduct(a) End Function Public Function IMPRODUCTb(a As Variant, b As Variant) As Variant IMPRODUCTb = Application.WorksheetFunction.ImProduct(a, b) End Function Public Function IMSUBa(a As Variant, b As Variant) As Variant IMSUBa = Application.WorksheetFunction.ImSub(a, b) End Function Public Function IMSUMa(ParamArray a()) As Variant IMSUMa = Application.WorksheetFunction.ImSum(a) End Function Public Function IMSUMb(a As Variant) As Variant IMSUMb = Application.WorksheetFunction.ImSum(a) End Function ----------------------------------------------------- Public Function IMINVERS(a As Range) As Variant Dim n As Integer, n1 As Integer, n2 As Integer Dim r1 As Integer, r2 As Integer, c As Integer Dim max As Variant Dim i As Integer Dim m() As Variant Dim inm() As Variant Dim rr As Integer, cc As Integer Dim no As Integer, ex As Variant n1 = a.Rows.Count n2 = a.Columns.Count n = n1 ReDim inm(1 To n1, 1 To n2) For rr = 1 To n1 For cc = 1 To n2 If rr <> cc Then inm(rr, cc) = 0 Else inm(rr, cc) = 1 End If Next Next ReDim m(1 To n1, 1 To n2) m = a If n1 <> n2 Then IMINVERS = False Exit Function End If For r1 = 1 To n max = m(r1, r1) no = r1 If r1 < n Then For i = r1 + 1 To n If IMABSa(m(i, r1)) > IMABSa(max) Then max = m(i, r1) no = i End If Next If (r1 <> no) Then For i = 1 To n ex = m(r1, i) m(r1, i) = m(no, i) m(no, i) = ex Debug.Print m(r1, i), m(no, i) ex = inm(r1, i) inm(r1, i) = inm(no, i) inm(no, i) = ex Next End If End If max = m(r1, r1) For i = 1 To n m(r1, i) = IMDIVa(m(r1, i), max) inm(r1, i) = IMDIVa(inm(r1, i), max) Next For r2 = 1 To n If r1 <> r2 Then max = m(r2, r1) For i = 1 To n m(r2, i) = IMSUBa(m(r2, i), IMPRODUCTa(m(r1, i), max)) inm(r2, i) = IMSUBa(inm(r2, i), IMPRODUCTa(inm(r1, i), max)) Next End If Next Next IMINVERS = inm End Function ------------------------------------------------

  • ISERROR関数を使用してもエラーが出る

    Excel2016でセルにUSDまたは、JPYの文字がある場合はエラーが出ないのですが、それ以外の文字の場合ISERROR関数を使用しても#VALUE!というエラーが出ます。 関数は以下の通りです。 =IF(OR(NOT(ISNUMBER($G5)),NOT(ISNUMBER($K5))),"",IF($B$5<ROUNDDOWN($I5*IF(NOT(ISERROR(SEARCH("JPY",$D5,1))),100,VLOOKUP(CONCATENATE(MID($D5,IF(OR(SEARCH("USD",$D5,1)=4,ISERROR(SEARCH("USD",$D5,1))),1,4),3),"JPY"),$A$12:$B$18,2,FALSE))*$G5*$B$8/IF($B$8=100000,10000,IF($B$8=10000,1000,IF($B$8=1000,100,))),0),"超過",ROUNDDOWN(IF(ISNUMBER($P5),-$P5,-$I5)*IF(NOT(ISERROR(SEARCH("JPY",$D5,1))),100,VLOOKUP(CONCATENATE(MID($D5,IF(OR(SEARCH("USD",$D5,1)=4,ISERROR(SEARCH("USD",$D5,1))),1,4),3),"JPY"),$A$12:$B$18,2,FALSE))*$G5*$B$8/IF($B$8=100000,10000,IF($B$8=10000,1000,IF($B$8=1000,100,))),0))) エラーが出ているのは以下の「【】」の部分のようです。 =IF(OR(NOT(ISNUMBER($G5)),NOT(ISNUMBER($K5))),"",IF($B$5<ROUNDDOWN($I5*IF(【NOT(ISERROR(SEARCH("JPY",$D5,1)))】~ 数値を表示したいのですが解決方法を教えてください。 回答よろしくお願いします。

  • Excelマクロで定義の関数実行結果が#VALUE

    以前にマクロの記述について教えて頂いた件の再度の質問になります. Excelマクロで複素数を扱う関数を下記HPから標準モジュールに コピペしました.今度は正しくコピーできていると思います. しかし,計算結果がどうしても「#VALUE!」となってしまいます.何故でしょうか? どなたか助けて頂けませんか! http://www.geocities.jp/tomtomf/denki/AC2/ac2.htm http://www.geocities.jp/tomtomf/denki/AC1/ac1.htm 今回は関数定義の「 IMMULT」関数に関する部分に絞っています. ここまで絞ってもエラーになるのは,単純な問題なのでしょうか? 行列の積を求めるマクロの手順にも問題はなさそうです. Public Function IMPRODUCTa(ParamArray a()) As Variant IMPRODUCTa = Application.Run("atpvbaen.xlam!IMPRODUCT", a) End Function Public Function IMSUMa(ParamArray a()) As Variant IMSUMa = Application.Run("atpvbaen.xlam!IMSUM", a) End Function Public Function IMMULT(a As Range, b As Range) As Variant Dim r1 As Integer, r2 As Integer, c1 As Integer, c2 As Integer, nn As Integer Dim r As Integer, c As Integer Dim cr As Integer, cc As Integer Dim n As Integer Dim mm() As Variant r1 = a.Rows.Count r2 = b.Rows.Count c1 = a.Columns.Count c2 = b.Columns.Count If c1 = r2 Then nn = c1 Else Exit Function End If cr = r1 cc = c2 ReDim mm(1 To cr, 1 To cc) For r = 1 To cr For c = 1 To cc mm(r, c) = 0 For n = 1 To nn mm(r, c) = IMSUMa(mm(r, c), IMPRODUCTa(a.Cells(r, n), b.Cells(n, c))) Next Next Next IMMULT = mm End Function

  • エクセル ISERROR

    エクセルでISERROR関数を使い、エラー表示されないようにした2つ以上のセルを他のセルで更に計算すると#DIV/0!が表示されます。 例) B2 4月数量 C2 4月金額 D2 4月単価 =IF(ISERROR(C2/B2),"",C2/B2) E2 5月数量 F2 5月金額 G2 5月単価 =IF(ISERROR(F2/E2),"",F2/E2) 4~3月までのセルが続き、各単価の平均・伸長率などを他のセルで計算しようとすると#VALUE!が表示されます。 上記のようにISERROR関数を使った複数のセルを参照させ計算し、更にエラー表示させないようにするにはどのような方法がありますか。 どなたか教えてください。

  • エクセルマクロで定義した関数が動きません

    以前にマクロの記述について教えて頂いた件の続きになります. ご指導頂いたとおりExcelマクロで複素数を扱う関数を下記HPから 標準モジュールにコピペしました.今度は正しくコピーできたと思いますが, 実行するとエラーになります. 標準の組込み関数を用いて「実数」の行列を計算すれば正しく 計算できますが,当然ながら「複素数」は計算できません. この「複素数」を扱う新しく定義した関数が動かない理由, 「End if に対するifブロックがありません」とか 計算結果が「#VALUE!」となってしまうのは何故でしょうか? マクロの記述内容はほとんど理解できないのですが, どなたか助けて頂けませんか! ちなみにエクセルは2016版です. http://www.geocities.jp/tomtomf/denki/AC2/ac2.htm http://www.geocities.jp/tomtomf/denki/AC1/ac1.htm 以下はコピー定義した「 IMMULT」関数と「 IMINVERS」関数のマクロです. Public Function IMMULT(a As Range, b As Range) As Variant Dim r1 As Integer, r2 As Integer, c1 As Integer, c2 As Integer, nn As Integer Dim r As Integer, c As Integer Dim cr As Integer, cc As Integer Dim n As Integer Dim mm() As Variant r1 = a.Rows.Count r2 = b.Rows.Count c1 = a.Columns.Count c2 = b.Columns.Count If (c1 = r2) Then nn = c1 Else Exit Function End If cr = r1 cc = c2 ReDim mm(1 To cr, 1 To cc) For r = 1 To cr For c = 1 To cc mm(r, c) = 0 For n = 1 To nn mm(r, c) = IMSUMa(mm(r, c), IMPRODUCTa(a.Cells(r, n), b.Cells(n, c))) Next Next Next IMMULT = mm End Function Public Function IMINVERS(a As Range) As Variant Dim n As Integer, n1 As Integer, n2 As Integer Dim r1 As Integer, r2 As Integer, c As Integer Dim max As Variant Dim i As Integer Dim m() As Variant Dim inm() As Variant Dim rr As Integer, cc As Integer Dim no As Integer, ex As Variant n1 = a.Rows.Count n2 = a.Columns.Count n = n1 ReDim inm(1 To n1, 1 To n2) For rr = 1 To n1 For cc = 1 To n2 If rr <> cc Then inm(rr, cc) = 0 Else inm(rr, cc) = 1 'End If Next Next ReDim m(1 To n1, 1 To n2) m = a If n1 <> n2 Then IMINVERS = False Exit Function End If For r1 = 1 To n max = m(r1, r1) no = r1 If r1 < n Then For i = r1 + 1 To n If IMABSa(m(i, r1)) > IMABSa(max) Then max = m(i, r1) no = i End If Next If (r1 <> no) Then For i = 1 To n ex = m(r1, i) m(r1, i) = m(no, i) m(no, i) = ex Debug.Print m(r1, i), m(no, i) ex = inm(r1, i) inm(r1, i) = inm(no, i) inm(no, i) = ex Next End If End If max = m(r1, r1) For i = 1 To n m(r1, i) = IMDIVa(m(r1, i), max) inm(r1, i) = IMDIVa(inm(r1, i), max) Next For r2 = 1 To n If r1 <> r2 Then max = m(r2, r1) For i = 1 To n m(r2, i) = IMSUBa(m(r2, i), IMPRODUCTa(m(r1, i), max)) inm(r2, i) = IMSUBa(inm(r2, i), IMPRODUCTa(inm(r1, i), max)) Next End If Next Next IMINVERS = inm End Function

  • EXCEL VBA ユーザー定義関数について。

    EXCEL VBA ユーザー定義関数について。 例) FUNCTION Test(a as integer, b as integer,c as integer) as integer とした場合、に添付図のような   =Test(数値1, 数値2, 数値3) のような説明は表示できないのでしょうか? ご存知の方よろしくお願いします。

  • 配列を返すVBAユーザー定義関数の書き方

    VBAで、商と余りを返す整数割算のユーザー定義関数を書こうとしています。セルA1に割られる数、B1に割る数が書いてあり、C1とD1に「=xdiv("A1:B1")」をCtrl+Shift+Enterで入力します。C1に商、D1に余りを返すようにしたいと思ってます。 以下のように書いてみたのですが、戻り値の書き方がどうもよくわかりません… Function xdiv(ByRef d() As Integer) As Integer   ............. End Function よろしくお願いします。

  • Excelのユーザー定義関数について。

    ネットで調べて「アルファベットのみを半角にする」というユーザー定義関数を発見し使用していますが、 この関数にある特定の文字を変換する条件を追加することはできますでしょうか。 例えば、リンゴ という文字がセル内にある場合、ミカン に変換されて表示されるという条件を下記のユーザー定義関数に加える事ができますか。 もしくは、新たに別のユーザー定義関数を作るしかないのでしょうか。アドバイスよろしくお願いします。m(_ _ )m Function ASC_A(str As String) As String Dim i As Integer For i = 1 To Len(str) If Mid(str, i, 1) Like "[a-zA-Z]" Then Mid(str, i, 1) = StrConv(Mid(str, i, 1), vbNarrow) End If Next ASC_A = str End Function

専門家に質問してみよう