• ベストアンサー
  • すぐに回答を!

「オブジェクトが必要です。」エラーになります。

次のコードで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

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数4359
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • VBA どうしてなのでしょうか?

    どうしてなのかまったくわかりません… Sub test() Dim TW As Worksheet Set TW = Worksheets("Sheet2") TW.Activate Range("G5").Activate End Sub は良いのに Sub test() Dim TW As Worksheet Set TW = Worksheets("Sheet2") TW.Range("G5").Activate End Sub はエラーがでます… この理由をご存知の方いらっしゃいますか?? よかったら教えていただけませんか?

  • マクロを作成したのですが、以下のエラーが出てきてしまいました。

    マクロを作成したのですが、以下のエラーが出てきてしまいました。  エラー:sub または function のプロシージャーの未定義 申し訳ありませんが、ご教授願います。 よろしくお願いいたします。 <マクロの内容> Sub SortTest()      Worksheets("Sheet1").Activate      Worksheets("Sheet1").Range(Cells(1, 1), Cells(100, 2)).Sort      Key1:=Worksheets("Sheet1").Cells(1, 2),order1:=xlAscending End Sub

  • エクセルVBAでSheet1.ActivateとSheet(n).Activate

    エクセル2000です。 VBAでの疑問点を教えてください。 Sub test1() Sheet1.Activate MsgBox ActiveSheet.Name End Sub これは問題なく作動します。 Sub test2() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheet(n).Activate MsgBox ActiveSheet.Name Next End Sub これは「SubまたはFunctionがていぎされていません」というエラーになります。 もちろん、 Sub test3() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets(n).Activate MsgBox ActiveSheet.Name Next End Sub のように書けばOKなのは存じておりますが、これではSheet名に係らず、左から順番となってしまいます。 Sub test4() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets("Sheet" & n).Activate MsgBox ActiveSheet.Name Next End Sub のように明確にシート名として記述すればOKなのですが、それでは、Test1のSheet1.Activate が通って、Sheet(n).Activate が通らないのはなぜでしょう? しょうもない質問でごめんさない。

その他の回答 (4)

  • 回答No.4

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.3
  • layy
  • ベストアンサー率23% (292/1222)

『エクセルvba  (ByVal Target As Range)について』 過去の質問も参考になるかと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.2
  • layy
  • ベストアンサー率23% (292/1222)

参考で・・・。 エラーでは「・・・が必要」とありますから、 普通に考えて何かが不足しているというのはどうか。 ヘルプでも『オブジェクト修飾子を明示的に・・・』とある。 それと、 SUBと違ってFUNCTIONを使うので戻り値があるのは基本形。 aだけに着目しているが、 r=hoge (a) にすると状況が変わったので参考。 「a」と「ThisWorkbook.Worksheets("Sheet1").Range("G10")」、 http://members.jcom.home.ne.jp/rex-uchida/vba060.htm 使い方が違うのかもしれない。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1
  • imogasi
  • ベストアンサー率27% (4558/16316)

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/vbchoshoqa_spread_8083.html でも言及していることかな。 Call hoge(cc) とするとOKです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答、ありがとうございます。 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"))

