質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

3294閲覧

Range型を返す関数でエラーがでる。

cafeore_nmti

総合スコア28

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2019/02/08 15:37

編集2019/02/08 15:47

こんばんは、数時間考えても解決できなかったため質問させていただきます。
下に表と問題のコードを載せています。

表から、「あいう」を検索し、結果のセルに「はじめ」or「おわり」が含まれていたらそのセル位置をRange型で返す関数を作ったのですが、最後の「END FUNCTION」の部分で『実行時エラー '91': オブジェクト変数または With ブロック変数が設定されていません。』というエラーが出ます。

Range型を代入する際は"set"を頭につけるというのは下記コード内では全てやっているはずですが、このエラーの原因はなんでしょうか…?

必要な変数の型は間違ってないように見えるのですが、「END FUNCTION」でエラーがでるということは、上手く値を返せてないということでしょうか?

ABC
1
2あいう はじめ6
3あいう おわり10    

vba

1' 計算結果の表示処理 2Sub displayResult() 3 ' 開始セル、終了セルの場所を格納する変数を宣言 4 Dim 開始セル As Range, 終了セル As Range 5 ' 計算に必要な値が格納されているセルを検索 6 開始セル = fnSchWord("あいう", "はじめ") 7 終了セル = fnSchWord("あいう", "おわり") 8 ' 両方とも結果ありの場合、計算結果を表示 9 If Not 開始セル Is Nothing And Not 終了セル Is Nothing Then 10 ' C3セルに計算結果を表示 11 Range("C3").Value = 終了セル.Offset(1, 0).Value - 開始セル.Offset(1, 0).Value 12 End If 13End Sub 14 15' A列からWord1を検索し、そのセルにWord2が含まれている場合、セルの場所を返す処理 16Function fnSchWord(ByVal Word1 As String, ByVal Word2 As String) As Range 17 ' 変数宣言 18 Dim rngSearchPlace As Range, rngFirstCell As Range 19 ' A列からWord1を検索 20 Set rngSearchPlace = Range("A:A").Find(What:=Word1, LookAt:=xlPart) 21 ' 結果有無判定 22 If Not rngSearchPlace Is Nothing Then 23 ' 比較用に1つめのセルの場所を保管 24 Set rngFirstCell = rngSearchPlace 25 ' ループで検索 26 Do 27 ' 検索したセルにWord2が含まれているか 28 If InStr(rngSearchPlace.Text, Word2) > 0 Then 29 ' そのワードの場所を返す 30 Set fnSchWord = rngSearchPlace 31 End If 32 ' 次のWord1を検索してセルの場所を代入 33 Set rngSearchPlace = Range("A:A").FindNext(rngSearchPlace) 34 ' セルのアドレスが同じになった場合、ループを抜ける 35 Loop While rngSearchPlace.Address <> rngFirstCell.Address 36 Else 37 ' 結果がない場合の処理 38 Debug.Print Word1 & "の検索結果がありません" 39 End If 40 41End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

返す方のRangeにもSetが必要になります。

VBA

1 開始セル = fnSchWord("あいう", "はじめ") 2 終了セル = fnSchWord("あいう", "おわり")

VBA

1 Set 開始セル = fnSchWord("あいう", "はじめ") 2 Set 終了セル = fnSchWord("あいう", "おわり")

投稿2019/02/08 16:41

crowmt

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cafeore_nmti

2019/02/09 00:24

盲点でした。こんな簡単なことに時間を取られてしまうとは…。 ありがとうございました(__)
crowmt

2019/02/09 01:38

解決できて何よりです。 十分、分かってはいらっしゃってると思います。 「Range型を代入する際は"set"を頭につける」ってご自分でおっしゃってますので。 あと一捻りが結構でないですよね(^^;) Offsetのところもエラーになるかと思いますが、サクッと修正できると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問