Excel VBA質問箱 IV

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

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


11756 / 13645 ツリー ←次へ | 前へ→

【14331】不連続な複数セルを引数とする関数の作成 TAKA 04/5/26(水) 10:45 質問[未読]
【14332】Re:不連続な複数セルを引数とする関数の作成 ちゃっぴ 04/5/26(水) 10:48 発言[未読]
【14334】Re:不連続な複数セルを引数とする関数の作成 TAKA 04/5/26(水) 11:05 質問[未読]
【14335】Re:不連続な複数セルを引数とする関数の作成 ちゃっぴ 04/5/26(水) 11:13 回答[未読]
【14336】Re:不連続な複数セルを引数とする関数の作成 つん 04/5/26(水) 11:25 発言[未読]
【14337】Re:不連続な複数セルを引数とする関数の作成 Asaki 04/5/26(水) 11:28 回答[未読]
【14338】Re:不連続な複数セルを引数とする関数の作成 つん 04/5/26(水) 11:38 発言[未読]
【14339】Re:不連続な複数セルを引数とする関数の作成 Asaki 04/5/26(水) 11:41 回答[未読]
【14343】Re:不連続な複数セルを引数とする関数の作成 ちゃっぴ 04/5/26(水) 12:13 発言[未読]
【14340】Re:不連続な複数セルを引数とする関数の作成 TAKA 04/5/26(水) 11:41 質問[未読]
【14342】Re:不連続な複数セルを引数とする関数の作成 ちゃっぴ 04/5/26(水) 12:09 回答[未読]
【14344】Re:不連続な複数セルを引数とする関数の作成 TAKA 04/5/26(水) 12:27 お礼[未読]
【14358】Re:不連続な複数セルを引数とする関数の作成 よろずや 04/5/26(水) 18:50 回答[未読]
【14367】Re:不連続な複数セルを引数とする関数の作成 つん 04/5/27(木) 9:27 発言[未読]

【14331】不連続な複数セルを引数とする関数の作成
質問  TAKA  - 04/5/26(水) 10:45 -

引用なし
パスワード
   標題の件お教えください。

連続する複数セルを引数とする関数は
function XXX( a as range)

end function
で実現できましたが、不連続なセルを複数指定すると
エラーになります。

しかし、sum関数などはきちっと計算できておりますので実現可能かと思っています。
どなたかご教示ください。

【14332】Re:不連続な複数セルを引数とする関数の...
発言  ちゃっぴ  - 04/5/26(水) 10:48 -

引用なし
パスワード
   >不連続なセルを複数指定するとエラーになります。

何を行いたいのかがよくわかりません。
どのメソッド(プロパティ)を使用するのか?・・・etc

不連続なセルもしくはセル範囲が有効なメソッド(プロパティ)と有効でないものがありますので

【14334】Re:不連続な複数セルを引数とする関数の...
質問  TAKA  - 04/5/26(水) 11:05 -

引用なし
パスワード
   >何を行いたいのかがよくわかりません。
>どのメソッド(プロパティ)を使用するのか?・・・etc
>不連続なセルもしくはセル範囲が有効なメソッド(プロパティ)と有効でないものがありますので
ありがとうございます。
具体的には、sum関数の亜種を作成したいのです。

function Xsum(a as range) as double

for i to a.Count
  xsum = a.cells.Item(i) + xsum
next

end function

(一部細かい処理は省略してあります)


上記モジュールをワークシート関数として使用しており、
連続領域(例A1:Z26)なら問題なく稼動します。

しかし不連続領域だとファンクションがうまく引数を受け取れません。
例えば Range("A1")と Range("Z24")とRange("A1:Z26") を指定したケース。

これに対応した関数を作成したいのです。

すいませんがお願いします。

【14335】Re:不連続な複数セルを引数とする関数の...
回答  ちゃっぴ  - 04/5/26(水) 11:13 -

引用なし
パスワード
   こんな感じですかな

Function Xsum(a as range) As Double
  Dim rngTarget As Range
  Dim dblBuf  As Double
  
  For Each rngTarget In a
    dblBuf = dblBuf + rngTarget.Value
  Next rngTarget
  
  Xsum = dblBuf
End Function

Function内でファンクションプロシジャー(Xsum)への代入は
一度しか有効になりません。
したがってこの場合、一時変数dblBufを使用して書き換えました。

【14336】Re:不連続な複数セルを引数とする関数の...
発言  つん E-MAIL  - 04/5/26(水) 11:25 -

引用なし
パスワード
   こんにちは。
横から失礼します。

失礼ながら、ちゃっぴさんのを試させて頂いたんですけど、

>Function Xsum(a as range) As Double
>  Dim rngTarget As Range
>  Dim dblBuf  As Double
>  
>  For Each rngTarget In a
>    dblBuf = dblBuf + rngTarget.Value
>  Next rngTarget
>  
>  Xsum = dblBuf
>End Function