関連するQ&A

  • マクロに関するエラー(オブジェクトが必要です。)

    マクロは始めてで、いろいろ調べながら作ってみたのですが、 Set検索値の行でオブジェクトが必要ですというエラーが出て、 先に進めなくなりました。 申し訳ないのですが、何方かエラーの対処法を教えていただけないでしょうか。 よろしくお願いします。 ========================== Sub test() Worksheets("2月分").Activate Dim 検索値 As Integer Set 検索値 = Worksheets("2月分").Cells(4, 18) Worksheets("テスト").Activate Dim B As Range Dim C As Range For Each B In Range("B13,B413") ' 第一条件 If B.Value >= 検索値 Then GoTo Continue End If ' 第二条件 If B.Offset(0, 1).Value < 検索値 Then ' Offset(0, 1) は B列の隣のC列の値を取得 GoTo Continue End If Dim aValue As String aValue = B.Offset(0, 2).Value Worksheets("2月分").Cells("D19").Value = aValue Continue: Next End Sub

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • VBA 実行時エラー1004 

    初めまして。 VBA初心者です。 現在、あるセルの範囲に対して、1の数値が入っているなら 直線を引くマクロを作成中です。 実行すると「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」 と表示されます。 サイト等を見ながら、下記プログラムを書いてみました。 修正頂けると幸いです。解説も頂きたいです。 無茶苦茶なプログラムだと思いますが、 宜しくお願い致します。 Sub test01() Dim x As Range Dim c As Range Dim X1 As Single, Y1 As Single, X2 As Single, Y2 As Single Set x = Range("D4:E9") For Each c In x If Worksheets("Sheet1").Range("c").Value = 1 Then X1 = Worksheets("Sheet1").Range("c").Left + Worksheets("Sheet1").Range("c").Width Y1 = Worksheets("Sheet1").Range("c").Top + Worksheets("Sheet1").Range("c").Height / 2 X2 = Worksheets("Sheet1").Range("c").Offset(0, 1).Left Y2 = Worksheets("Sheet1").Range("c").Offset(0, 1).Top + Worksheets("Sheet1").Range("c").Offset(0, 1).Height / 2 Worksheets("Sheet1").Shapes.AddLine X1, Y1, X2, Y2 End If Next c End Sub

  • excelのifステートメントのテストで…

    御観覧ありがとうございます。 スパテクという本を買って、excelを勉強しようと、 サンプルを打ち込んでいて、何度かエラーになったりしましたが、 調べることや、入力ミスの確認で回避出来ていたのですが、 本通りに打っているのに、 「エラー438、オブジェクトは、このプロパティまたはメソッドをサポートしてません。」 と出ます。 エクセル2007です。入力したプロシージャは、 Option Explicit Dim nSample1_12 As Integer Sub Sample1_12() nSample1_12 = nSample1_12 + 1 ThisWorkbook.Worksheets("sheet1").Range("A1") = nSample1_12 End Sub Sub Sample1_13() Dim sA2 As String sA2 = ThisWorkbook.Worksheets("sheet1").Range("A2") If sA2 = "" Then ThisWorkbook.Worksheets("sheet1").Renge("A2") = "Sample1_13" ElseIf sA2 = "Sample1_13" Then ThisWorkbook.Worksheets("sheet1").Range("A2") = "基本の文法 ifステートメント" Else ThisWorkbook.Worksheets("sheet1").Range("A2") = "" End If End Sub このサンプル13を実行すると、A2にsample1_13と出るはずなそうなんですが…エラーになります。

  • どなたかマクロ修正お願いします。

    自分なりに 作成してみましたがどうもうまくいきません。 Sub 変換() Dim Sh1 As Worksheet, Sh2 As Worksheet, Sh3 As Worksheet, Dim r As Range Set Sh1 = Worksheets("1") Set Sh2 = Worksheets("2") Set Sh3 = Worksheets("3") Sh3.Select Set c = Cells.Find(What:="9876543", LookAt:=xlWhole) c.Offset(, 1).Activate ActiveCell.Replace What:="中田", Replacement:="中田英寿" End Sub このように作成しましたがうまくいきません。恐らくsheet3のデータはsheet1から( =1!A100 )といったように値を他のsheetから持ってきてるからではないんでしょうか?

  • excel vba のエラー原因が分かりません

    データ入力シート「Hit Data] データ表示シート「User Sheet」 とあります。 データ表示シート「User Sheet」に「次へ」「前へ」「最初へ」「最後へ」とボタンをつくり、データ入力シート「Hit Data]から、都度データを呼び出せるようにするプログラムをとあるサイトを参考にして作成しましたが、エラーが出てしまいどうしてもうまくいきません。 どこに問題があるのか見ていただけないでしょうか? '以下標準モジュールのプログラムです Public trg As Range Sub Saisyo()  Set trg = Worksheets("Hit Data").Range("A3")  Call Tenki End Sub Sub Saigo()  Set trg = Worksheets("Hit Data").Range("A60000").End(xlUp)  Call Tenki End Sub Sub Mae()  If trg.Row >= 4 Then   Set trg = trg.Offset(-1, 0)   Call Tenki  Else   MsgBox "これより前のレコードはありません"  End If End Sub Sub Tsugi()  If trg.Row < Worksheets("Hit Data").Range("A60000").End(xlUp).Row Then   Set trg = trg.Offset(1, 0)   Call Tenki  Else   MsgBox "これより後ろのレコードはありません"  End If End Sub Sub Tenki()  Worksheets("User Sheet").Range("D9").Value = trg.Offset(0, 0)  Worksheets("User Sheet").Range("D10").Value = trg.Offset(0, 1)  Worksheets("User Sheet").Range("D11").Value = trg.Offset(0, 2)  Worksheets("User Sheet").Range("D12").Value = trg.Offset(0, 3) End Sub '以下 User Sheet"のシートモジュールに記載されたプログラムです。 Private Sub Worksheet_Activate() Call Saisyo End Sub '表示されるエラーの内容 'saisyo・・・アプリケーション定義またはオブジェクト定義のエラーです。 'saigo・・・同上 'mae・・・オブジェクト変数またはWithブロック変数が設定されていません 'tugi・・・同上

  • VBAの実行時エラー91!どうしよう?

    excelVBAでファイル内の各シートを確認して、条件に合うシートのデータをコピーするところで、「実行時エラー'91'オブジェクト変数またはWithブロック変数が設定されていません。」というエラーが出ました。 確認したのですが、なかなか分かりません。どなたがご指導お願いできませんか。 コードは以下のとおりです。 Sub Tenki(theBook As Workbook, mySheet As Worksheet) Dim K_Sheet As Worksheet Dim DstRange As Range For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました! If K_Sheet.Name <> "C" Then Set DstRange = mySheet.Range("A" & _ mySheet.Range("A1").CurrentRegion.Rows.Count + 1) K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).Select Range("B7:K48").Copy DstRange.PasteSpecial Paste:=xlPasteValues End If Next Application.CutCopyMode = False End Sub どうぞよろしくお願いします。

  • なぜエラーになるのかわかりません。

    コードとしては問題ないはずなのに なぜエラーになるのかわかりません。 Private Sub Worksheet_Activate() Cells(1, 1).Select End Sub というコードで、 実行時エラー1004 rangeクラスのselectメソッドが失敗しました。 となります。

  • エクセルマクロ実行時エラー1004について

    システムを起動すると実行時エラー1004とでて5行目のWorksheets(3).Selectで止まってしまいます。 私が作成したものではなく、なぜなのかわかりません。緊急を要しています。誰かわかる方いらっしゃらないでしょうか。 よろしくお願いします。 Dim Max_data2 As Integer Public Cunt_01 As Integer Sub auto_open() Dim wkSheet As Excel.Worksheet Worksheets(3).Select ' Range("c4") = Date ' Range("c20") = Date Range("d6").Select With Worksheets("工場、受注一覧表") ' Worksheets("工場、出荷指示書").Range("j3").Value = Date ' Worksheets("工場、出荷指示書").Range("I4").Value = Date ' Worksheets("工場、出荷指示書").Range("J4").Value = Time .Range("d5").Value = Date .Range("d21").Value = Date .Range("d23").Value = Date End With For Each wkSheet In ThisWorkbook.Worksheets If InStr(wkSheet.Name, "工場、出荷指示書") <> 0 Or InStr(wkSheet.Name, "@") <> 0 Then wkSheet.Range("J3").Value = Date wkSheet.Range("I4").Value = Date wkSheet.Range("J4").Value = Time End If Next Call com_list Cunt_01 = 10 '1件づつ転記のカウンタ '★追加★ '入出庫報告書のファイルを開く Dim sPath As String sPath = ThisWorkbook.Worksheets("工場、受注一覧表").Range("W1").Value If sPath = "" Then Exit Sub End If If Dir(sPath) <> "" Then Workbooks.Open (sPath) End If ThisWorkbook.Activate ''★23.06.12 ActiveWindow.SmallScroll ToRight:=4 End Sub

  • VBA 実行時エラーで、"プロパティまたはメソッド

    ・Sheet1(コード) Private Sub CommandButton1_Click() Call aaa End Sub ・Module1(コード) Sub aaa() Dim wb As Workbook Dim ws As Worksheet Workbooks.Open ("c:\test.xls") Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") wb.ws.Range("A2").Value = "CCC" End Sub wb.ws.Range("A2").Value = "CCC"の部分で 以下の実行エラーが出ます。 ------------------------------------------------------------------------ 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ------------------------------------------------------------------------ Set wb = Workbooks("test.xls") Set ws = wb.Worksheets("Sheet1") の部分で特にエラーも出ないので、オブジェクトの取得は成功していると 思うのですが、WorkSheetオブジェクトのwsからRangeメソッドを呼ぶことが できません。 動かない原因と対策を教えてください!!