ユーザー定義関数について

解決


もと  2007-06-18 07:54:04  No: 136741

下記のユーザー定義関数を作成したのですが
ワークシートのセルで#VALUE!のエラーがでます。
宜しくお願いします。

Function find1(検索 As Range) As Variant 
Dim objRange As Range 
Dim target As Variant 
target = 検索.Value 
Set objRange = Columns("E").Find(target) 

find1 = objRange.Value 
End Function


大吉末吉  2007-06-18 19:31:46  No: 136742

意味の良く分からない関数ですね・・・

「指定されたセルの値と同じ値のセルがあったらそのセルの値を返す」?

> ワークシートのセルで#VALUE!のエラーがでます。

見つからなかった時の処理が無いからでは?
#上記関数は、見つからない時、エラーになりますね。


マルチポスト  2007-06-18 21:37:57  No: 136743

マルチポスト
http://pc11.2ch.net/test/read.cgi/tech/1165574205/466


もと  2007-06-19 05:41:27  No: 136744

一時的にfindメソッドの使い方の勉強のために
このような関数を作りました。
E列には、絶対見つかる、value値又はtextを入れてます。
文法上の間違いですか?

2CHにも、投稿してるため、マルチポストと指摘されてますが
FAQ掲示板には、こちらだけですので、宜しくお願いします。


大吉末吉  2007-06-19 06:44:21  No: 136745

少なくとも、私が試した限りでは、
> E列には、絶対見つかる、value値又はtextを入れてます。
の時には「#VALUE!のエラー」は発生しませんでした。

> findメソッドの使い方の勉強のためにこのような関数を作りました。

とりあえず、デバッグはやってますか?

> 2CHにも、投稿してるため、マルチポストと指摘されてますが
> FAQ掲示板には、こちらだけですので、宜しくお願いします。
「FAQ掲示板」って何です?

「2CH」での定義がどうなっているのか知りませんが、
どこであろうと、「同じ内容の質問を別の場所に投稿」したら、マルチポストだと思いますけど・・・


もと  2007-06-19 07:02:14  No: 136746

大吉末吉 様
返信ありがとう、ございます。
マルチポストの件、今後反省します。

試されて、エラーが出なかったのことですが
当方、excel2000では無理なのかな。

正直なところ、VBの本は良く読むのですが
自分で書いたのは初めてなのです。
動く感動を味わいたいのですが。


A24  2007-06-19 09:52:50  No: 136747

わたしも試した限りではエラーは発生せずに正常に動きました。
(Functionで作る意味が分かりませんでしたが)

念のため、呼び出し側のコードも書いていただいてよろしいですか?


もと  2007-06-19 14:35:55  No: 136748

RE:A24様
ぶっちゃけ、初心者過ぎて恥ずかしいのですが書いてみます。

自作関数←標準モジュールに入力しました
  ↓
ワークシート1のE列に  適当な英数字を入力
  ↓

ワークシート1での呼び出しは
A10に検索文字がある場合は
=find1(A10)としてます。(もちろんE列には該当する文字があります)

うまく動作したら、コードを増やそうとおもったのですが、
VB初めてで、失敗しました。


特攻隊長まるるう  2007-06-19 19:58:36  No: 136749

>=find1(A10)としてます。
それでは動きません。実際に使っているコードを正確に書いてください。
…というかデバッグして1つ1つの処理内容を確認してください。
大吉末吉さんにも聞かれてますが、デバッグしてますか?してるなら
その結果を教えてください。

[Excel VBA]
Function find1(検索 As Range) As Variant
    Dim objRange As Range
    Dim target As Variant
    target = 検索.Value
    MsgBox 検索.Worksheet.Name & 検索.Address & " (" & CStr(target) & ")を探します。"
    
    MsgBox Columns("E").Worksheet.Name & Columns("E").Address & "を対象とします。"
    Set objRange = Columns("E").Find(target)
    
    If objRange Is Nothing Then
        MsgBox "見つかりませんでした。"
    Else
        MsgBox objRange.Address & "に見つかりました。"
        find1 = objRange.Value
    End If
End Function


大吉末吉  2007-06-19 20:03:22  No: 136750

> 当方、excel2000では無理なのかな。

Excel2000で試してみました。エラーですね・・・
#Excel2993なら動作しました。

MSの技術情報を見ると、
「Excel のユーザー定義関数の制限について」
http://support.microsoft.com/kb/170787/ja
に、
------------------------------------------------------------
次の処理が実行できません。 
(中略)
・プロパティの設定およびほとんどのメソッドの実行。 
------------------------------------------------------------
ってありますね。

つまり、Findメソッドは、
Excel2000では、この「ほとんど」に入っていて、
Excel2003は、「ほとんど」から外れた・・・
って事なんでしょうかね。

> 一時的にfindメソッドの使い方の勉強のために

なら、Functionにしてセルに設定するのは止めて、マクロ(Sub)で試してみるとか・・・


A24  2007-06-19 20:04:09  No: 136751

間違ってないような気がしますが…。
確認のため、標準モジュールに次のコードを入れてみてください。
Private Sub Find_Prac()
Dim hit As Variant

hit = find1(Range("A10")) 
MsgBox hit

End Sub

セルA10に検索文字を入れてから、このコードをF8キーを押しながら、1行ずつ
進めてください。どこがおかしいか分かると思いますが。


特攻隊長まるるう  2007-06-19 20:08:59  No: 136752

>=find1(A10)としてます。
…というかセルに直接書いてるのではなかろうか。。。


もと  2007-06-20 06:07:59  No: 136753

ご返事遅くなりすいませんでした。
マクロにしたらの件ですが、仕事で使いたいので、上司や外部取引先などの
方でマクロ(マクロボタン)に抵抗を感じてる方の為の、配慮です。
じきをみて、Excel2003で試してみます。
コードに間違ってないとのことで若干自信がつきました
皆さん、ご意見大変ありがとうございました。
なお、デバッグの件もExcel2003で勉強しようと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加