- 締切済み
ユーザー設定関数を作りたいのです
指定した範囲内の数の合計を求め、その合計の数の右から1桁のみを表示させる関数を作りたいと思っています。 A5~D15に数字が入っており、その合計が「3780」だとすれば、返したい数字は「3」です。 通常の関数を使えば、 =RIGHT(SUM(A5:d15),1) だと思うのですが、ユーザー設定関数(A)をつくり、 =A(A5:D15) で答えを出したいと思っています。 どうかご教授ください。 よろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
#5の追伸です。 # 現在は書籍としては、97しかありませんが、内容的にはかなり違います。 2005/11/10現在として、97もありませんでした。
- Wendy02
- ベストアンサー率57% (3570/6232)
#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アーカイブとしてしか、存在していません。文末に紹介しておきます。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。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)
こんばんは。 私も考えてみました。合計が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)
参照URLを見て、ユーザ設定関数を 作ってみてください。 少なからず、VB・VBAの知識が必要かも しれませんね。
- masa_019
- ベストアンサー率61% (121/197)
合計が「3780」のときに「3」を返すなら、左から1桁だと思うのですが・・・。 =RIGHT(SUM(A5:d15),1) をそのままユーザー定義関数にしました。 Function A(範囲 As Range) A = Right(Application.WorksheetFunction.Sum(範囲), 1) End Function 左からなら、RightをLeftに変えて下さい。
お礼
masa_019様、 そうです、左から1桁です。勘違いしていました。 お恥ずかしい・・・。 即行でご回答も頂きまして、ありがとうございました。 本当に助かりました。 今後は自力で何とかできるよう、勉強していこうと思います。
お礼
kokorone様 アドバイスをありがとうございました。 お教えいただいたURLを参考に勉強してみます。