アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAでオリジナル関数を作ろうとしています。SUM関数に似た機能をわざわざオリジナル関数で作ってみたいのです。マウスでセルを選択し、選択セルの合計を出したいのです。下記のようなコードを書いてみたのですが、うまくゆきません。オリジナル関数初心者のため、基本的な事が判ってないのだと思います。正しいコードを教えて下さい。

Function 合計★() As Double

Dim 選択セル行数 As Long
選択セル行数 = selection.Rows.Count

Dim 選択セル列数 As Long
選択セル列数 = selection.Columns.Count

Dim 選択セル先頭行 As Long
選択セル先頭行 = selection(1).Row

Dim 選択セル先頭列 As Long
選択セル先頭列 = selection(1).Column

Dim n行 As Long
Dim n列 As Long
Dim 合計 As Double

For n行 = 0 To 選択セル行数 - 1
For n列 = 0 To 選択セル列数 - 1
合計 = 合計 + Cells(選択セル先頭行 + n行, 選択セル先頭列 + n列).Value
Next
Next

合計★ = 合計 '戻り値

End Function

A 回答 (3件)

Function goukei(ParamArray r() As Variant) As Double


Dim rr, n
Dim i As Double

For Each rr In r
For Each n In rr
i = i + n
Next
Next
goukei = i
End Function
    • good
    • 0

Excelの標準機能に似たようなものありません?


Googleスプレッドシートだとsum, average, max, minが表示される。
    • good
    • 0
この回答へのお礼

勉強のためにあえてSUM関数をオリジナル関数で記述してみようと思いました。投稿ありがとう御座いました。

お礼日時:2023/03/20 22:23

こんばんは


私はプロ経験はなく遊びで触っている程度なので 
私の知識が正しいか誤りなのかは分かりませんが・・・参考程度で

#1様が示されているような感じで、オブジェクトとして扱う処理を考えると色々な場面でやり易いように思います (プロパティが使い易い、行列インデックスを考慮しない処理が出来る・・・などなど)

繰り返し処理などはFor Eachを使用します
(ただし処理順位を確定する必要がある場合はカウント変数が無難 For 変数 = 0 To )ご質問のようなロジック

又、組み込みSUM関数は文字列が対象範囲に含まれていてもエラーを返しません
目的により、そのような処理(考え方)を加えるのも必要と言えます
If IsNumeric(Object.Value) Then 
(Valueプロパティを持つオブジェクトの値が数値ならば)

ユーザー定義関数を意識して関数の引数を加えるようにします
ご質問のFunctionの場合シート上で使用すると 
シートが再計算される度(トリガーは再計算)にその時点で選択した範囲の合計が出力されます 数式は参照元トレースが出来ない事になります 

VBAから呼ぶときは 引数にselectionを与えれば良いので
Functionの受け側では変数 VariantやRangeなどで受ければ成立します
素人の説明は分かり難いと思い参考になりそうなサイトを示します

https://www.moug.net/tech/exvba/0100042.html

https://www.excel-chunchun.com/entry/worksheet-f …

更に引数を付けるべき理由は・・
https://www.excel-chunchun.com/entry/worksheet-f …

ユーザー定義関数は注意して使って
https://www.excel-chunchun.com/entry/worksheet-f …

ユーザー定義関数を意識した ご質問では無いかも知れませんが
Functionプロシージャの参考になればと思います
    • good
    • 2
この回答へのお礼

ユーザー定義関数に関するサイトの紹介。ありがとう御座いました。
いくつかのサイトで勉強させていただきました。

お礼日時:2023/03/20 22:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!