• 締切済み

ユーザー設定関数を作りたいのです

指定した範囲内の数の合計を求め、その合計の数の右から1桁のみを表示させる関数を作りたいと思っています。 A5~D15に数字が入っており、その合計が「3780」だとすれば、返したい数字は「3」です。 通常の関数を使えば、 =RIGHT(SUM(A5:d15),1) だと思うのですが、ユーザー設定関数(A)をつくり、 =A(A5:D15) で答えを出したいと思っています。 どうかご教授ください。 よろしくお願い致します。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#5の追伸です。 # 現在は書籍としては、97しかありませんが、内容的にはかなり違います。 2005/11/10現在として、97もありませんでした。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#3のWendy02です。 別に、対数(Log)で取って行う必要もないかもしれないけれど、別カテゴリで、ある方がVB系は、変数の型が厳密ではないというご指摘は、かなり心に残りました。この関数内の引数の型の流れというのは、Double型/(Range)→Long型→String型→Long型(Integer型にはしない) となりますから、無視して、自動キャストで出来ますが、確かに、文字列を数値で扱ったり、数値を文字列で扱うということは、変数の型を意識していないことになります。 誰も、「VBA」ですから、そこまでは求めたり指摘したりする人はいないでしょうけれど、私は、そのレベルは下げたくないですね。 なお、「合計が1以下の数の場合は、これはエラーが出ます。」について、問題があるなら、 If sum <1 Then LeftNumber =0 'この行 挿入 LeftNumber =Int(sum / 10 ^ Int(Log(sum) / Log(10#))) とすればよいだけです。MS社の関数の作り方というのは、関数の戻り値の型は、Variantにしてありますね。そして、引数を間違えると、わざと、エラー値を出させるように、「0」値など、回避させる戻り値を出さないように作られています。 なお、#2 さんの紹介されたMicrosoft の記事を読んでみました。 関連情報の中の、「Microsoft Office 2000/Visual Basic プログラマーズ ガイド』を参照してください。このガイドの入手方法については……」って、Office 2000 は、書籍では手に入らないはずですね。(現在は書籍としては、97しかありませんが、内容的にはかなり違います。)MSDNアーカイブとしてしか、存在していません。文末に紹介しておきます。

参考URL:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/odeopg/html/deovroffice2000visualbasi
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんにちは。KenKen_SP です。 Sum 関数計算結果の絶対値を文字列化し、左1文字を切り出してから 再びそれを数値化、さらに符号を加える、、、 というロジックです。合計値が 1未満でもマイナスでも対応します。 Function A(範囲 As Range) As Long   Dim dblNum As Double   Dim strNum As String      dblNum = Application.sum(範囲)   strNum = Left$(CStr(Abs(dblNum)), 1)      A = CLng(strNum)   If dblNum < 0 Then     A = A * -1   End If End Function

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 私も考えてみました。合計が1以下の数の場合は、これはエラーが出ます。 一応(全てではない)、引数の判定をして、数値を出してから、それを、その桁で割って、Int()で出す、ということです。 Function LeftNumber(範囲 As Variant) As Long   Dim c As Range   Dim sum As Long   If TypeName(範囲) = "Range" Then    For Each c In 範囲      sum = sum + CLng(Abs(c.Value))    Next c   ElseIf TypeName(範囲) = "Double" Then    sum = Clng(Abs(範囲))   End If   LeftNumber = Int(sum / 10 ^ Int(Log(sum) / Log(10#))) End Function

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.2

参照URLを見て、ユーザ設定関数を 作ってみてください。 少なからず、VB・VBAの知識が必要かも しれませんね。

参考URL:
http://office.microsoft.com/ja-jp/assistance/HA010548461041.aspx
09phantom
質問者

お礼

kokorone様 アドバイスをありがとうございました。 お教えいただいたURLを参考に勉強してみます。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

合計が「3780」のときに「3」を返すなら、左から1桁だと思うのですが・・・。 =RIGHT(SUM(A5:d15),1) をそのままユーザー定義関数にしました。 Function A(範囲 As Range) A = Right(Application.WorksheetFunction.Sum(範囲), 1) End Function 左からなら、RightをLeftに変えて下さい。

09phantom
質問者

お礼

masa_019様、 そうです、左から1桁です。勘違いしていました。 お恥ずかしい・・・。 即行でご回答も頂きまして、ありがとうございました。 本当に助かりました。 今後は自力で何とかできるよう、勉強していこうと思います。

関連するQ&A