「スプレッドシートで (1+2i)×(3−i) を計算したいけど、手で展開するのは面倒…」。交流回路の課題やインピーダンスの検算をしていると、複素数の掛け算は避けて通れませんよね。
i² = −1 を使って展開すると、どうしても符号の取り違えが起きがち。IMPRODUCT関数を試したら #NUM! が出た、結果を足そうとしたら #VALUE! になった。そんなところで手が止まった人もいるはずです。
GoogleスプレッドシートのIMPRODUCT関数なら、複素数を渡すだけで積を1つのセルに返してくれます。この記事では構文から行ごとの積の出し方、交流回路での使い方、エラーの直し方までをまとめました。
スプレッドシートのIMPRODUCT関数とは?書き方(構文と引数)
IMPRODUCT関数は、複素数どうしの積(掛け算)を返すGoogleスプレッドシートの関数です。読み方は「アイエム・プロダクト」。imaginary(虚数)と product(積)を組み合わせた名前ですね。
エンジニアリング関数(工学系の計算で使う関数群)のひとつで、交流回路や制御の計算で出番があります。2つだけでなく、3つ以上の複素数もまとめて掛けられるのが特徴です。
構文と引数(因数は範囲・実数も渡せる)
=IMPRODUCT(因数1, [因数2, ...])
| 引数 | 内容 | 例 |
|---|---|---|
| 因数1 | 掛ける複素数、またはその範囲(必須) | “1+2i”、A2、A2:A10 |
| 因数2以降 | 追加で掛ける複素数や範囲(省略可) | “3-i”、3、B2:B10 |
因数には、文字列・セル参照・範囲・実数を混ぜて渡せます。次の式は、複素数と実数の3と純虚数の4iを掛けている例です。
=IMPRODUCT("1+2i", 3, "4i")
結果は -24+12i になります。(1+2i)×3 で 3+6i、そこに 4i を掛けて 12i+24i² = −24+12i という流れです。
計算のしくみと戻り値は文字列
中で行われているのは、次の展開です。
(a + bi)(c + di) = (ac − bd) + (ad + bc)i
i² = −1 なので、実部に「−bd」が入るのがポイント。手計算で符号を間違えやすいのも、まさにこの部分です。
IMPRODUCTの結果は「-10+10i」のような文字列で返ります。虚部が0になる積は「25」のように実部だけ、実部が0なら「2i」のように虚部だけが表示されます。
見た目が数字だけの「25」も、戻り値としては文字列です。結果を足し合わせるときの注意は、エラーの章でまとめて紹介しますね。
IMSUM・IMSUB・IMDIV・IMPOWERとの使い分け
複素数の四則演算とべき乗は、関数がそれぞれ分かれています。文字列の複素数は演算子の + や * では計算できないので、目的に合う関数を選びましょう。
| 計算 | 関数 | 書き方の例 |
|---|---|---|
| 足し算(和) | IMSUM | =IMSUM(“1+2i”, “3-i”) |
| 引き算(差) | IMSUB | =IMSUB(“1+2i”, “3-i”) |
| 掛け算(積) | IMPRODUCT | =IMPRODUCT(“1+2i”, “3-i”) |
| 割り算(商) | IMDIV | =IMDIV(“1+2i”, “3-i”) |
| べき乗 | IMPOWER | =IMPOWER(“1+2i”, 2) |
IMSUMとIMPRODUCTは、3つ以上の引数や範囲を受け付けます。一方、IMSUBとIMDIVは2つの複素数どうしの計算です。
同じ数を何度も掛けるなら、IMPOWERで指数を指定するのが手軽でしょう。ただ、結果に小さな差が出る例もあります。
=IMPRODUCT("2+3i", "2+3i", "2+3i") → -46+9i
=IMPOWER("2+3i", 3) → -46+9.00000000000001i
この例では、IMPRODUCTの方は -46+9i ちょうどでした。整数の累乗なら、IMPRODUCTで掛けた方が誤差が出にくい場合がある、くらいに覚えておくと安心です。IMPOWER側の誤差の消し方は、IMPOWER関数の記事で解説しています。
Excelとの違い
ExcelにもIMPRODUCT関数があり、同じ構文で使えます。ただ、この記事の計算結果やエラーの種類は、Googleスプレッドシートで実際に確かめたものです。Excelでは挙動が異なる場合があります。
Excelでの使い方を調べている人は、ExcelのIMPRODUCT関数の使い方を参考にしてください。
IMPRODUCT関数の基本の使い方
文字列で複素数を直接指定する
いちばんシンプルなのは、複素数を文字列のまま書く方法です。
=IMPRODUCT("1+2i", "3-i")
結果は 5+5i です。実部は 1×3 − 2×(−1) = 5、虚部は 1×(−1) + 2×3 = 5 と計算されています。
文字列はダブルクォーテーションで囲みましょう。虚部の係数が1なら、「3-i」のように1を省いて書けます。
セル参照で掛ける
実務では、セルに入った複素数を掛けることが多いはず。次のサンプル表で試してみましょう。
| 行 | A(複素数1) | B(複素数2) | C(積) |
|---|---|---|---|
| 2 | 1+2i | 2 | 2+4i |
| 3 | 3-i | 1+i | 4+2i |
| 4 | 2i | 3+4i | -8+6i |
C2に次の式を入れ、フィルハンドルで下へコピーします。
=IMPRODUCT(A2, B2)
C3・C4にも、それぞれの行の積が並びます。2行目のように実数の2を掛けると、実部と虚部がどちらも2倍になるだけです。
3つ以上・範囲をまとめて掛ける
複数の複素数をまとめて掛けるなら、範囲をそのまま渡せます。サンプル表のA列3つを全部掛けると、次のとおりです。
=IMPRODUCT(A2:A4)
結果は -10+10i。(1+2i)×(3−i) で 5+5i、そこに 2i を掛けて −10+10i になります。
範囲と個別の値を混ぜて =IMPRODUCT("1+2i", "3+5i", A2:A50) のように書くこともできます。範囲の途中に空白セルがあっても、そのセルは無視されて計算が続く仕組みです。
たとえば A6 に 1+2i、A7 が空白、A8 に 3-i が入っているとしましょう。=IMPRODUCT(A6:A8) の結果は 5+5i で、空白が0として掛けられることはありません。
数値の入ったセルも、そのまま因数として使えます。A9 に数値の 2 が入っていれば、=IMPRODUCT(A6, A9) の結果は 2+4i。
COMPLEX関数で作った値を掛ける
実部と虚部が別々の列に入っているなら、COMPLEX関数で複素数にしてから渡します。
=IMPRODUCT(COMPLEX(3, 4), 2)
COMPLEX(3, 4) が 3+4i を作り、2を掛けて結果は 6+8i です。実部と虚部がA〜D列に分かれた表なら、=IMPRODUCT(COMPLEX(A2, B2), COMPLEX(C2, D2)) のように書けます。
電気の分野で虚数単位に j を使いたいときは、COMPLEXの第3引数に “j” を指定しましょう。COMPLEX(3, 4, "j") で 3+4j が作れます。
j で書いた複素数どうしを掛けると、結果も j で返ってきます。
=IMPRODUCT("10+5j", "2+8j")
結果は -20+90j です。ただし、i と j を1つの式に混ぜると #NUM! になるので注意してください。
複数行をまとめて計算する(行ごとの積・累積積)
IMPRODUCTは、範囲を「掛け合わせる数の集まり」として受け取ります。そのため、範囲の渡し方しだいで結果が大きく変わる点に注意が必要です。
全体の積・行ごとの積・累積積の書き分け表
前の章のサンプル表(A2:A4 と B2:B4)を使った場合の書き分けは、次のとおりです。
| やりたいこと | 書き方 | サンプルでの結果 |
|---|---|---|
| A列の全部を掛ける(1つ) | =IMPRODUCT(A2:A4) | -10+10i |
| A列とB列の全部を掛ける(1つ) | =IMPRODUCT(A2:B4) | -120-160i |
| 行ごとの積(3つ) | =MAP(A2:A4, B2:B4, LAMBDA(a, b, IMPRODUCT(a, b))) | 2+4i/4+2i/-8+6i |
| 上からの累積積(3つ) | =SCAN(“1”, A2:A4, LAMBDA(acc, x, IMPRODUCT(acc, x))) | 1+2i/5+5i/-10+10i |
全体の積が欲しいだけなら、範囲を直接渡すのがいちばん簡単。MAPやSCANが必要になるのは、結果を行ごとに並べたいときだけですね。
行ごとの積はMAPで(ARRAYFORMULAでは行ごとにならない)
複数行をまとめて計算しようとして、次のように書く人は多いのではないでしょうか。
=ARRAYFORMULA(IMPRODUCT(A2:A4, B2:B4))
ところがこの式は、行ごとの積になりません。結果は式を入れたセルに -120-160i が1つ出るだけで、下のセルは空のままです。
-120-160i は、A2:A4 と B2:B4 の6セルすべてを掛けた総積。IMPRODUCTは、範囲の中身を全部掛け合わせる関数です。そのため、ARRAYFORMULAで包んでも行ごとには分かれません。
行ごとの積を1つの式で出すなら、MAP関数を使いましょう。
=MAP(A2:A4, B2:B4, LAMBDA(a, b, IMPRODUCT(a, b)))
MAPは、A列とB列から1行ずつ値を取り出してLAMBDAの a と b に渡します。各行で IMPRODUCT(a, b) を計算し、結果を下のセルへ順に展開する流れです。
結果は 2+4i/4+2i/-8+6i で、C列にフィルコピーした値と一致します。行が増えたら、範囲を A2:A100 のように広げるだけで対応できますよ。
累積積はSCANで列に出す
「1行目まで」「2行目まで」と、上から順に掛けた途中経過を並べたいこともあります。そんなときはSCAN関数の出番です。
=SCAN("1", A2:A4, LAMBDA(acc, x, IMPRODUCT(acc, x)))
第1引数の “1” は、掛け算のスタート地点です。acc にはそれまでの積が入り、新しい行の値 x を掛けて次の行へ引き継いでいきます。
結果は 1+2i/5+5i/-10+10i。最後の -10+10i は =IMPRODUCT(A2:A4) と同じ値なので、検算にも使えます。
制御の段接続のように、各段までの総合特性を順に確かめたい場面で便利です。
交流回路での活用例
交流回路の計算では、虚数単位に j を使うのが一般的です。IMPRODUCTは j で入力すれば結果も j で返すので、教科書の表記のまま計算できます。
先に1つ整理しておきましょう。直列につないだインピーダンスの合成は「和」なので、使うのはIMSUM関数です。積が出てくるのは、次のような場面になります。
オームの法則 V=Z×I
電圧は、インピーダンスと電流の積で求まります。インピーダンス Z = 10+5j Ω に電流 I = 2+8j A が流れるときの電圧は、次のとおりです。
=IMPRODUCT("10+5j", "2+8j")
結果は -20+90j V。実部は 10×2 − 5×8 = −20、虚部は 10×8 + 5×2 = 90 です。
電圧の大きさや位相を知りたいときは、結果をIMABS関数やIMARGUMENT関数に渡しましょう。
並列合成インピーダンス Z1Z2/(Z1+Z2)
2つのインピーダンスを並列につないだときの合成は、「積 ÷ 和」で求まります。分子をIMPRODUCT、分母をIMSUMで作り、IMDIV関数で割る形です。
=IMDIV(IMPRODUCT("2+2j", "2-2j"), IMSUM("2+2j", "2-2j"))
Z1 = 2+2j Ω と Z2 = 2−2j Ω の場合、積は 8、和は 4 です。合成インピーダンスは 8÷4 = 2 となり、セルには「2」と表示されます。
誘導性の Z1 と容量性の Z2 で虚部が打ち消し合い、純粋な抵抗 2Ω になるイメージですね。値をセルに入れているなら、=IMDIV(IMPRODUCT(B2, B3), IMSUM(B2, B3)) と書けます。
なお、この「積 ÷ 和」は2素子のときの式です。3つ以上を並列にするときは、そのままでは使えません。
複素電力 S=V×conj(I)
複素電力は、電圧と「電流の共役複素数」の積で求めます。共役を作るのはIMCONJUGATE関数の役目です。
電圧 V = 100 V(位相の基準)、電流 I = 3−4j A の例で計算してみましょう。
=IMPRODUCT("100", IMCONJUGATE("3-4j"))
結果は 300+400j です。実部の 300 が有効電力 P[W]、虚部の 400 が無効電力 Q[var] にあたります。
皮相電力 |S| は =IMABS(IMPRODUCT("100", IMCONJUGATE("3-4j"))) で 500 VA。力率は 300 ÷ 500 = 0.6 です。
有効電力・無効電力を個別に取り出すなら、IMREAL関数とIMAGINARY関数を使いましょう。
この記事では、電圧と電流を実効値で表し、S = V×(Iの共役) と定義しています。この定義だと、遅れ電流(誘導性)のとき Q がプラスになると覚えておきましょう。振幅(最大値)で表す場合は、S = ½V×(Iの共役) です。
共役との積で|z|²を検算
複素数に自分の共役を掛けると、絶対値の2乗 |z|² になります。大きさの2乗を確かめたいときの検算に使える性質です。
=IMPRODUCT("3+4i", IMCONJUGATE("3+4i")) → 25
=IMABS("3+4i")^2 → 25
どちらも 25 で一致しますね。ただし、上の結果は文字列の「25」、下はIMABSが返す数値の 25 です。値の型が違うので、2つを並べて比べるときは気をつけてください。
IMPRODUCT関数のエラーと対処
入力と結果の早見表
IMPRODUCTのエラーは、ほとんどが #NUM! です。入力の形と結果の対応を表にまとめました。
| 入力の例 | 結果 | 原因と対処 |
|---|---|---|
| =IMPRODUCT(“1+1i”, “1+1j”) | #NUM! | i と j が混在。どちらかに揃える |
| =IMPRODUCT(“1+2i”, “3+I”) | #NUM! | 大文字の I。小文字の i にする |
| =IMPRODUCT(“1+2i”, “3+i”) | #NUM! | 全角の+。半角に直す |
| 全角の空白を含む “3 + 4i” | #NUM! | 全角の空白を削除する |
| i・j 以外の文字(”3+4k”) | #NUM! | 虚数単位を i か j にする |
| =IMPRODUCT(“1+1i”, TRUE) | #NUM! | 論理値は掛けられない |
| =IMPRODUCT(“1+1i”, NA()) | #N/A | 参照先のエラーがそのまま返る |
| =IMPRODUCT() | #N/A | 因数を1つ以上指定する |
| =IMPRODUCT(“1 + 2i”, “3-i”) | 5+5i | 半角の空白はエラーにならない |
半角の空白は無視されるので、見た目が正しいのに #NUM! が出るなら全角の文字を疑いましょう。コピーしてきたデータは、全角の+や空白が紛れ込んでいることがよくあります。
大文字の I・J は、LOWER関数で小文字にしてから渡しましょう。=IMPRODUCT(LOWER(A2), LOWER(B2)) で計算できます。
全角の空白は SUBSTITUTE(A2, " ", "") で取り除けます。
#N/A のときは、IMPRODUCT自体より参照先のセルを確認するのが近道です。
結果を+で足すと#VALUE!(足すならIMSUM)
IMPRODUCTの結果は文字列なので、そのまま + で計算すると #VALUE! になります。
=IMPRODUCT(A2:A4)+0 → #VALUE!
積どうしを足し合わせたいなら、IMSUMを使いましょう。サンプル表のC列(2+4i/4+2i/-8+6i)の合計は、次の式で求まります。
=IMSUM(C2:C4)
結果は -2+12i。実部は 2+4−8 = −2、虚部は 4+2+6 = 12 になります。
なお「25」のように数字だけの結果は、+ で数値として扱われることがあります。結果の形によって挙動が変わるので、複素数の足し算はIMSUMにそろえておくのが確実です。
IFERRORで表示を整える
入力途中の行でエラー表示を出したくないなら、IFERRORで包むのも手。
=IFERROR(IMPRODUCT(A2, B2), "入力を確認")
ただし、IFERRORはエラーの原因を隠してしまいます。まずは早見表で原因を直し、そのうえで表示を整える用途に使うのがおすすめです。
まとめ
スプレッドシートのIMPRODUCT関数は、複素数の掛け算を1つのセルで済ませられる関数です。押さえておきたいポイントを振り返りましょう。
- 構文は
=IMPRODUCT(因数1, [因数2, ...])。文字列・セル・範囲・実数を混ぜて渡せる - 戻り値は文字列。「25」や「2」のような結果も文字列で返る
- 範囲を渡すと全部の積が1つ返る。空白セルは無視される
- 行ごとの積はMAP、累積積はSCAN。ARRAYFORMULAで包んでも行ごとにはならない
- j で入力すれば結果も j。i と j を混ぜると #NUM!
- 並列合成は IMDIV(IMPRODUCT, IMSUM)、複素電力は IMPRODUCT(V, IMCONJUGATE(I))
- 結果を足すなら + ではなくIMSUM
迷ったら、サンプル表の値で手計算と照らし合わせてみてください。積の展開に慣れると、交流回路の検算がぐっと楽になりますよ。
複素数の計算をさらに進めたい人は、次の記事もどうぞ。

