• ベストアンサー

sumproductの類似

エクセルでsumproduct関数では、 sumproduct(A1:A3,B1:B3)=A1×B1+A2×B2+A3×B3 のように計算されますが、順序を逆にして積和をとる関数 F(A1:A3,B1:B3)=A1×B3+A2×B2+A3×B1 を作りたいのですが、方法がわかりません。 できますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

#2です。 ユーザー定義関数であれば、いくらでも方法があると思います。 私は難しい事はわからないのでシンプルに作成してみました。 選択範囲に数字以外が入力されていたり、 選択する行数が異なる場合などの対策はしておりません。 =REVS(A1:A3,B1:B3) で計算されます。 Function REVS(A As Range, B As Range) T = 0 For I = 1 To A.Cells.Count T = T + Cells(A.Row + I - 1, A.Column).Value * Cells(B.Cells.Count - I + B.Row, B.Column) Next I REVS = T End Function

zk43
質問者

お礼

質問の仕方が悪かったようですみません。 とりあえず、考えた末、以下のようにできました。 (縦横どちらでも良いようにしました) Function F(A As Variant, B As Variant, c) Dim s(1000), t(1000) '配列の大きさ n = WorksheetFunction.Count(A) '配列の逆読み込みと順読み込み For I = 1 To n '縦 If c = 1 Then s(I) = WorksheetFunction.Index(A, n + 1 - I, 1) t(I) = WorksheetFunction.Index(B, I, 1) ElseIf c = 2 Then '横 s(I) = WorksheetFunction.Index(A, 1, n + 1 - I) t(I) = WorksheetFunction.Index(B, 1, I) End If Next I '配列の積和 ss = 0 For j = 1 To n ss = ss + s(j) * t(j) Next j F = ss End Function

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 >(縦横どちらでも良いようにしました) こちらの回答を最初から一切無視して、ご自身で質問して、ご自身で回答を出して満足するなら、こういうQ&Aでの質問は差し控えていただいたほうがよいです。私自身、いくつかの掲示板で、教え・教わりを何年も繰り返してきて学んできています。ある程度の技術があれば、自分のスキルよりある人かどうか分かりますから、その中で、学ぶべきものはあるはずでず。 それと、私の作ったコードは、オプション・スイッチを必要なく、縦・横は範囲で決まります。その程度は読み取っていただいても損はないはずですが。 =REVS(A1:A5,B1:B5)  縦 =REVS(A1:C1,A2:C2)  横 と可能です。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 VBAのユーザー定義関数なら、必ず、その旨は事前に指定してください。 ワークシート関数とVBAユーザー定義関数を同じように使いこなす人は少ないです。 なお、 >F(a() as double,b() as double)で、Σa(i)b(n-i)を計算する このような関数は、パラメータ配列にして引数を Variant 型にするようになっています。また、SUM系関数の引数は、範囲の中に文字列が入ってもエラーを出さず、無視するような作り方が決まっていますので、その仕様にしたがっています。 しかし、以下の関数では、未だ、引数に配列は受けられるようにはなっていません。その仕様を加えると、コードが長くなってしまうからです。 使い方は、 =REVS(A1:A3,B1:B3) します。 3列なら、このようになります。 =REVS(A1:A3,B1:B3,C1:C3) '標準モジュール Function REVS(ParamArray ARG() As Variant)   Dim i As Integer   Dim j As Integer   Dim k As Integer   Dim v As Variant   Dim Ar() As Variant   Dim ret As Double   If TypeName(ARG(0)) = "Range" Then     k = ARG(0).Cells.Count     ReDim Ar(k - 1)   End If   For i = LBound(ARG()) To UBound(ARG())     If i = 0 Then       For j = 1 To ARG(i).Count         If IsNumeric(ARG(i).Cells(j).Value) Then           Ar(j - 1) = ARG(i).Cells(j).Value         End If       Next j     Else       For j = k To 1 Step -1         If IsNumeric(ARG(i).Cells(j).Value) Then           Ar(k - j) = Ar(k - j) * ARG(i).Cells(j).Value         End If       Next j     End If   Next i   For Each v In Ar()     ret = ret + v   Next v   REVS = ret End Function

zk43
質問者

お礼

質問の仕方が悪かったようですみません。 とりあえず、考えた末、以下のようにできました。 (縦横どちらでも良いようにしました) Function F(A As Variant, B As Variant, c) Dim s(1000), t(1000) '配列の大きさ n = WorksheetFunction.Count(A) '配列の逆読み込みと順読み込み For I = 1 To n '縦 If c = 1 Then s(I) = WorksheetFunction.Index(A, n + 1 - I, 1) t(I) = WorksheetFunction.Index(B, I, 1) ElseIf c = 2 Then '横 s(I) = WorksheetFunction.Index(A, 1, n + 1 - I) t(I) = WorksheetFunction.Index(B, 1, I) End If Next I '配列の積和 ss = 0 For j = 1 To n ss = ss + s(j) * t(j) Next j F = ss End Function

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

