大人になっても苦手な食べ物、ありますか?

次のコードで2.は動くのですが、1.が動きません。「オブジェクトが必要です。」エラーになります。
何が違うんでしょうか? 教えてください。よろしくお願いします。

Function hoge(aa As Range)
aa.Value = "Hello!!"
End Function

Sub Worksheet_Activate()
Dim a As Range
Set a = ThisWorkbook.Worksheets("Sheet1").Range("G10")
hoge (a) ' ←1.これだとエラーになる
' hoge (ThisWorkbook.Worksheets("Sheet1").Range("G10")) ' 2.こちらはOK
End Sub

A 回答 (5件)

Helpより


Call ステートメント

プロシージャを呼び出すとき、キーワード Call は省略できます。キーワード Call を使って、引数が必要なプロシージャを呼び出す場合は、引数リスト (引数 argumentlist) をかっこで囲む必要があります。キーワード Call を省略するときは、引数リストを囲むかっこも省略しなければなりません。Call 構文で組み込み関数またはユーザー定義型関数を呼び出す場合、その関数の戻り値を取得することはできません。


つまり、

hoge a      ○
Call hoge (a)  ○
hoge (a)     ×



Helpより
Call ステートメントの使用例

次の例は、Call ステートメントが Private Sub プロシージャ、組み込み関数、ダイナミックリンク ライブラリ (DLL) プロシージャ、および Macintosh のコード リソース プロシージャに対して、どのように制御を渡すかを説明します。DLL は、Macintosh では使用できません。

' Private Sub プロシージャを呼び出します。
Call PrintToDebugWindow("Hello World")
' 上記のステートメントは、次の Private Sub プロシージャに制御を渡します。
Sub PrintToDebugWindow(AnyString)
Debug.Print AnyString ' イミディエイト ウィンドウに表示します。
End Sub

' 組み込み関数を呼び出します。関数の戻り値は、破棄されます。
Call Shell(AppName, 1) ' AppName には、実行可能ファイルのパスが格納されています。

' Microsoft Windows の DLL プロシージャを呼び出します。Declare ステートメントは、クラス モジュールではプライベートにする必要がありますが、標準 モジュールではプライベートにする必要はありません。
Private Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
Sub CallMyDll()
Call MessageBeep(0) ' Windows DLL プロシージャの呼び出し。
MessageBeep 0 ' キーワード Call を省略した呼び出し。
End Sub
    • good
    • 3
この回答へのお礼

回答ありがとうございます。
詳細な説明でたいへん参考になりました。
また、お礼が遅れて失礼しました。

お礼日時:2011/03/21 09:22

Call hoge(a) 'これはOK


hoge (ThisWorkbook.Worksheets("Sheet1").Range("G10"))
ですが、VBAのエディタ上見てもらえれば、「hoge」と次の括弧の間にスペースがあるのが分かると思います。
hoge ThisWorkbook.Worksheets("Sheet1").Range("G10")
のように括弧を除いてもエラーになりません。
なかなか微妙な仕様かもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。お礼が遅れて失礼しました。

お礼日時:2011/03/21 09:20

『エクセルvba  (ByVal Target As Range)について』


過去の質問も参考になるかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。お礼が遅れて失礼しました。

お礼日時:2011/03/21 09:19

参考で・・・。



エラーでは「・・・が必要」とありますから、
普通に考えて何かが不足しているというのはどうか。
ヘルプでも『オブジェクト修飾子を明示的に・・・』とある。

それと、
SUBと違ってFUNCTIONを使うので戻り値があるのは基本形。

aだけに着目しているが、
r=hoge (a)
にすると状況が変わったので参考。

「a」と「ThisWorkbook.Worksheets("Sheet1").Range("G10")」、
http://members.jcom.home.ne.jp/rex-uchida/vba060 …
使い方が違うのかもしれない。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。お礼が遅れて失礼しました。

お礼日時:2011/03/21 09:18

Function hoge(aa As Range)


aa.Value = "Hello!!"
End Function
Sub test03()
Dim aa As Range
Set aa = Worksheets("Sheet1").Range("b1")
hoge aa
End Sub
で動きましたよ。
Worksheets("Sheet1").が無いと、どのシートのRangeかきめられないのでは。Activesheetというような限定でも良いと思う。
私はこれで苦労しているので、限定が無いため、とそう思ったが、
その後やってみるとWorksheets("Sheet1"). が無くても動いた。
()をつけるとエラーになった。
余り意識したことがなかったが
http://www.gizcollabo.jp/vbtomo/boards/vbchoshoq …
でも言及していることかな。
Call hoge(cc)
とするとOKです。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
1,2,3がダメで、3,4,5,6,7がOKというのが理由が分かりませんが、プログラムはなんとか
動くようになりました。

1. hoge (a)
2. call hoge a
3. hoge (Range("G10"))

4. hoge a
5. hoge Range("G10")
6. call hoge (a)
7. hoge (ThisWorkbook.Worksheets("Sheet1").Range("G10"))

お礼日時:2011/02/05 18:03

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報