• 締切済み

Excel VBA callのあるなしの違い

Excel VBA の以下の2つのケースで callがある場合とない場合では何か違いがあるのでしょうか。 (1) 他のモジュール(Main)の中のプロシージャ(main)を呼び出す場合 Main.main Call Main.main (2) VBAのオブジェクトのメソッドを呼び出す場合 ActiveWorkbook.Close (True)   Call ActiveWorkbook.Close(True)  

みんなの回答

  • _backyarD
  • ベストアンサー率34% (199/580)
回答No.2

(1)については同じです。 (2)については、この場合は同じですが、Trueの部分が変数の場合、若干挙動が変わってくる可能性があります。前者は本来括弧が不要なのですが、それを付けることで強制的に引数が「値渡し(ByVal扱い)」になります。 ですので、Callを使わない場合は括弧を付けない方が無難です。 具体例をブログに書いておきました。リンクを記載しておきます。

参考URL:
http://backyard.hatenablog.com/entry/20171023/1508730816
yam2012
質問者

お礼

ActiveWorkbook.Close (True)の ()は Call ActiveWorkbook.Close(True)の()とは異なり 強制的に引数を値渡しにする括弧ということですね。 よく見るとメソッドと括弧の間に半角スペースが挿入されています。 このような場合には、 呼び出されたサブルーチンの引数にByValの指定がない時は、 Callがある場合とは挙動が異なるということですね。 ありがとうございました。

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

Googleで「VBA CALL のあるなし」で照会したら、 https://oshiete.goo.ne.jp/qa/8384757.html などの同じような質問をしている人が居ます。 小生も疑問を持っていますが、他の方が作ったプログラムの中だとルーチン名だけの記述(引数無しの場合など)だと、それがサブルーチン(プロシージュアー)名であることが一瞬わからず、?と思い、すぐサブルーチンらしいと気づきます。 普通は同じのようですが、結果が異なる場合があるかどうか、小生は浅学にしてわかりません。 少し話題がズレますが http://officetanaka.net/excel/vba/statement/Call.htm の >Callステートメントの有無に関わらず、関数の戻り値を利用する場合は、引数を括弧で囲まなければなりません などのご教示があります

yam2012
質問者

お礼

回答ありがとうございます。 <https://oshiete.goo.ne.jp/qa/8384757.html> この回答を見ると、Callは省略可能で、 サブルーチンを呼び出していることが分かるように Callを使っている場合があるということですね。 少し話題がズレますが <http://officetanaka.net/excel/vba/statement/Call.htm> で >myFunction(123) エラー と書かれていますが、 myFunction(123)と記述すると myFunction (123)と表示されて エラーにはならないのですが エラーになりますか。 (ActiveWorkbook.Close (True)でもエラーにはならないので) もし分かっていましたら教えてください。 よろしくお願いします。

