Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1422 / 13646 ツリー ←次へ | 前へ→

【74581】ユーザー定義関数の引数を可変長引数にしたい。 アラユタン 13/7/29(月) 16:54 質問[未読]
【74582】Re:ユーザー定義関数の引数を可変長引数に... γ 13/7/29(月) 21:52 発言[未読]
【74584】Re:ユーザー定義関数の引数を可変長引数に... アラユタン 13/7/30(火) 9:58 質問[未読]
【74585】Re:ユーザー定義関数の引数を可変長引数に... アラユタン 13/7/30(火) 11:39 お礼[未読]
【74586】Re:ユーザー定義関数の引数を可変長引数に... γ 13/7/30(火) 20:09 発言[未読]
【74587】Re:ユーザー定義関数の引数を可変長引数に... アラユタン 13/7/31(水) 8:54 発言[未読]
【74590】Re:ユーザー定義関数の引数を可変長引数に... γ 13/7/31(水) 20:56 発言[未読]

【74581】ユーザー定義関数の引数を可変長引数にし...
質問  アラユタン  - 13/7/29(月) 16:54 -

引用なし
パスワード
   Excel2003を使用しています。

以下の、ユーザー定義関数の第二引数を可変長引数にしたいです。
例:=Sabutotal(109,A1,D1,G1....)のように使いたいです。

rngを配列にしてParamArray宣言する所まではわかるのですが、
動作しなくなります。

宜しくお願いします。


Public Function Sabutotal(cN As Integer, rng As Range)
Application.Volatile
Dim C As Range
Dim mA As Variant
ReDim mA(0)
If cN > 100 Then
  For Each C In rng
    If Not C.EntireColumn.Hidden And Not C.EntireRow.Hidden And _
    Not C.Formula Like "=Sabutotal(*" Then
      ReDim Preserve mA(UBound(mA) + 1)
      mA(UBound(mA)) = C.Value
    End If
  Next
Else
  For Each C In rng
    If Not C.Formula Like "=Sabutotal(*" Then
      ReDim Preserve mA(UBound(mA) + 1)
      mA(UBound(mA)) = C.Value
    End If
  Next
End If
Select Case cN
Case 1, 101: Sabutotal = Application.WorksheetFunction.Average(mA)
Case 2, 102: Sabutotal = Application.WorksheetFunction.Count(mA)
Case 3, 103: Sabutotal = Application.WorksheetFunction.CountA(mA)
Case 4, 104: Sabutotal = Application.WorksheetFunction.max(mA)
Case 5, 105: Sabutotal = Application.WorksheetFunction.min(mA)
Case 6, 106: Sabutotal = Application.WorksheetFunction.Product(mA)
Case 7, 107: Sabutotal = Application.WorksheetFunction.StDev(mA)
Case 8, 108: Sabutotal = Application.WorksheetFunction.StDevP(mA)
Case 9, 109: Sabutotal = Application.WorksheetFunction.Sum(mA)
Case 10, 110: Sabutotal = Application.WorksheetFunction.Var(mA)
Case 11, 111: Sabutotal = Application.WorksheetFunction.VarP(mA)
Case Else: Sabutotal = "種類がありません。"
End Select
End Function

【74582】Re:ユーザー定義関数の引数を可変長引数...
発言  γ  - 13/7/29(月) 21:52 -

引用なし
パスワード
   関数の引数を下記にして、
Public Function Sabutotal(cN As Integer, ParamArray rng())
Cの型をVariantにすればいいのかも知れないが、
そもそも何が目的なんですか。
SUBTOTAL関数を使えない、使わない理由は?

今のままだと、Sabutotal(1,A1:A3,A5)なんていうのもアウトなので、
余り嬉しくないのでは?

【74584】Re:ユーザー定義関数の引数を可変長引数...
質問  アラユタン  - 13/7/30(火) 9:58 -

引用なし
パスワード
   ▼γ さん:
>関数の引数を下記にして、
>Public Function Sabutotal(cN As Integer, ParamArray rng())
>Cの型をVariantにすればいいのかも知れないが、
してみましたが、結果がかわりません。

>そもそも何が目的なんですか。
>SUBTOTAL関数を使えない、使わない理由は?
集計方法は109、行データを集計したい。
SUBTOTAL関数ではできないはずです。

>今のままだと、Sabutotal(1,A1:A3,A5)なんていうのもアウトなので、
>余り嬉しくないのでは?
嬉しくはないですが、使わないので大丈夫です。

可視セルの行データを集計したいのです。
↑これができればなんでもOKですので、ユーザー定義関数の
修正方法と、合わせて妙案があればご教示ください。

宜しくお願いします。

【74585】Re:ユーザー定義関数の引数を可変長引数...
お礼  アラユタン  - 13/7/30(火) 11:39 -

引用なし
パスワード
   ▼アラユタン さん:
>▼γ さん:
>>関数の引数を下記にして、
>>Public Function Sabutotal(cN As Integer, ParamArray rng())
>>Cの型をVariantにすればいいのかも知れないが、
>してみましたが、結果がかわりません。
申し訳ありません。上記のようにソースを修正した所、
欲しい結果になりました。

標準モジュールの箇所ではなく、ThisWorkbookに記述しており、
うまく動作していなかっただけでした。

ちなみに、ユーザー定義関数以外の方法を教示頂ければ、
幸せです。

【74586】Re:ユーザー定義関数の引数を可変長引数...
発言  γ  - 13/7/30(火) 20:09 -

引用なし
パスワード
   失礼しました。列の非表示では109など100番台は無効なんですね。

こういう場合には、ダミー行(例えば1行目)を使って、
そこに加算対象のセルにだけ1を立てておいて、
 =SUMIF($A$1:$K$1,1,A2:K2)
などとして、下にコピーすればいいんじゃないですか?
対象セルのアドレスを逐一入力するより手軽だと思います。

【74587】Re:ユーザー定義関数の引数を可変長引数...
発言  アラユタン  - 13/7/31(水) 8:54 -

引用なし
パスワード
   ▼γ さん:
>失礼しました。列の非表示では109など100番台は無効なんですね。
>
>こういう場合には、ダミー行(例えば1行目)を使って、
>そこに加算対象のセルにだけ1を立てておいて、
> =SUMIF($A$1:$K$1,1,A2:K2)
>などとして、下にコピーすればいいんじゃないですか?
>対象セルのアドレスを逐一入力するより手軽だと思います。

ご回答ありがとうございます。
一番いいのは、今回拾ってきたソースに条件を指定できれば
最高でした。
=Sabutotal(109,A1:K1,条件)

sumifでは非表示されているセルも対象となるので、
今回は使えないのです。

【74590】Re:ユーザー定義関数の引数を可変長引数...
発言  γ  - 13/7/31(水) 20:56 -

引用なし
パスワード
   余り重要性はないのですが、一応。

>sumifでは非表示されているセルも対象となるので、
ですから、表示セルだけを合計する手法として、↓こう書いたのですが。
>こういう場合には、ダミー行(例えば1行目)を使って、
>そこに加算対象のセルにだけ1を立てておいて、
> =SUMIF($A$1:$K$1,1,A2:K2)
非表示列を作ったあと、
編集 - ジャンプ で 1行目の「可視セル」だけ選んで、
そこに 1 を入力して、 CTRL + Enter で一括して入力できます。

1422 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free