Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3885 / 13644 ツリー ←次へ | 前へ→

【59657】こういうユーザー定義関数(Function)は作れますか? nagao 08/12/30(火) 3:28 質問[未読]
【59658】Re:こういうユーザー定義関数(Function)は... 甘木 08/12/30(火) 6:27 回答[未読]
【59659】Re:こういうユーザー定義関数(Function)は... nagao 08/12/30(火) 9:02 お礼[未読]
【59660】Re:こういうユーザー定義関数(Function)は... 甘木 08/12/30(火) 9:44 発言[未読]
【59661】定義済の関数は使えない?(引き続き質問さ... nagao 08/12/30(火) 15:42 質問[未読]
【59662】Re:定義済の関数は使えない?(引き続き質問... かみちゃん 08/12/30(火) 15:48 発言[未読]
【59663】Re:定義済の関数は使えない?(引き続き質問... nagao 08/12/30(火) 17:38 お礼[未読]
【59664】Re:定義済の関数は使えない?(引き続き質問... SS 08/12/30(火) 18:20 発言[未読]
【59665】Re:定義済の関数は使えない?(引き続き質問... 甘木 08/12/30(火) 22:46 回答[未読]
【59666】Re:定義済の関数は使えない?(引き続き質問... かみちゃん 08/12/30(火) 22:57 発言[未読]
【59667】Re:定義済の関数は使えない?(引き続き質問... 甘木 08/12/30(火) 23:28 発言[未読]
【59668】Re:定義済の関数は使えない?(引き続き質問... かみちゃん 08/12/30(火) 23:39 発言[未読]
【59669】Re:定義済の関数は使えない?(引き続き質問... 甘木 08/12/30(火) 23:58 発言[未読]
【59670】Re:定義済の関数は使えない?(引き続き質問... かみちゃん 08/12/31(水) 0:04 発言[未読]
【59671】Re:定義済の関数は使えない?(引き続き質問... 甘木 08/12/31(水) 1:24 発言[未読]
【59672】Re:定義済の関数は使えない?(引き続き質問... かみちゃん 08/12/31(水) 10:50 発言[未読]
【59673】「#NUM!」が出る? nagao 08/12/31(水) 10:55 質問[未読]
【59674】Re:「#NUM!」が出る? かみちゃん 08/12/31(水) 11:09 発言[未読]
【59675】Re:「#NUM!」が出る? ぱくぱく名無しさん 08/12/31(水) 11:14 発言[未読]
【59676】Re:「#NUM!」が出る? nagao 08/12/31(水) 11:37 お礼[未読]
【59678】Re:「#NUM!」が出る? かみちゃん 08/12/31(水) 11:39 発言[未読]
【59679】Re:「#NUM!」が出る? nagao 08/12/31(水) 11:59 お礼[未読]
【59686】Re:「#NUM!」が出る? ぱくぱく名無しさん 09/1/2(金) 13:34 発言[未読]
【59677】Re:「#NUM!」が出る? かみちゃん 08/12/31(水) 11:37 発言[未読]

【59657】こういうユーザー定義関数(Function)は作...
質問  nagao  - 08/12/30(火) 3:28 -

引用なし
パスワード
   初めて、質問させて下さい。VLOOKUPと似ているのですが
次のような値を返すユーザー定義関数(Function)
が作れると私の仕事がとても楽になり助かります。(私自信トライ
一応したのですが・・・)

1.第一引数はあるセルの値(例 A1)
2.第二引数はある列の範囲(例 B1:B10)で第一引数(A1)
  の値に探索合致するものがあるかチェックする(最初に合致したものだけで
  良い)。
3.第三引数は数値。そして上記2.でチェックしたものが合致するときは
  第三引数が1ならば一つ右のセル値を返す。例えば第二引数列範囲のB5に
  第一引数(A1)が合致するなら一つ右のセル値C5、2ならば二つ右の
  セル値D5の値を3ならばE5のセル値を返す。もし第一引数(A1)と合致するも
  のが無いときはゼロ値を返す。

************************************************************
  Function MyFunc1(Val1, Val2 As Range, Val3 As Integer)
  ...
  ...
  ...
  End Function
************************************************************
VLOOKUPではいちいち並び替えが必要なのがわずわらしいです。
もしこの関数がつくれるならいろいろ自分の演算を盛り込みたい
と思っています。

以上よろしくお願いします。

【59658】Re:こういうユーザー定義関数(Function)...
回答  甘木  - 08/12/30(火) 6:27 -

引用なし
パスワード
   ▼nagao さん:

>VLOOKUPではいちいち並び替えが必要なのがわずわらしいです。
ここが意味不明です。
検索の型にFalseを指定し、並び替えなどしないのが普通です。
質問内容はVLOOKUPとエラー関数の組み合わせで代替できる内容です。
もう一度、VLOOKUPのヘルプをよく読まれることをお勧めします。

【59659】Re:こういうユーザー定義関数(Function)...
お礼  nagao  - 08/12/30(火) 9:02 -

引用なし
パスワード
   すみません、勘違いしていました。trueあるいはfalse指定に
関係なくいつも検索されるデータ側は並び替えしなければ
いけないものと思っていました。ご忠告ありがとうございます。
(はっきりしませんが以前のマニュアル(Office97以前?)ではそう
あったよう記憶してしまいました)

【59660】Re:こういうユーザー定義関数(Function)...
発言  甘木  - 08/12/30(火) 9:44 -

引用なし
パスワード
   思い込みが解けてよかったですね。
ちなみに、Trueの場合は整列しないと結果が変わってきます。
めったに使いませんが。
なお、Match関数とIndex関数を組み合わせても可能かもしれませんね。

【59661】定義済の関数は使えない?(引き続き質問...
質問  nagao  - 08/12/30(火) 15:42 -

引用なし
パスワード
   すみません、引き続き教えてください。

最近、エクセルを使う仕事ができ,にわか勉強でExcel VBAをトライ
しています。VLOOKUPに関連して次のような関数を作ってみました。

'----------------------------------------------------------------------

Option Explicit

Function time_to_data1(Id As Integer, Data_Range As Range, Line As Integer)
 Dim return_val
 return_val = VLookup(Id, Data_Range, Line, False)
 If return_val = "#N/A" Then
  time_to_data1 = 0
 Else
  time_to_data1 = return_val
 End If
 
End Function

'------------------------------------------------------------------------
コンパイルエラー「SubあるいはFunctionが定義されていない」
が出て"Vlookup"の場所が反転します。定義済のVLOOKUPが使えない
ということですがVLOOKUPをユーザプログラムで使うことはできないのしょうか?

多分、解説書のどこかには説明があるはずで、勉強不足をお許しください。

【59662】Re:定義済の関数は使えない?(引き続き質...
発言  かみちゃん E-MAIL  - 08/12/30(火) 15:48 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>が出て"Vlookup"の場所が反転します。定義済のVLOOKUPが使えない
>ということですがVLOOKUPをユーザプログラムで使うことはできないのしょうか?

Application.WorksheetFunction.VLookup
もしくは、
Application.VLookup
とします。

なお、使用できるワークシート関数は限られていますので、詳しくは、ヘルプの
「Visual Basicで使用ワークシート関数一覧」を参照してください。

また、以下のURLも参考になると思います。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_ws_kansu.html#WorksheetFunction
http://www.moug.net/tech/exvba/0100035.htm

【59663】Re:定義済の関数は使えない?(引き続き質...
お礼  nagao  - 08/12/30(火) 17:38 -

引用なし
パスワード
   かみちゃんさんどうもありがとうございます。
ここの部分は解決しました。

ただVLOOKUPの戻り値がうまく使えなく四苦八苦
しています。整理してから再度質問させて下さい。

【59664】Re:定義済の関数は使えない?(引き続き質...
発言  SS  - 08/12/30(火) 18:20 -

引用なし
パスワード
   ▼nagao さん:

試しにこんな感じで作ってみました。
要求事項を満たしているでしょうか?

Function MyFunc1(Val1, Val2 As Range, Val3 As Integer)
  Dim i As Long, j As Long, k As Long, m As Long
  
  'エラー処理
  If Val3 < 0 Or Val3 > 3 Then
    MyFunc1 = "Error"
  End If
    
  With Val2
    j = .Row
    k = .Row + .Rows.Count - 1
    m = .Column
  End With
  
  For i = j To k
    If Cells(i, m).Value = Val1.Value Then
      MyFunc1 = Cells(i, m + Val3).Value
      Exit Function
    End If
  Next i
  MyFunc1 = 0
End Function

【59665】Re:定義済の関数は使えない?(引き続き質...
回答  甘木  - 08/12/30(火) 22:46 -

引用なし
パスワード
   ▼nagao さん:
>ただVLOOKUPの戻り値がうまく使えなく四苦八苦
>しています。整理してから再度質問させて下さい。
先走るようで恐縮ですが、エラー対応ということはわかっていますので、
少し書いてみます。

すでに別案が示されていますが、Vlookupというワークシート関数を
使う前提でエラー対応の仕方を書いてみます。

Function time_to_data1(Id As Integer, Data_Range As Range, Line As Integer)
 Dim return_val
 
 On Error Resume Next
 return_val = Application.WorksheetFunction.VLookup(Id, Data_Range, Line, False)
 On Error GoTo 0
 
 If IsEmpty(return_val) Then
  time_to_data1 = 0
 Else
  time_to_data1 = return_val
 End If

End Function

なお、一般機能であれば、下記のように書くところです。
E1セル
=IF(ISERROR(VLOOKUP(D1,$A$1:$B$3,2,FALSE)),0,
  VLOOKUP(D1,$A$1:$B$3,2,FALSE))

【59666】Re:定義済の関数は使えない?(引き続き質...
発言  かみちゃん E-MAIL  - 08/12/30(火) 22:57 -

引用なし
パスワード
   こんにちは。かみちゃん です。

▼甘木 さん:
>▼nagao さん:
>>ただVLOOKUPの戻り値がうまく使えなく四苦八苦
>>しています。整理してから再度質問させて下さい。
>先走るようで恐縮ですが、エラー対応ということはわかっていますので、
>少し書いてみます。
>
>すでに別案が示されていますが、Vlookupというワークシート関数を
>使う前提でエラー対応の仕方を書いてみます。

以下のようにすると、もう少し短くなるような気がします。

Function time_to_data1(Id As Integer, Data_Range As Range, Line As Integer)
 time_to_data1 = 0
 On Error Resume Next
 time_to_data1 = Application.WorksheetFunction.VLookup(Id, Data_Range, Line, False)
 On Error GoTo 0
End Function

以下のような感じの使い方になると思います。

Sub Sample()
 MsgBox time_to_data1(100, Range("A1:B10"), 2)
End Sub

もし、勘違いしていましたら、ご指摘ください。

【59667】Re:定義済の関数は使えない?(引き続き質...
発言  甘木  - 08/12/30(火) 23:28 -

引用なし
パスワード
   コードの短さという点からは、かみちゃんさんのご指摘のとおりです。

関連してエラー対応という観点からいくつかメモしておきます。
1.まず、On Error Resume Next の意味を理解してください。
 エラーが発生してもそれにかまわず(止まらず)次の行に制御を
 進めるというステートメントです。既にご存知かもしれませんが。

2. On Error Resume Next
  はむやみに使わず、なおかつ、できるだけ最小限の範囲で使い、
  On Error GoTo 0
でできるだけ早い時点で元に戻す習慣をつけておいてください。
宣言しっぱなしにしておくと、意図しない部分でのエラーを隠蔽してしまいますから。プロシージャーから抜けると元に戻りはしますが、明示的に書いたほうが
良いと個人的には思います。(異なる意見も有り得ます。)

3. またエラー部分の判定は
  If return_val Is Nothing Then は NG
  If return_val = "" Then    は OK
であることも注意しておいてください。

【59668】Re:定義済の関数は使えない?(引き続き質...
発言  かみちゃん E-MAIL  - 08/12/30(火) 23:39 -

引用なし
パスワード
   こんにちは。かみちゃん です。

▼甘木 さん:
>コードの短さという点からは、かみちゃんさんのご指摘のとおりです。
>
>関連してエラー対応という観点からいくつかメモしておきます。
>1.まず、On Error Resume Next の意味を理解してください。
> エラーが発生してもそれにかまわず(止まらず)次の行に制御を
> 進めるというステートメントです。既にご存知かもしれませんが。
>
>2. On Error Resume Next
>  はむやみに使わず、なおかつ、できるだけ最小限の範囲で使い、
>  On Error GoTo 0
>でできるだけ早い時点で元に戻す習慣をつけておいてください。
>宣言しっぱなしにしておくと、意図しない部分でのエラーを隠蔽してしまいますから。プロシージャーから抜けると元に戻りはしますが、明示的に書いたほうが
>良いと個人的には思います。(異なる意見も有り得ます。)
>
>3. またエラー部分の判定は
>  If return_val Is Nothing Then は NG
>  If return_val = "" Then    は OK
>であることも注意しておいてください。

いろいろとメモを書かれているのですが、
 Dim return_val
という宣言をしているのであれば、
 On Error Resume Next
 On Error GoTo 0
でエラートラップをしているのには、違和感があります。

エラーが発生したときは、
 return_val
には、エラー値が格納されることを利用すればいいので、

> On Error Resume Next
> はむやみに使わず、なおかつ、できるだけ最小限の範囲で使い

と言う観点では、今回の場合は、使わないほうがいいということになります。

Function time_to_data1(Id As Integer, Data_Range As Range, Line As Integer)
 Dim return_val

 return_val = Application.VLookup(Id, Data_Range, Line, False)

 If IsError(return_val) Then
  time_to_data1 = 0
 Else
  time_to_data1 = return_val
 End If
End Function

 Dim return_val
は、
 Dim return_val As Variant
と宣言しているのと同じですが、
 Application.VLookup
などと、記述する場合に、エラー値が得られるので、それで分岐するときには
重宝すると思います。

以上、余計なコメントとは思いましたが、気になりましたので、書かせていただきました。

【59669】Re:定義済の関数は使えない?(引き続き質...
発言  甘木  - 08/12/30(火) 23:58 -

引用なし
パスワード
   ご指摘ありがとうございます。

▼かみちゃん さん:
>いろいろとメモを書かれているのですが、
はい、少し広めに一般論として書きました。
ですから今回の最適な解ではないかもしれませんが、
エラーがらみでそれなりに役立つ知識だと思い書きました。

一点だけ教えてください。
>エラーが発生したときは、
> return_val
>には、エラー値が格納されることを利用すればいいので、
これはどのように判別するのでしょうか。

【59670】Re:定義済の関数は使えない?(引き続き質...
発言  かみちゃん E-MAIL  - 08/12/31(水) 0:04 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>いろいろとメモを書かれているのですが、
>はい、少し広めに一般論として書きました。
>ですから今回の最適な解ではないかもしれませんが、
>エラーがらみでそれなりに役立つ知識だと思い書きました。

私も最近、ワークシート関数をVBAで使う際に発生するエラー発生時の対処方法を
理解したところですので、私の中の理解で書かせていただきました。
その過程で、
Dim return_val
で型指定なしで宣言しているのに、
On Error 〜
を使うのは、間違っていないが、違和感があるということを教えてもらったので、
余計なことと思いつつ、それを書かせていただきました。

>>エラーが発生したときは、
>> return_val
>>には、エラー値が格納されることを利用すればいいので、
>これはどのように判別するのでしょうか。

[59668]で、サンプルコードを載せていますが、
If IsError(return_val) Then
で判断しています。

【59671】Re:定義済の関数は使えない?(引き続き質...
発言  甘木  - 08/12/31(水) 1:24 -

引用なし
パスワード
   ご指摘ありがとうございます。
Application.WorksheetFunction.VLookup
もしくは、
Application.VLookup
とします。
と書いておられたので、前者を念頭においていたのですが、
エラー対応については後者に限定した話だったのですね。

Application.Worksheetfunction.Match と
Application.Match などの振る舞いの違いと同じ話ですね。

質問者さんにわかるような説明が必要ですね。

私はどちらかといえばエラー対応の基礎のほうから固めていかれることを
お勧めしたい気持ちです。

いずれにせよ、ご指摘ありがとうございました。

【59672】Re:定義済の関数は使えない?(引き続き質...
発言  かみちゃん E-MAIL  - 08/12/31(水) 10:50 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>Application.WorksheetFunction.VLookup
>もしくは、
>Application.VLookup
>とします。
>と書いておられたので、前者を念頭においていたのですが、
>エラー対応については後者に限定した話だったのですね。

質問者のnagaoさんが[59661]で提示されたコードに
Dim return_val
とあったものを甘木さんがそのまま流用されているのかと思うのですが、
そういう宣言をするならば、

[59668]で申し上げたとおり
> On Error Resume Next
> はむやみに使わず、なおかつ、できるだけ最小限の範囲で使い
という観点からすると、

On Error Resume Next
等を書かず、
Application.WorksheetFunction.VLookup
ではなく、
Application.VLookup
という記述にしたほうがよいという考えでした。

なお、[59662]の
>Application.WorksheetFunction.VLookup
>もしくは、
>Application.VLookup
>とします。
については、Visual Basicでワークシート関数を使用する方法を書かせていただいただけで、
今、読み返すと、その後の分岐処理
If return_val = "#N/A" Then
もまずいですね。(←もコメントしておげはよかったかもしれません)

>Application.Worksheetfunction.Match と
>Application.Match などの振る舞いの違いと同じ話ですね。

そのとおりです。
私も、別の掲示板で先日、指摘をいただき、勉強させていただいたところです。

>質問者さんにわかるような説明が必要ですね。

私の説明が不十分で、質問者のnagaoさんにわかりづらい説明になってまい、
また、結果的に甘木さんの揚げ足をとるような形になってしまったならば、
私の本意ではありませんので、謝りたいと思います。

>私はどちらかといえばエラー対応の基礎のほうから固めていかれることを
>お勧めしたい気持ちです。

同感です。
私も
> On Error Resume Next
> はむやみに使わず、なおかつ、できるだけ最小限の範囲で使い
については、賛成ですので。

【59673】「#NUM!」が出る?
質問  nagao  - 08/12/31(水) 10:55 -

引用なし
パスワード
   皆さんから検討されていただいて感謝しています。

こういうことを言われているのかなと理解
する程度にしか今はできていなく、
内容良く把握できていません。

SSさんの作っていただいたものは列数が3以上になると
うまくデータを取れないと思うのですが? 私の質問内容
が不備でしたが実際列数の指定はマックス10位になります。

次は甘木さんが示していただいたサンプルコードですが。
セル指定「=time_to_data2(A21,AI3:AP53,3)」で#NUM!エラー
が出ます。VLOOLUP「=VLOOKUP(A21,AI3:AP53,3,FALSE)」指定
なら問題ないのですが。#N/Aはゼロに置き換えられます。

尚、データ範囲はセル範囲ではなく名前名で指定できれば
と思っています。それならドラッグしてもセル位置がずれる
ことは無いと思いますので。
'------------------------------------------------------------------------
Function time_to_data2(Id As Integer, Data_Range As Range, Line As Integer)
 Dim return_val

 On Error Resume Next
 return_val = Application.WorksheetFunction.VLookup(Id, Data_Range, Line, False)
 On Error GoTo 0

 If IsEmpty(return_val) Then
  time_to_data2 = 0
 Else
  time_to_data2 = return_val
 End If

End Function

【59674】Re:「#NUM!」が出る?
発言  かみちゃん E-MAIL  - 08/12/31(水) 11:09 -

引用なし
パスワード
   こんにちは。かみちゃん です。

横から失礼します。

>次は甘木さんが示していただいたサンプルコードですが。
>セル指定「=time_to_data2(A21,AI3:AP53,3)」で#NUM!エラー
>が出ます。

甘木さんのご提案なので、私が横からコメントすることは恐縮なのですが、
A21セルに入っている値が、Integer型である-32,768 〜 32,767の範囲外ということではないでしょうか?

もし、そういう値を扱うことがあるならば、
Function time_to_data2(Id As Integer, Data_Range As Range, Line As Integer)
の部分を
Function time_to_data2(Id As Double, Data_Range As Range, Line As Integer)
としてみてはいかがでしょうか?

>尚、データ範囲はセル範囲ではなく名前名で指定できれば

可能です。試してみてください。

【59675】Re:「#NUM!」が出る?
発言  ぱくぱく名無しさん  - 08/12/31(水) 11:14 -

引用なし
パスワード
   nagao さん、こんにちは。

>が出ます。VLOOLUP「=VLOOKUP(A21,AI3:AP53,3,FALSE)」指定
>なら問題ないのですが。#N/Aはゼロに置き換えられます。

マクロじゃなくて単なる数式ですが。
やりたいことは、
 =If(COUNTIF(AI3:AI53,A21)=0,0,VLOOKUP(A21,AI3:AP53,3,FALSE))
という式で良いのではないかと。

【59676】Re:「#NUM!」が出る?
お礼  nagao  - 08/12/31(水) 11:37 -

引用なし
パスワード
   ▼ぱくぱく名無しさん さん:
>マクロじゃなくて単なる数式ですが。
>やりたいことは、
> =If(COUNTIF(AI3:AI53,A21)=0,0,VLOOKUP(A21,AI3:AP53,3,FALSE))
>という式で良いのではないかと。


ぱくぱくさん、応答有難うございます。

実は、もしユーザーFunctionプログラムが作れるなら
この中に他にユーザー機能を付け加えたいと思っています。
ただあまり拡張することは危惧もしているのですが。

【59677】Re:「#NUM!」が出る?
発言  かみちゃん E-MAIL  - 08/12/31(水) 11:37 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>が出ます。VLOOLUP「=VLOOKUP(A21,AI3:AP53,3,FALSE)」指定
>>なら問題ないのですが。#N/Aはゼロに置き換えられます。
>
>マクロじゃなくて単なる数式ですが。
>やりたいことは、
> =If(COUNTIF(AI3:AI53,A21)=0,0,VLOOKUP(A21,AI3:AP53,3,FALSE))
>という式で良いのではないかと。

[59658]ですでに甘木さんからも疑問が出ているのですが、
私も、VBAのエラーの対処方法だけに着目していたのですが、今回、そもそもなぜ、
ユーザー定義関数を使いたいのかがわかりません。

[59661]でnagaoさんが
> 最近、エクセルを使う仕事ができ,にわか勉強でExcel VBAをトライ
> しています。VLOOKUPに関連して次のような関数を作ってみました。
ということで、勉強のために作ってみたというなら、理解はできますが、以下少し
関数だけで対応する方法を書いてみます。

ぱくぱく名無しさんの方法とは別解ですが、
=IF(ISNA(VLOOKUP(A21,AI3:AP53,3,FALSE)),0,VLOOKUP(A21,AI3:AP53,3,FALSE))
ということで、VLOOKUP関数の戻り値が#N/Aならば、ISNA関数がTrueになるので、0とする
という数式にすればいいことだと思います。

少し数式が長くなるので、これをもっと短くすると、ぱくぱく名無しさんの方法になります。

あくまで、ユーザー定義関数の勉強のためという趣旨ならば、読み飛ばしてください。

【59678】Re:「#NUM!」が出る?
発言  かみちゃん E-MAIL  - 08/12/31(水) 11:39 -

引用なし
パスワード
   こんにちは。かみちゃん です。

横から失礼します。

>実は、もしユーザーFunctionプログラムが作れるなら

[59674]で今回のユーザー定義関数のエラーの原因と対処方法を書いておいたのですが・・・

【59679】Re:「#NUM!」が出る?
お礼  nagao  - 08/12/31(水) 11:59 -

引用なし
パスワード
   すみません、Idは7桁数字でIntegerではなく
DoubleかLongでした。有難うございます、解決です。

【59686】Re:「#NUM!」が出る?
発言  ぱくぱく名無しさん  - 09/1/2(金) 13:34 -

引用なし
パスワード
   nagao さん、皆さん、明けましておめでとうございます。

>> =If(COUNTIF(AI3:AI53,A21)=0,0,VLOOKUP(A21,AI3:AP53,3,FALSE))
>実は、もしユーザーFunctionプログラムが作れるなら
>この中に他にユーザー機能を付け加えたいと思っています。
>ただあまり拡張することは危惧もしているのですが。
ユーザー機能がどのようなものを想定されているのかわかりませんが、上記式をマクロにするとこうなります(列番号のチェックも入れてあります)。

Function VL_Func(arg1 As Range, arg2 As Range, arg3 As Long) As Variant
  'arg#の並び及び内容はVlookupと同じなので説明は省略
  '
  Select Case arg3
   Case 1 To arg2.Columns.Count
     With Application.WorksheetFunction
      '左端列(=キー列)で検索して、無ければ無条件で0、あればVlookup
      If .CountIf(arg2.Columns(1), arg1) = 0 Then
        VL_Func = 0
      Else
        VL_Func = .VLookup(arg1, arg2, arg3, False)
      End If
     End With
   Case Else
     VL_Func = "VLOOKUPの範囲外" '列番号が不適切
  End Select
End Function

3885 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free