エクセルでユーザー定義関数を使う時にセル範囲を任意に指定して参照したいのですがやり方がよく分かりません。
たとえば、以下のマクロを記述して

Function test(a,b)
test=a+b
End Function

エクセルのシート上で

=test(A1,A2)

とすれば、計算結果が出てくると思いますが、この A1、A2と参照していたのを A1:A3 というように参照できるようにマクロを変更したいです。

どなたか教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こんにちは



 こんな感じでしょうか?

Function Test2(Rng As Range) As Double
Test2 = Application.WorksheetFunction.Sum(Rng)
End Function

参考URL:http://www2.odn.ne.jp/excel/
    • good
    • 0
この回答へのお礼

ありがとうございます。最高です。
それに参考URLまで記述して頂いて。

また疑問点が出てくると思うので、その時は面倒でも教えてくださいね。

Function Test2(Rng As Range) As Double
とするんですね。
As Range のところを As Object
というのはやってみたんですけど。

お礼日時:2001/01/26 11:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $

いつもお世話になってます。
以下の関数式について、お時間がありましたらどうぞご教示ください。

=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $12,2,FALSE))

「シート2の範囲指定した表にA1セルの値と同じ値の右隣になる値を返せ。ただし該当なき場合は空白とせよ。」

純粋になんでこのような構文になるのかが解りません。

1.ISNAってそもそもなんでしょう?
2.同じ式を繰り返すのはなぜ?
(模範式で、このように同じ式を繰り返す構文があまり無いように思えたのです。)

・参考となる他所のページがあれば教えて下さい。
・素人です。お手柔らかにお願いします。

(エクセル2003)

Aベストアンサー

1.ISNAってそもそもなんでしょう?
ISで始まる情報関数の一つで、#N/A!エラーのみを判定する関数
結果はTRUE(真),FALSE(偽)のいずれかになります。
エラー判定のIS関数には他に
ISERR:#N/A!を除くすべてのエラーを判定する関数
ISERROR:すべてのエラーを判定する関数
があります。

2.同じ式を繰り返すのはなぜ?
ISNAの判定する値がセルでなく数式の結果だからです。
A2=VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)
なら
A3=IF(ISNA(A2),"",A2)
ということになります。A2のように計算の為のセルを省略する為に
=IF(ISNA(数式),"",数式)のように同じ数式を2回繰り返しになってます。

QExcelでの表編集でC1に =IF(A1="",B1,A1)

Excelでの表編集でC1に =IF(A1="",B1,A1)
と以前文字データのある列A1、B1、2つからそれぞれ穴あき
を補いc1に表示する式=IF(A1="",B1,A1)を教えていただいたのですが
2列まではこの式で行けるのですが3列以上に対応させる記述が
分かりません。
3列以上の表示を一列にまとめる式を教えてください。
お願いします。

Aベストアンサー

条件が良く判りませんが?

セルB1が空白のとき、セルC1をセルD1に表示
という条件を追加すると
=IF(A1="",IF(B1="",C1,B1),A1)

こんな感じですが、イメージと違う場合は補足してください。

QSUMPRODUCT($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)
の違いは何でしょうか?
両者とも同じ答えを返しますが、いろいろ試したところ、前者は範囲内に文字列があってもそれを無視して計算し、後者は文字列があればエラーになるようですが、その理解で正しいでしょうか?
正しいとすれば、なぜでしょうか?

Aベストアンサー

こんばんは。

配列計算をしているのは言うまでもありませんが、この、SUMPRODUCT は、必ず、内部のひとまとまりから計算するという性質を持っています。ただ、VBAのように左から時系列かどうかは、言語が違いますから、分かりません。しかし、この引数は、パラメータ配列になっています。そして、その引数それぞれの有効値を調べて、それを演算出来る値かどうか調べます。

文字列を入れてもエラーにならないのは、元々、そこに注釈などを入れるために考えられたものです。値を文字列か数値かを精査して演算するように出来ています。最初、SUM関数に対し、そのように作られました。プログラムとしては、初歩的なものですが、そのアイデアは、今日まで、踏襲しているようです。このオリジナルの仕組みを考えたのは、VisiCalc の開発者、ブルックリン氏です。昔々、本で読んだことがあります。 PRODUCT関数とも共通です。3つの関数は、同じような仕様を持っています。

こちらが、本来の使い方です。

=SUMPRODUCT($A$1:$A$10,$B$1:$B$10)

つまり、
$A$1:$A$10 と $B$1:$B$10 の値を別々に取得しています。

では、
=SUMPRODUCT($A$1:$A$10,$B$1:$B$11)

とすると、なぜ、エラーが出るかというと、$B$11 に対応する数値が、NULL値(有効な値がない)だからです。それは、全体に反映させてしまいます。(理由は分かると思いますが、プログラムが途中で、エラーで止まってしまうからです)

ところが、こちらは、

=SUMPRODUCT($A$1:$A$10*$B$1:$B$10)

$A$1:$A$10*$B$1:$B$10 は、分割出来ません。したがって、この数式の中でのエラーは、そのまま、元の数式に反映されます。

ご自分で、ユーザー定義関数を作ってみれば分かります。VBAでも、同じように作ることが可能です。一度、試してみるとよいです。

こんばんは。