C列にB列の順序を逆にしたものを作成します。 C1 =INDEX($B$1:$B$3,ROWS($B$1:$B$3)+ROW($B$1)-ROW(B1),) C1をC3セルまでコピーします。 そして、 =SUMPRODUCT(A1:A3,C1:C3) とすれば大丈夫かと思います。 ROWS関数とROW関数があるので注意して下さい。 4行以上に範囲拡大になる場合は、$B$1:$B$3を広げれば対応できるはずです。

zk43
質問者

お礼

ありがとうございます。 しかし、できれば、VBAのfunctionで、 F(…,…)で、…どうしの順序が逆の積和を作れないかな? と考えています。 F(a() as double,b() as double)で、Σa(i)b(n-i)を計算する ような。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 MODを使う方法もあるけれども、桁が増えると浮動小数点誤差が出るので、整数固定法を使いました。 =SUMPRODUCT(A1:A3,RIGHT(FIXED(LARGE(ROW(A1:A3)+B1:B3/100,ROW(A1:A3)),2),2)*1) 現在2桁までの対応ですから、3桁以上になったら、 /100 と、FIXED(....,2),2)*1 の部分を、/1000  ....3),3)*1 というように桁数を調整してください。

zk43
質問者

お礼

ありがとうございます。 しかし、できれば、VBAのfunctionで、 F(…,…)で、…どうしの順序が逆の積和を作れないかな? と考えています。 F(a() as double,b() as double)で、Σa(i)b(n-i)を計算する ような。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 列の積を求める関数

    エクセル関数で、sumproduct関数の意味を持ち、 「列を基準」に積の和が求められる関数をお教え頂けないでしょうか。 $A$1*A2+$B$2*B2+$C$3*C4........の計算を簡略化したいのが目的です。 宜しくお願い致します。

  • SUMPRODUCT関数について

    SUMPRODUCT関数について いつもお世話になっています。 以前こちらでSUMPRODUCT関数を教えていただき大変統計がしやすくなり、 仕事が効率化しました。ありがとうございます。 ところで、SUMPRODUCTだと思うのですが、計算式がうまく組み立てられないのでご質問させていただきます。 A列に部門名、B列に実施日が入力されているエクセルシートがあり、 部門ごとの実施件数を出したいのです。 SUMPRODUCT((A2:A100="○部門")*(CAUNTA(B2:B100))) としてみましたがうまくいきません。 たぶん *(CAUNTA(B2:B100)) の部分がいけないのだろうとは思うのですが、どう変化させればいいのでしょうか? 関数の選択が間違っているのかもしれない、とは思うのですが、適切なものが分かりません。 ご教授お願いします  

  • SUMPRODUCT関数の疑問

     ExcelでSUMPRODUCT関数を条件付きの合計を求めるのによく使っていますが、理解できない動作があります。  仮にA,B,Cが配列、b,cが定数として、A=aかつB=bの場合のCの合計を求めるものとします。 <式1>SUMPRODUCT((A=a)*(B=b)*C)→正しい計算結果 <式2>SUMPRODUCT((A=a)*(B=b),C)→正しい計算結果 <式3>SUMPRODUCT(A=b,B=b,C)→ゼロ <式4>SUMPRODUCT(1*(A=a),1*(B=b),C)→正しい計算結果  3つともすべて同じ計算結果が出てくると思いきや、<式3>だけが何故0になるのかが理解できません。  私は、理由が分からず、腑に落ちないまま<式1>の方法を使っています。  これは仕様上の問題なのか、詳しい理由が分かる方がいれば、解説をよろしくお願いします。  なお、私はExcel2000を使っていますが、Excel2002ではどうなるんでしょうか。

  • SUMPRODUCT関数について

    Excelで=SUMPRODUCT(A1:F1*(MOD(COLUMN(A1:F1),2)=1))という式をIEで検索し使用していますが、なかなか意味がわかりません。 (MOD(COLUMN(A1:F1),2)=1)というところは、列を番号として2で割ったときに1余る列番号を求めているのはわかるのですが、 =SUMPRODUCT(A1:F1*というところが、なぜA1:F1を掛けているのか、どうしてそれで正常な奇数列の和が返ってくるのかがなかなか理解できません。どなたかわかりやすく教えていただけないでしょうか?

  • SUMPRODUCT($A$1:$A$10,$B$1:$B$10)とSUMPRODUCT($A$1:$A$10*$B$1:$B$10)

    エクセルのSUMPRODUCT関数についてお尋ねします。 =SUMPRODUCT($A$1:$A$10,$B$1:$B$10) と =SUMPRODUCT($A$1:$A$10*$B$1:$B$10) の違いは何でしょうか? 両者とも同じ答えを返しますが、いろいろ試したところ、前者は範囲内に文字列があってもそれを無視して計算し、後者は文字列があればエラーになるようですが、その理解で正しいでしょうか? 正しいとすれば、なぜでしょうか?

  • SUMPRODUCT関数について

    http://oshiete1.goo.ne.jp/qa5621207.html で質問していたものですが お答え頂いた関数について質問させて下さい。 =SUMPRODUCT(($A$2:$A$100+($B$2:$B$100>"21:00"*1)=E2)*($C$2:$C$100=F2)) についてなのですが、SUMPRODUCT関数の中で使われる+には どういった意味があるのでしょうか? 前半部分(=E2まで)の意味が分からず、困っております。 どなたか解説をお願いします。

  • エクセル関数SUMPRODUCTについて

    エクセル2000です。 A列とB列の和にC列を乗じたものの合計は、 =SUMPRODUCT(A1:A10,$C$1:$C$10)+SUMPRODUCT(B1:B10,$C$1:$C$10) または =SUM(SUMPRODUCT(A1:A10,$C$1:$C$10),SUMPRODUCT(B1:B10,$C$1:$C$10)) のような長ったらしいものになるのでしょうか? =SUMPRODUCT((A1:B10)*C1:C10) は、表中に文字列が入る場合があるのでエラーになります。 ご教示いただければ幸いです。

  • エクセル関数 SUMPRODUCTについて

    エクセル関数でSUMPRODUCTについて質問させていただきます。 ↓A1 コーラ  A ポカリ  A 珈琲   A 石鹸   B 洗剤   B ポカリ  A 食パン  C 菓子パ  C 洗剤  B   3←C11(Aの数を数えています。) と、入力されているデータにおいては、 =SUMPRODUCT((MATCH($A$1:$A$9&$B$1:$B$9,$A$1:$A$9&$B$1:$B$9,0)=ROW($A$1:$A$9))*($B$1:$B$9="A")) の関数で求めるデータが出ることはわかりました。 (Aの数は4個ですが、ポカリがダブっているので3個として数えるように設定したいのです。同じ様にBの数は洗剤が2つあるので2個として計算します。) しかし、A1~C11のデータをすべて切り取りして 例えばA11からC21に貼り付けた場合はC21の計算結果が”0”になってしまいます。 その際のC21の関数は =SUMPRODUCT((MATCH($A$11:$A$19&$B$11:$B$19,$A$11:$A$19&$B$11:$B$19,0)=ROW($A$11:$A$19))*($B$11:$B$19="A")) になっています。 この場合だと具体的にどのように関数を変化させればいいのでしょうか? ご指導いただければありがたいです。よろしくお願いします。<m(__)m>

  • 【Excel】 SUMPRODUCTについて

    EXCELで初歩的な事かもしれませんがお願いします。 『  =SUMPRODUCT(('1'!$A$1:$A$2999="A")*('1'!$B$1:$B$2999="あ"))  =SUMPRODUCT(('1'!$A$1:$A$2999="A")*('1'$B$1:$B$2999="い"))               ・               ・               ・                』 上記しました、関数がセルA1~A50まで入力してあります。 参照先シート名『1』の部分だけ一括で『10』に変更する術はあすのでしょうか? すみませんが、ご教授をお願います。

  • 負数のみを対象としたSUMPRODUCT関数

    エクセル2000です。 たとえば A1:A40 がCCCでないもののうちの B1:B40 の中での最大値をSUMPRODUCT関数で求める方法は以下の式だと思います。 =SUMPRODUCT(MAX((A1:A40<>"CCC")*(B1:B40))) ところが、B1:B40 の数値がすべて負の数だった場合、返って来る答えは常に 0 になるようです。 最初は原因がわからず、途方にくれていましたが、A1:A4の中で値がCCCのセル場合、そのセルが返す値は FALSE で、これを対応するB列に乗じた積を 0 としているのではないかと推測しました。 そこで、次の式のように FALSEの数+1番目に大きい数を指定したところ、やっと負の数のなかから最大値を返すようになったように思います。 =SUMPRODUCT(LARGE((A1:A40<>"CCC")*(B1:B40),COUNTIF(A1:A40,"CCC")+1)) この推測は合っているのでしょうか? 他にもっと簡単なやりかたがあるのでしょうか?

専門家に質問してみよう