こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルのSUM関数について

SUM関数を使って合計を出す時、値に取り消し線を入れたセルを無視する(計算しない)ようにしたいのですが、どのような関数を使えばよいのか分かりません。教えてください。

投稿日時 - 2007-11-17 22:14:44

QNo.3526540

困ってます

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

こんにちは。

VBAによるユーザー定義関数の合計の出し方。

以下のように取り付けてください。
標準モジュール:

Alt +  F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。
次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、以下のコードを貼り付けて、

Alt + Q で、画面を閉じます。

'名称はなんでもよいです。例(StrikeOutSum->SOSum)
'--------------------------------

Function StrikeOutSum(rng As Range)
Dim c As Range
Dim dblSum As Double
 For Each c In rng
  If c.Font.Strikethrough = False Then
  dblSum = dblSum + c
  End If
 Next c
 StrikeOutSum = dblSum '関数名を変えたらここも同じにする
End Function

'--------------------------------
長い名前を付けるのは、主に、その機能の意味を忘れるからです。

後はワークシートで、

=StrikeOutSum(A1:A10)

のように使えばよいです。
----------------------------------------
補足:
#1さんのお話を、もう少し、話を深めさせていただきます。(脱線してすみません)

同様の使い方の説明(2006年が最終更新)
http://support.microsoft.com/kb/213923/ja

なお、Excel 2007でも、マクロ関数(XLM Macron)サポートしていると明示しています。
http://msdn2.microsoft.com/en-us/library/bb687829.aspx

XLM macro sheets are still supported in Excel 2007.

私にVer.4 関数を公開した時、危険だとまでクレームをつけた方がいました。その方は、あまりにも関係のない議論を書き過ぎました。その方は、自分の個人的な体験を掲示板で書くレベルまで普遍化することが出来なかっただけのことです。

http://www.jkp-ads.com/Articles/ExcelNames08.htm
単に以下のように書けばよかったのですが。

One important warning has to be made though. When you copy a cell that uses any name containing XLM macro functions to another worksheet, Excel 97 and Excel 2000 will crash! Copying the formula itself from the formula bar (by selecting the formula and hitting control-c) will be no problem however.

「重要な注意:Excel97 やExcel 2000で、マクロ関数を含めた、『名前』を使ったセルを、別のシートにコピーしようとすると、クラッシュします。コピーは、数式バーから、その数式自身を選択して、Ctrl + C で、コピーして張り付ければ、問題はないのです。」

ただし、=(GET.CELL(23,!A1)=FALSE)+NOW()*0
のように書いて、書式の変更があったら、「F9」を押して、
再計算させます。NOW()*0 と付けることで、同じ名前登録をしたものは、再計算が起動されます。

=SUMPRODUCT(A1:A10,B1:B10)
こうすると、範囲に文字列があっても、無視してくれます。

私は、Excelは、自分の今持っている、そのバージョンで、オールラウンドに使えば良いと考えているわけで、別に、マクロ関数方式が良いの悪いのというのは、不毛の議論だと思います。レガシーのテクニック(過去の遺産)には、必ず終わりがある、そんなことは言うまでもないことです。選択するのは、ユーザー自身で良いと思います。

ただ、#2のimogasiさんのおっしゃるように、情報の入らないものは、ブラックボックス的になってしまうことは否定できません。Ver.5 のフォームのダイアログシートも、グラフをアクティブにして使う、グラフ・メニューやCube やMS-Queryの使い方さえ、私たちは、Web情報でも、手に入らないに近いと思います。Wordなどはもっとひどい状況です。特に、日本語に関しては、情報が不足しています。その穴埋めは、もう不可能に近くなりつつあります。思うに、それは翻訳の問題にもあります。実情は、少し知っているのですが、あまりに、翻訳者をがんじがらめに縛りすぎて、分散化させ、その人の理解に関係なく、やらせているのが現実です。

このVer.4マクロ関数の場合は、多少の根気をもって英語を読めば、それで済む話ですが、現実、こういう世界は、そう簡単ではありません。情報の格差をもって、優位に立つというのが、社会だと思います。それは、仕方がないことだと思います。