配列計算をしているのは言うまでもありませんが、この、SUMPRODUCT は、必ず、内部のひとまとまりから計算するという性質を持っています。ただ、VBAのように左から時系列かどうかは、言語が違いますから、分かりません。しかし、この引数は、パラメータ配列になっています。そして、その引数それぞれの有効値を調べて、それを演算出来る値かどうか調べます。

文字列を入れてもエラーにならないのは、元々、そこに注釈などを入れるために考えられたものです。値を文字列か数値かを精査して演算...続きを読む

Qエクセルで、=IF(A12="a",TRUE)は =A1="a"  ???

エクセルで、
=IF(A12="a",TRUE)

=A1="a"
と省略できるのですか?

やってみるとまったく同じようなのですが、いまいち不安です。

また、=IF(D4=TRUE,"OK!","No!")も、日頃=IF(D4,"OK!","No!")と略してますが、これも正しいんですよね?
気になったものですから確認させてください。

Aベストアンサー

こんにちは。maruru01です。

IF関数について、少し補足説明します。
IF関数は、No.1にもあるように、

=IF(条件式,真の場合,偽の場合)

という書式ですが、

=IF(条件式,真の場合)

と、偽の場合を省略することが出来ます。
ここで偽の場合は、FALSEという論理値を返します。
つまり、質問欄の1つ目の例に当たります。
なお、

=IF(条件式)

と、真の場合も省略することは出来ず、

=IF(条件式,,偽の場合)

と、空欄にすると、真の場合は数値の「0」を返すことになります。
ちなみに、偽の場合も、

=IF(条件式,真の場合,)

と、引数区切りのカンマだけ付けると、空欄と見なされて(省略とは異なる)数値の「0」を返します。

次に、条件式についてですが、
条件式は、

「左辺」+「比較演算子」+「右辺」

の書式になっているものを指します。
ここで、比較演算子とは、
「=、>、<、>=、<=、<>」
を指します。
条件式は、成立/不成立の結果、TRUE/FALSEという論理値を返します。
つまり、

=A1="a"

は、条件式の戻り値そのものを表示していることになります。
それに対して、IF関数の方は、条件式を判定した結果、真の場合と偽の場合をそれぞれ実行して表示しています。
その真の場合と偽の場合が、条件式の戻り値とちょうど一致しているということです。

さて、IF関数の第1引数は、通常は上記の条件式を指定しますが、実際はIF関数は第1引数を数値として判断しています。
その判定基準は、第1引数が、
0 → 偽の場合を実行
0以外 → 真の場合を実行
となります。
そして、第1引数が条件式の場合に限り、戻り値の論理値を、
TRUE → 1
FALSE → 0
と数値に変換して判定しているのです。
これが、質問欄の後半の2つの数式の挙動の違いの原因なのです。

=IF(D4=TRUE,"OK!","No!")

は、第1引数は「D4=TRUE」という条件式です。
この場合、戻り値は必ずTRUE/FALSE(=1/0)です。
(ただし、D4にエラーが入っている場合を除く)
一方、

=IF(D4,"OK!","No!")

の方は、第1引数は「D4」で、これはセルD4の値そのものです。
で、前述のように、IF関数は第1引数を数値として判定するので、このD4が数値(と論理値)以外の場合(文字列など)はエラーになります。
D4が数値(と論理値)の場合は、前述のように、「0」かそれ以外かで判定され、真/偽の場合のいづれかを実行して表示します。

このIF関数の第1引数が数値として判定されているということを利用した例が以下のようなものです。
例えば、A列に数値が1つでもあれば"OK"、1つもなければ(つまり0)"NG"を表示する場合、意味を考えれば、

=IF(COUNT(A:A)>0,"OK","NG")

ですが、これを、

=IF(COUNT(A:A),"OK","NG")

と、A列の数値の個数(COUNT関数の戻り値)そのもので判定することが出来るわけです。

以上、長くなりましたが、補足説明でした。

こんにちは。maruru01です。

IF関数について、少し補足説明します。
IF関数は、No.1にもあるように、

=IF(条件式,真の場合,偽の場合)

という書式ですが、

=IF(条件式,真の場合)

と、偽の場合を省略することが出来ます。
ここで偽の場合は、FALSEという論理値を返します。
つまり、質問欄の1つ目の例に当たります。
なお、

=IF(条件式)

と、真の場合も省略することは出来ず、

=IF(条件式,,偽の場合)

と、空欄にすると、真の場合は数値の「0」を返すことになります。
ちなみに、偽...続きを読む

QIF(B1="","",A1*B1)の合計

セルC1に次の計算式が入っています。
IF(B1="","",A1*B1)
行10までコピーされています。
列Cを
=C2+C4+C6+C8+C10
のうように個別に加算したいと思っています。
B列に空白がある場合、
#VALUE!のエラーとなります。
IF(B1="","",A1*B1)
の計算式を残したままで
解決方法はありませんか?

Aベストアンサー

加算するセル数が30個以内なら
=SUM(C2,C4,C6,C8,C10)
加算するセルが偶数行なら
=SUMPRODUCT((MOD(ROW(C2:C10),2)=0),(C2:C10))
元の奇数行のセルの積の合計なら
=SUMPRODUCT((MOD(ROW(B1:B10),2)=1)*1,(A1:A10),(B1:B10))


人気Q&Aランキング

おすすめ情報