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

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

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

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

Q&A

解決済

3回答

2409閲覧

ユーザーフォーム Function Sub

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2018/12/05 04:23

前提・実現したいこと

現在ユーザーフォームからボタンをクリックして
シートの内容を削除するよう実装しています。
CallではなくFunctionで呼び出したいです。

発生している問題・エラーメッセージ

オブジェクトは、このプロパティまたはメソッドをサポートしていません

エラーが出るソースコードではFunctionを使用しているのですが、
呼び出し方をCall All_Clear_Sheet (CONVERT_SHEET)
にして関数側をSub All_Clear_Sheet (CONVERT_SHEET)
にした場合にはエラーは表示されません。

何故エラーが出力されているのでしょうか。
よろしくお願いします。

該当のソースコード

vba

1'シートの内容を削除 2Function All_Clear_Sheet(CONVERT_SHEET As Worksheet) 3 CONVERT_SHEET.Activate 4 CONVERT_SHEET.Cells.Clear 5End Function 6 7'ボタンを実行 8Private Sub CommandButton1_Click() 9Dim CONVERT_BOOK As Workbook 10Dim CONVERT_SHEET As Worksheet 11 12Set CONVERT_BOOK = ThisWorkbook 13Set CONVERT_SHEET = CONVERT_BOOK.Worksheets("変換") 14 15All_Clear_Sheet (CONVERT_SHEET) 16End Sub 17

補足情報(FW/ツールのバージョンなど)

office2010

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

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

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

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

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

guest

回答3

0

解決済みですが、微妙に間違いがあるので、指摘しておきます。

引数を持つSubプロシージャを呼び出すとき、または、引数を持つFunctionプロシージャを戻り値を受け取らずに呼び出すときは、

Call All_Clear_Sheet(CONVERT_SHEET)

または、CAll を省略するときは、

All_Clear_Sheet CONVERT_SHEET

です。
Callで呼び出すときは、プロシージャ名のあとの () は必須。
Callを省略した時は、プロシージャ名のあとに()は不必要です。
そういう仕様です。

All_Clear_Sheet (CONVERT_SHEET)

としたら、Sub でも Function でも、

オブジェクトは、このプロパティまたはメソッドをサポートしていません

のエラーになります。Callに関してSubもFunctionも違いはないです。

もちろん戻り値を受け取ることはFunctionしかできませんが。

下記の公式の解説をお読みください。上記のことがすべて記述してあります。

Call ステートメント | Microsoft Docs

投稿2018/12/05 08:20

編集2018/12/05 13:02
hatena19

総合スコア33692

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

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

0

オブジェクトは、このプロパティまたはメソッドをサポートしていません

このエラーがなぜ発生したかについて補足をしておきます。

根本原因は、hatena19さんの回答の通り呼び出し方が間違っているからです。

All_Clear_Sheet (CONVERT_SHEET)
と記述したとき、()は式の評価の順番を指定するものとして解釈されます。
(1 + 2) * 3()と同じ意味で、関数の引数をまとめるものではない。)

評価の順番を指定する必要があるということは、()の中身は何らかの値(数字・文字列)だとVBAは解釈します。

しかし、CONVERT_SHEETWorksheet型のオブジェクトであり、値ではありません。
そのため、VBAはオブジェクトの「既定のメンバー」というものを参照し、オブジェクトを値に変換しようと試みます。
既定のメンバーの例:RangeのValueプロパティなど(正確には違うけれど)

しかし、Worksheet型には「既定のメンバー」が定義されていない(サポートされていない)ため、呼び出しに失敗し「オブジェクトは、このプロパティまたはメソッドをサポートしていません」のエラーが発生します。

投稿2018/12/05 13:10

imihito

総合スコア2166

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

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

hatena19

2018/12/05 13:38

なるほど。「オブジェクトは、このプロパティまたはメソッドをサポートしていません」のエラーに違和感があったのですが、納得できました。既定のメンバーがあるオブジェクトを引数にした場合(Rangeなど)は、() で囲むと「オブジェクトが必要です」エラーになりますね。()で囲むことによって値として評価されてしまうためですね。String とか Long を引数にした場合は、()で囲んでも囲まなくてもエラーになりませんね。最初から値ですから当然ですね。納得、納得。
guest

0

ベストアンサー

Functionは何かしら戻り値があるものだからです。

vba

1Function All_Clear_Sheet(CONVERT_SHEET As Worksheet) As String

として
最後に

vba

1All_Clear_Sheet = "何か適当な文字列"

とすればFunctionでもエラーは出ないはずです。

コード全体

vba

1Function All_Clear_Sheet(CONVERT_SHEET As Worksheet) As String 2 CONVERT_SHEET.Activate 3 CONVERT_SHEET.Cells.Clear 4 All_Clear_Sheet = "何か適当な文字列" 5End Function

ただ、何も返さないメソッドなのでしたらやはりSubが適当かと思います。

「Subプロシージャは値を返さない」、「Functionプロシージャは値を返す」

投稿2018/12/05 04:41

編集2018/12/05 04:42
m.ts10806

総合スコア80842

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

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

退会済みユーザー

退会済みユーザー

2018/12/05 04:54

回答ありがとうございます 提示して頂いたコードに修正したのですが、 呼び出したタイミングでエラーが出力されます。
m.ts10806

2018/12/05 04:57

すみません「未検証」と一言入れておけば良かったです。 念のため実際のコードとエラーメッセージを提示いただけますか? ただ、回答で伝えたいのはコピペコードではなく「Function使いたいなら返り値は必須」ということなので。
退会済みユーザー

退会済みユーザー

2018/12/05 04:57

呼び出した側で戻り値を受け取るようにしないといけなかったみたいです。 Dim hoge hoge = All_Clear_Sheet(CONVERT_SHEET) このように修正して提示して頂いた内容に修正したらエラーが出力されませんでした。 ありがとうございました。
m.ts10806

2018/12/05 04:59

あ、そうですね。返り値を受けとるようにしなきゃいけませんね。 ただやはり返り値を必要としない、実行しっぱなしの関数であれば返り値を受け取っても使わない、つまりその変数分の余計なコストがかかることになるので、意味に合わせて使い分けるようにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問