Excel 4.0 マクロ関数
http://office.microsoft.com/ja-jp/excel/HP010475331041.aspx

>このヘルプ ファイルは、Microsoft Excel 2000 でのみ使用できます。

は、マクロシートでの関数ヘルプの連動は、Excel 2000までであるということです。
単に、展開して、XLMACRO.CHM を取り出せばよいです。

なお、私は、使うことは少ないのですが、Ver.4 マクロ関数の資料は、出来る限り集めています。

投稿日時 - 2007-11-18 14:11:38

お礼

ご回答、ありがとうございます。
詳しい説明をしていただいたのですが、
今の私には、まだ理解できないので
少しづつ、勉強して行こうと思っています。
Wendy02さんのおっしゃっていることが理解できるように
頑張ります。

投稿日時 - 2007-11-18 23:37:12

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

エクセル関数の何たるかを知らない質問です。
エクセルの関数はセルの値によって計算やその他を行うものです。
取り消し線はセルの値ではなく、「書式」に属するものでセルの値としては捉えられません。
ですから取り消し線の有無を関数の引数部として表現できません。
VBAなら取り消し線の有無を掴むことができますので、ユーザー関数化ができます。以上がエクセルの現状の根本原則です。
ーーーー
しかし、議論をややこしくするのが、既回答のエクセル4.0マクロという遺物(約20年前)の存在です。
これを使って、やれる・どんな方法でもやれればよいというなら、つかうことはできるでしょう。今ではただ解説本は無く、WEBでも解説記事は少ないですから、理解なしの丸呑みでしょう。
ユーザー関数もそうかもしれませんが、一応挙げておきます
標準モジュールに
Function strk(a)
If a.Font.Strikethrough = True Then
strk = 1
Else
strk = 0
End If
End Function
例データA1:A6に
A列  B列
12
341  <--取り消し線あり
54
311  <--取り消し線あり
15
12
B1セルの式
=IF(strk(A1)=1,1,"")
式をB6まで複写。結果上記B列。
取り消し線のあるセルの数の合計
=SUMIF(B1:B6,1,A1:A6)
結果
65

投稿日時 - 2007-11-18 07:52:33

お礼

ご回答、ありがとうございます。
おっしゃるとおり、エクセル関数の何たるかを
理解していなかったことが、分かりました。
今の私には、ちょっと難しいことが分かりました。
少しづつ勉強して行こうと思います。

投稿日時 - 2007-11-18 23:34:06

ANo.1

こんばんは

作業列とマクロ関数のGet.Cellを名前定義で使えばできると思うのですが、エクセルのバージョンによってはできないかもしれません。
Mac版ならばオフィス2004以前、Win版ならば2003以前で使えると思いますが、ちょっと確かではありません。

データがA1~A10に入っているとしてB列を作業列にします。
B1セルを選んでおいて、例えばStrikeという名前を定義して
その内容は=get.cell(23,A1)*1とします。
このときに絶対参照にならないように注意してください。
B1には =if(strike=1,0,1)と入れて、下までコピーします。
A列に取り消し線があるときは0、無い時は1になります。
合計を求めたいセルには =sumproduct(A1:A10*B1:B10)とします。
取り消し線の設定を変えてもたぶん自動で再計算はされない場合は、
B列のセルで編集状態にしてエンターで再確定するといいかもしれません。

Get.Cell(23)はフォントに取り消し線が設定されているとTrueを返します。
Trueが返ってきた時のセルの値をif文で0にしています。
このやり方を好まない人は多いかもしれません。

バージョン違いでできない場合はご容赦ください。

投稿日時 - 2007-11-17 23:15:06

お礼

ご回答、ありがとうございます。
まだ、私にはマクロ関数についての知識がありませんので、
ピンときません。
これから、マクロの勉強もして行こうと思います。

投稿日時 - 2007-11-18 23:30:02

あなたにオススメの質問