これでもやはりエラーになりませんか?
思うんですけど、Xsum(a as range)って引数は1つですよね?
でも、複数の不連続のセルを指定するってことは、
その分引数の数が増えるってことなので、そこでエラーになるんじゃないのかな?
私もあまりよくわかってないので、「もしかしてそうかも?」
程度の曖昧な意見なんですけど・・・どうかしらん?
そうだとして、じゃあどうすればいいかは・・・すんません。わからないです(^^;

【14337】Re:不連続な複数セルを引数とする関数の...
回答  Asaki  - 04/5/26(水) 11:28 -

引用なし
パスワード
   こんにちは。

↓こんなのかな?
Function test(ParamArray aa() As Variant) As Double
  Dim v    As Variant
  Dim r    As Range
  For Each v In aa
    For Each r In v
      test = test + r.Value
    Next r
  Next v
End Function

【14338】Re:不連続な複数セルを引数とする関数の...
発言  つん E-MAIL  - 04/5/26(水) 11:38 -

引用なし
パスワード
   Asaki さん、こんにちは〜

>Function test(ParamArray aa() As Variant) As Double
>  Dim v    As Variant
>  Dim r    As Range
>  For Each v In aa
>    For Each r In v
>      test = test + r.Value
>    Next r
>  Next v
>End Function

ばっちしにゃ〜(^o^)
配列にしたらええんとちゃうか?と、引数を配列にしたり、
バリアント型にしたり、してみたんだけど、上手くいきませんでした。
「ParamArray」ちゅーもんがあったのねー。
どうもありがとー・・・って、私の質問ちゃうかったか(^^;
TAKAさん、横から失礼しました〜m(__)m

【14339】Re:不連続な複数セルを引数とする関数の...
回答  Asaki  - 04/5/26(水) 11:41 -

引用なし
パスワード
   ↓これでも?
Function test2(ParamArray aa() As Variant) As Double
  Dim v    As Variant
  For Each v In aa
    test2 = test2 + WorksheetFunction.Sum(v)
  Next v
End Function

先ほどのスレのものも、両方とも、エラー処理していませんので、
データによっては上手くいかない可能性もあります。

つん さん、こんにちは。
検証ありがとうございます。

【14340】Re:不連続な複数セルを引数とする関数の...
質問  TAKA  - 04/5/26(水) 11:41 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>こんな感じですかな
>
>Function Xsum(a as range) As Double
>  Dim rngTarget As Range
>  Dim dblBuf  As Double
>  
>  For Each rngTarget In a
>    dblBuf = dblBuf + rngTarget.Value
>  Next rngTarget
>  
>  Xsum = dblBuf
>End Function

ちゃっぴさん、早速のご返信ありがとうございます。

しかしながら、
ワークシートに=Xsum(A1,G18:H22,B13)と指定すると#VALUE!と表示され
うまく結果が得られません。なにか私の設定が悪いのでしょうか?

たびたび申し訳ありませんが、お教えください。

【14342】Re:不連続な複数セルを引数とする関数の...
回答  ちゃっぴ  - 04/5/26(水) 12:09 -

引用なし
パスワード
   > ワークシートに=Xsum(A1,G18:H22,B13)

Function Xsum(a as range) As Double
となっているように引数に指定するのはRangeオブジェクトです。

ワークシート上でSumと同じような指定方法をしたいとするならば、
AsakiさんのようにVariant型で配列にしてやる必要があります。

【14343】Re:不連続な複数セルを引数とする関数の...
発言  ちゃっぴ  - 04/5/26(水) 12:13 -

引用なし
パスワード
   >これでもやはりエラーになりませんか?
>思うんですけど、Xsum(a as range)って引数は1つですよね?
>でも、複数の不連続のセルを指定するってことは、
>その分引数の数が増えるってことなので、そこでエラーになるんじゃないのかな?

Function Xsum(a as range) As Double
引数の宣言を見てもらえばわかるとおり指定するのは、Rangeオブジェクトです。
したがって、Sum関数のような引数しては考慮しておりません。

>でも、複数の不連続のセルを指定するってことは
Unionメソッド等を使用して指定すると想定してました。

【14344】Re:不連続な複数セルを引数とする関数の...
お礼  TAKA  - 04/5/26(水) 12:27 -

引用なし
パスワード
   ちゃっぴさん、つんさん、Asakiさん 
どうもありがとうございました!すばやい解決ができました。
みなさまの詳しさに頭が下がります。

p.s
Excelの内部ロジックは不明ですが、
同様のロジックなんでしょうかねぇ?

【14358】Re:不連続な複数セルを引数とする関数の...
回答  よろずや  - 04/5/26(水) 18:50 -

引用なし
パスワード
   >しかしながら、
>ワークシートに=Xsum(A1,G18:H22,B13)と指定すると#VALUE!と表示され
>うまく結果が得られません。なにか私の設定が悪いのでしょうか?

=Xsum((A1,G18:H22,B13))
と、カッコを余分に付けると出来ちゃったりします。

【14367】Re:不連続な複数セルを引数とする関数の...
発言  つん E-MAIL  - 04/5/27(木) 9:27 -

引用なし
パスワード
   よろずや さん、こんにちは。

>=Xsum((A1,G18:H22,B13))
>と、カッコを余分に付けると出来ちゃったりします。

思わず、『うそやーん』と思いつつ試してみました。
(し……失礼っ(>_<) だってあまりにも意外だったんだもの)
ほんまに出来ちゃった(@_@) 
むちゃくちゃビックリしちゃった。どーゆー仕組みなんだー!?

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