関連するQ&A

  • VBとVBAのコードの違い プロシージャー呼び出し方法

    何度かお世話になっておりおります 毎回アドバイスありがとうございます 早速なのですがまた躓いてしまいアドバイスお願いします。 ~質問内容~ 標準モジュールからフォームのプロシージャーを呼び出す エラー内容 オブジェクトが必要である       オブジェクト修飾が必要など 出てきました オブジェクト修飾 というのが もう理解出来ず 本当にスタートの時点ではありますが アドバイスお願いします VBのコード 標準モジュール Sub Main() MainForm.Initialize End Sub フォームのコード Public Sub initialize()  ”コード内容”  End Sub ↑上記で記入しました フォームで宣言されているInitialize を呼び出したいのですが VBでは このままで出来るはずなのですが VBAでは オブジェクト修飾が必要です CALL をつけても エラーのままでした 少し質問がわかりにくくなってしまいましたが 標準モジュールから フォームのプロシージャーを呼び出すには なんと入れれば宜しいでしょうか? アドバイスお願いします

  • Excel97のVBAで、出てくるPublic(プロージャ)とPrivate(プロシージャ)の違い

    最近、ExcelのVBAを勉強してるのですが、そこで書籍の中に、 >《挿入》→《プロシージャ》を実行すると、 >作成するプロシージャがPublicかPrivateかを選択します。 >Privateにすると、そのプロシージャは >そのモジュール内でしか実行できません。 とあるのですが、「そのモジュール内でしか実行できません」っていうのがよくわからないのですけど、具体的にはどういった使い分けが出来るのでしょうか?

  • エクセルでユーザーフォームをvbaで作る

    アクセスでフォームをvbaで作る時はCreateFormメソッドで出来ましたが エクセルでユーザーフォームを作る場合はどうすればいいですか? エクセルのオブジェクトブラウザでMSFormsライブラリでCreateで検索しても何もヒットしないことから Createじゃないメソッドで行うと思うのですがどのメソッドでしょうか?

  • エクセルVBA(プロジェクト)について

    エクセル2002を使って、プロジェクト(VBA)の修正を行っています。 プロジェクトを開くと、モジュールやプロシージャが表示されます。 問題は、各プロシージャが独立していて、各々別々に開かないとマクロが見れません。 これをひとつのテキスト文章として保存(表示)する事って可能でしょうか。 もしくはモジュール単位でもかまわないので一覧表示する事が可能でしょうか。 これが出来ると、エクセルが入っていない端末でも内容が確認できるので、 作業が進みます。 どなたか教えてください。お願いします。

  • Excel VBA の ChangeFileAccess

    Excel(2000 SP-3) VBAの ChangeFileAccessがうまく行きません。 VBAからあるExcelファイルをWorkbooks.Open で開く処理の制御で悩んでいます。 2人で同時にマクロでhoge.xls をOpenすると、どちらも「他のユーザが使用中です」的なメッセージが出ませんでした。 (エクスプローラからクリックしたりして、hoge.xlsを直接開くと、他のユーザが使用中かどうかがわかります) それでは困るので、ChangeFileAccess のNotify:=true をセットしてみたら、2人目は他のユーザが使用中である旨のメッセージが出るようになりました。 しかし、ChangeFileAccess のNotifyはちゃんと設定されているようなのですが、 'ChangeFileAccess'メソッドは失敗しました:'_Workbook'オブジェクト とエラーが出ています。 ChangeFileAccessはどう使うのが正しいのでしょうか? ソースは Workbooks.Open Filename:=ThisWorkbook.Path & "\hoge.xls", updatelinks:=1, Notify:=True ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True って感じなのですが。 Workbooks.Openはちゃんとできています。Workbooks.OpenがコケたらOn Error Goto で拾ってMsgBoxでメッセージを出す、という処理をしているのですが、Workbooks.OpenはOKなのにChangeFileAccessでコケて、On Error Goto に引っかかってしまっています。

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • エクセルVBA ブックを閉じるでエラー

    こんにちは。 Excel2007になってから、ブックを閉じる場合にエラーが出力されてしまいます。 以下を全て試してみたのですが、「エクセルは動作を停止しました」とメッセージを出力後、再度エクセルを立ち上げてしまいます。 解決方法をご存じの方がいらっしゃいましたら、教えていただきたく、 お願いいたします。 ThisWorkbook.Close ActiveWorkbook.Close Workbooks("mcr_fi.xls").Close よろしくお願いいたします。

  • エクセルVBAのDeleteキーによるエラー

    VBA初心者です。エクセル(2003)のVBAについて質問です。 セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、 入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。 下記のコードをシートモジュールに入力し、 標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。 A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると 隣のC列に結果が入力されるようにしたいのですが、 A・B列の値をDeleteキーで消去するとエラーになってしまいます。 BSキーで値を消去するとエラーは出ません。 Deleteキーでもエラーが出ない様にする方法はありますでしょうか。 どなたかご教授お願いします。 ----------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then If Target.Value <> "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_TRUE Case "A3" Call マクロ3_TRUE Case "A5" Call マクロ5_TRUE End Select ElseIf Target.Value = "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_FALSE Case "A3" Call マクロ3_FALSE Case "A5" Call マクロ5_FALSE End Select End If End If End Sub

  • エクセル/BeforeCloseイベントで保存できない!?

    エクセル2000です。 以下の_BeforeCloseイベントのマクロ(非常に簡略化してますが)ですが、標準モジュールに設定した Sub 終了() ActiveWorkbook.Close End Sub から終了させた場合、ActiveWorkbook.Saveの部分だけが働かないようです。 エクセル画面右上の×で終了させた場合は保存されます。 どうしてでしょうか? Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheet1 If .Range("A1") <> .Range("B1") Then ret = MsgBox("変更を保存しますか?" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "新:" & .Range("A1") _ + Chr(&HD) + Chr(&HA) + "旧:" & .Range("B1"), vbYesNo + vbQuestion, " 確認") If ret = vbYes Then ActiveWorkbook.Save '←なぜ保存されないの?! MsgBox "保存しました" ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If Else ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If End With End Sub

  • ExcelのVBAでブックの保存

    ExcelのVBAでブックを追加し保存を行っています。 その際、保存は、どこに行うのがよいのですか bookですか。sheetですか。 両方で、SaveAsができまが、使い分けがあるのでしょうか。 どのように使い分けするのでしょうか。 Workbooks.Add ActiveSheet.Name = "サンプル" ActiveSheet.SaveAs OutFileName ActiveWorkbook.SaveAs OutFileName ActiveWorkbook.Close

専門家に質問してみよう