[[20160713073339]] 『worksheetfunctionでの配列計算』(むーたん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『worksheetfunctionでの配列計算』(むーたん)

A1〜C10までランダムな数字が入っているものとします。
これらを配列に突っ込んでworkseetfunction.sumでA列分だけ計算する書き方を教えて下さい。(答えの求め方、他のやり方は知っていて、「このやり方における書き方を知りたい」というのが質問の趣旨です。配列に突っ込む必要ないとか、=sum(a1:a10)でいいじゃん、などのご意見は求めているものと違います)

また、worksheetfunktionをもう少し知りたいのですが、手元にある本には本当に触りの部分を2ページ程度で解説したものしかありません。もっと突っ込んで書かれている本やサイトの情報などご存知でしたらそれも教えて頂きたいです。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 WorksheetFonction関係として2つの質問をしておられますが、実は、この2つとも
 WorkshetFunction関係のテーマではなく別のテーマです。

 質問の順序を逆にしてコメントします。

 >>worksheetfunktionをもう少し知りたい
 >>手元にある本には本当に触りの部分を2ページ程度

 2ページ程度もあれば充分なんです。

 WorksheetFunctionメソッドは、シート上で使う関数(の大部分)を VBA で、
 WorksheetFunction.関数名(その関数の引数群) と記述して使うことができると、ただ、それだけです。

 利用できない関数もあって、

https://msdn.microsoft.com/ja-jp/library/office/dn301180.aspx

 こういったところを参照いただきたいのですが、本件は WorksheetFunctionが、どうこうではなく
 関数(その関数の引数群) が、どうこう というテーマで、それは それぞれの関数の解説のページに記述されていますよね。
 (SUM は、これこれ とか MATCH は これこれとか)

 >>これらを配列に突っ込んでworkseetfunction.sumでA列分だけ計算する書き方を教えて下さい

 まず、シート上で関数を使う場合、引数として セル領域しか指定できないものと、配列指定が可能なものがありますね。
 たとえば、=SUM({1,2,3}) と書いて使うことができますから SUM は VBAで使う場合も配列を相手に扱うことができるわけです。

 今回の場合、問題は、

 Sub test()
    Dim w As Variant
    w = Range("A1:C10").Value
    MsgBox WorksheetFunction.Sum(w)
 End Sub

 こう書いてしまうと、10行、3列の二次元配列の中の要素がすべて合算されてしまいます。

 これを、その中の1列目だけを対象にしなければいけないということですね。
 VBAの記述方式で 既存配列(その○れつ目のみ) という指定ができれば便利なんですが、残念ながら
 そういう記述は認められていません。

 なので、

 ・既存配列から列や行を部分的に取り出して別の新しい配列にする。
 ・WorksheetFunction.SUM(別の新しい配列) として処理する。

 こういうことになります。
 ここでも、 WorksheetFunction がどうこうというテーマではなく、既存配列から部分的に要素を取り出して
 別の配列にするにはどうしたらいいかという、そういうテーマになります。

 で、この方法については、学校内で、seiyaさんが たびたび 紹介しておられます。
 「seiya Application.Index Evaluate」あたりで 校内全文検索をしてみてください。

(β) 2016/07/13(水) 08:21


 こんなんでいいんじゃないですか?

  aryVal = Range("A1:C10").Value '普通は馬鹿げている処置であるが、それは無視すると解釈

  Debug.Print WorksheetFunction.Sum(Application.Index(aryVal, 0, 1))

(半平太) 2016/07/13(水) 08:38


A1:C10の計算方法を知っているのだから、こんな回答を求めているのではないのでしょうけど、素直な例。
 WorksheetFunction.Sum(Range("A1:A10"))

WorksheetFunctionについては、ヘルプで「WorksheetFunction オブジェクト メンバー」を見ると良いでしょう。
といっても、数式でできることがずらずらと書かれているだけであり、何か変わっているというものではありませんが。
(個人的には、古くからのBASIC言語にはない2進数変換命令が、数式側に実装されている事にびっくりです)

なお、WorksheetFunctionは、マクロ中からExcel本体側の持つ命令を実行できるというものであり、
呼び出しに多少時間がかかるので、計算範囲が少ない場合にはマクロ内で単純演算する方が速いかも知れません。
命令の存在を知らない方も多いので、多用するようなものではないと思います。
知っていると便利、な事もある命令、という感じでしょうか。
(???) 2016/07/13(水) 10:22


皆さん、お返事ありがとうございます。

βさん 2つ目はworksheetfunctionの質問ですが、1つ目は書き方の質問でした。
worksheetfunctionだけに該当するのか、他のケースでも該当するかはわからないけれど、
このケースだけわかればあとは応用できるだろうという意図でした。
配列を取り出して処理〜というのは、興味深いところなので参考にさせて頂きます。

半平太さん まさしくこれがやりたかったことです!
とても参考になりました。

???さん Range("A1:A10")の部分を配列に置き変えたらどう記述するのかな?というのが今回お聞きしたかったことです。
予備知識やヘルプの情報などは参考にさせて頂きます。

皆さんのおかげで解決できました。
ありがとうございました!
(むーたん) 2016/07/13(水) 13:30


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.