• ベストアンサー

エクセル この数式を簡単にできないでしょうか?

エクセル2000です。 以下の数式をもっと簡単にすることはできないでしょうか? V2セルにある文字列化させた7桁の数字に対する計算です。 先頭から1,3,5,7番目の数字を3倍,2,4,6番目の数字はそのままでの総和を求めたいのです。(チェックデジットを作成するモジュラス10/ウエイト3のようなものです。) =(MID(V2,1,1)+MID(V2,3,1)+MID(V2,5,1)+MID(V2,7,1))*3+MID(V2,2,1)+MID(V2,4,1)+MID(V2,6,1)

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

=SUMPRODUCT(MID(V2,ROW($A$1:$A$7),1)*(MOD(ROW($A$1:$A$7),2)*2+1)) 積の和を求めるSUMPRODUCT関数の応用です。 ROW($A$1:$A$7)={1,2,3,4,5,6,7}となり MID(V2,ROW($A$1:$A$7),1)={MID(V2,1,1),MID(V2,2,1),・・・・,MID(V2,7,1)} MOD(ROW($A$1:$A$7),2)=MOD({1,2,3,4,5,6,7},2)={1,0,1,0,1,0,1} {1,0,1,0,1,0,1}*2+1={3,1,3,1,3,1,3} でこの SUMPRODUCT({MID(V2,1,1),MID(V2,2,1),・・・・,MID(V2,7,1)}*{3,1,3,1,3,1,3}) =MID(V2,1,1)*3+MID(V2,2,1)*1+・・・・+MID(V2,7,1)*3 で計算できます。 ※{}は配列を意味します。

merlionXX
質問者

お礼

SUMPRODUCT関数もずいぶん奥が深いのですねえ! 感心いたしました。 ありがとうございます。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

こんなことも出来るという例で A1セルに 12345678 数字であればなんでも良い。一応8桁とする。 偶数桁の数字の和は =SUM(IF(MOD(ROW(B1:B8),2)=0,MID($A$1,ROW(B1:B8),1)*1,0)) と入れて、SHIFT+CTRL+ENTERキーを同時押し。配列数式 結果 20 奇数桁の数字の和は =SUM(IF(MOD(ROW(C1:C8),2)=1,MID($A$1,ROW(C1:C8),1)*1,0)) と入れて、SHIFT+CTRL+ENTERキーを同時押し。配列数式 結果 16 ーーーーーーー 後者にウエイトの3をかけて両者の和を取る =SUM(IF(MOD(ROW(B1:B8),2)=0,MID($A$1,ROW(B1:B8),1)*1,0))+3*SUM(IF(MOD(ROW(C1:C8),2)=1,MID($A$1,ROW(C1:C8),1)*1,0)) と入れて、SHIFT+CTRL+ENTERキーを同時押し。配列数式 結果 68 ーーーーー 式の長さから言うと、質問の式に負けているが。 === 私なら、ユーザー関数(VBAを使う)を作る。 標準モジュールに Function chkdt(a) s = 0 For i = 1 To Len(a) If i Mod 2 = 0 Then s = s + Mid(a, i, 1) Else s = s + 3 * Mid(a, i, 1) End If Next i chkdt = s End Function シートのセルに =chkdt(A1) 結果 68

merlionXX
質問者

お礼

ありがとうございました。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

既出回答と同じ事ですが =SUM(MID(V2,{1,2,3,4,5,6,7},1)*{3,1,3,1,3,1,3}) これでもいいかもしれませんね。

merlionXX
質問者

お礼

SUMPRODUCTを使わなくともできるんですね! ありがとうございます。 自分の関数の弱さがあらためてよくわかりました。

回答No.2

V2の文字列をバラして配列にする処理と、奇数番目に3偶数番目に1 をかける処理があればいいんですね。 V2の文字列"7654321"に対して、=index(mid(V2,row(1:7),1),0)*1は 配列{7;6;5;4;3;2;1}を返します。あとは{3;1;3;1;3;1;3}という配 列を用意しすれば、配列の対応する要素同士をかけ算して合計を出 すのはsumproduct関数の仕事ですね。 奇数と偶数を判定するのは2で割った余りで出来るので、2番目の配 列は=mod(row(1:7),2)*2+1で作れます。合わせて、 =sumproduct(index(mid(V2,row(1:7),1),0)*1,mod(row(1:7),2)*2+1) で60が返ってきました。とここまで書いてリロードしたらmshr1962 さんが全く同じ式を…(;_;)

merlionXX
質問者

お礼

ありがとうございます。 勉強になりました。