• ベストアンサー

Callステートメント(エクセル)

Sub test()  Set x = Application.InputBox(Prompt:="テスト", Type:=8)   スクリプト    Call abc    Call def    Call ghi   スクリプト End Sub 上記マクロで、"x"が"Call"で指定したプロシージャ内でも使えるようにするには、どのような指定が必要になるでしょうか?

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

  • ベストアンサー
  • masa_019
  • ベストアンサー率61% (121/197)
回答No.2

> "x"が"Call"で指定したプロシージャ内でも使えるようにするには・・・ 簡単なのは、xを宣言セクションで宣言してモジュールレベルの変数にする方法だと思います。 Option Explicit Dim x As Object ←☆ここで宣言する Sub test() Set x = Application.InputBox(Prompt:="テスト", Type:=8) Call abc End Sub Sub abc MsgBox x.Address End Sub 上記のようにすると、xはモジュール内の他のプロシージャ内で自由に使えます。 他にもCallで呼び出す時に引数として渡す方法もあります。 下のようにして、xをabcプロシージャに渡します。 Option Explicit Sub test() Dim x As Object Set x = Application.InputBox(Prompt:="テスト", Type:=8) Call abc(x) End Sub Sub abc(ByRef x As Object) MsgBox x.Address End Sub この場合、ByRefは省略しても良いです。

kayonon
質問者

お礼

有難うございました。

その他の回答 (3)

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

Sub test() Set X = Application.InputBox(Prompt:="テスト", Type:=8) abc X End Sub Sub abc(X) MsgBox X.Address End Sub で動きました。 Callを使うなら、Call abc(X)です。 本当は モジュールレベル変数 Private X を 宣言部に書く。(または Private x As Range) 下記「モジュールレベル変数は Private なものです。 」参照。 http://www.bcap.co.jp/hanafusa/VBHLP/hensu.htm http://homepage1.nifty.com/CavalierLab/lab/vb/implicit.html

kayonon
質問者

お礼

有難うございました。

noname#22222
noname#22222
回答No.3

Call abc(x) Call abc(x,y,z) このように、関数定義の中のカッコ内にリストされた変数を一般にパラメータと呼びます。 関数呼び出しに使われる値は引数(argument)といいます。 同じ区別を行うのに、仮引数および実引数ということばが使われることもあります。 つまり、関数への値の渡しはカッコ内に変数を記述することで実現します。

kayonon
質問者

お礼

有難うございました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

Call abc( x ) ――みたいに指定します。

参考URL:
http://office.microsoft.com/ja-jp/assistance/HA010188011041.aspx?mode=print
kayonon
質問者

お礼

有難うございました。

関連するQ&A

  • エクセルのマクロ

    Sub test() Set x = Application.InputBox(Prompt:="", Type:=8) Selection.Cut Destination:=x End Sub 上記マクロは、選択されている領域を、指定したセルを基点として移動させるものです。 実行後に、移動した領域を選択状態にするにはどういった記述が必要になるでしょうか?

  • VBAのCallステートメントについて

    ExcelのSheet1にCommandButton1(表示)があります。 -------------------------------------------------- Private Sub 表示_Click() (DBより表示処理) End Sub -------------------------------------------------- UserForm1にCommandButton1(登録)があります。 -------------------------------------------------- Private Sub 登録_Click() (DBへの登録処理) UserForm1.Hide Call WorkSheets("Sheet1").表示_Click() ・・・☆ Exit Sub End Sub -------------------------------------------------- 表記のようなプログラムにしたところ、☆印のところで、 下記エラーが表示されてしまいます。 【エラー】--------------------------------------------------- 実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。 ------------------------------------------------------------- どのようにしたらCallステートメントで表示_Clickを呼び出すことが できるのでしょうか。

  • エクセルで表を展開するマクロを作りたい

    こんにちは。 エクセルで表を展開したいのですがマクロが作れません。 どなたか詳しい方教えて下さい。     A   B   C  D 1  1,2,3  abc  def  ghi を    A   B   C  D 1  1 abc  def  ghi 2   2  abc  def  ghi 3  3  abc  def  ghi というように展開したいです。 10列目くらいまで対応したマクロが作りたいです。 Sub test() 'この行から Dim i, j, k As Long Dim myArray As Variant For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If Not Cells(i, 1) Like "*" & "," & "*" Then i = i - 1 myArray = Split(Cells(i, 1), ",") k = UBound(myArray) Rows(i + 1 & ":" & i + k).Insert For j = 0 To k Cells(i + j, 1) = myArray(j) Next j Next i For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 2) = "" Then Cells(i, 2) = Cells(i - 1, 2) End If Next i Columns("A:B").AutoFit End Sub 'この行まで これにどう付け足せばいいでしょうか? どうかご教授お願い致します。

  • マクロ subプロシージャーは指定できない?

    accessのマクロの アクション:プロシージャの実行 は、 subプロシージャーは指定できないのでしょうか? 標準モジュールに Sub test1() MsgBox "プロシージャーの実行のテストです" End Sub Function test2() MsgBox "プロシージャーの実行のテストです" End Function と作り、 マクロのプロシージャの実行で プロシージャ名をtest2()にすると、うまく表示されますが、 test1()だと、失敗します。 subプロシージャーをマクロで呼び出す方法を教えてください。

  • 元のプロシージャーを取得するプロパティ

    Sub test1() Call test2 End Sub Sub test2() If ?? Then MsgBox "test1から実行されたマクロです。" End If End Sub 上記のコードで どこから実行されたプロシージャ化を取得する方法はありますか? 現在は、 Dim bl_test1_yes As Boolean Sub test1() bl_test1_yes = True Call test2(bl_test1_yes) End Sub Sub test2(bl_test1_yes) If bl_test1_yes = True Then MsgBox "test1から実行されたマクロです。" End If End Sub としていますが、 元のプロシージャーを取得するプロパティがあれば教えてください。

  • エクセルVBA ユーザーフォームのリストボックス

    エクセルVBAのユーザーフォームのリストボックスについて教えてください。 現在、以下のようにコードがされています。 Private Sub UserForm_Initialize() With UserForm.ListBox1 .AddItem "ABC" .AddItem "DEF" .AddItem "GHI" .ListIndex = 0 End With End Sub Private Sub ListBox1_Click() With ListBox2 .Clear Select Case UserForm.ListBox1.List(ListBox1.ListIndex) Case "ABC" .AddItem "123" .AddItem "456" .AddItem "789" Case "DEF" .AddItem "456" .AddItem "789" Case "GHI" .AddItem "789" End Select .ListIndex = 0 End With End Sub それで、ユーザーフォームを起動した時点で、ListBox1には"ABC"、ListBox2には"789"を選択し、青く色がついている状態にすることは可能でしょうか。 よろしくお願いします。

  • 選択範囲にある全ての段落の先頭文字を削除するマクロ

    こんにちは。 Word2007において、 「選択範囲にある、全ての段落の、先頭文字を削除する。」 という処理を行うVBAマクロを作成しようとしています。 このマクロは、選択範囲に対して連続で行いたいので、 マクロ実行後に、範囲選択が解除されていない状態である必要があります。 このマクロを記述しようと、自分なりに考えたVBAコードは以下の通りです。 ------------------------------------------------------------ Sub 選択範囲の先頭文字を削除する() '選択範囲にある、全ての段落の先頭文字を削除する。 Set Selection_Range = Selection.Range '次のForループで範囲選択がなくなるので、Rangeオブジェクトで処理範囲を固定している。 For x = 1 To Selection_Range.Paragraphs.Count Dim str As String str = Selection_Range.Paragraphs(x).Range.Text Selection_Range.Paragraphs(x).Range.Text = Right(str, Len(str) - 1) Next Selection_Range.Range.Select End Sub ------------------------------------------------------------ このマクロを、例えば abc def ghi jkl という範囲を選択して実行すると、 abc def ghi jkl となり、 abc def ghi だけが選択された状態になります。 しかし、本来期待している動作を考えると、マクロを実行した後に、 abc def ghi jkl が選択されているようにしたいのです。。 以上の件について、何か良い方法を知っておられる方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

  • ExcelのマクロでのExit Subの役割とは

    久しぶりに Excel のマクロについて 質問させていただきます。 実際に作ったマクロはとても長いのですが 問題となった部分を簡潔にまとめて記載します。 Sub test() Range("A1") = 0 入力 = Application.InputBox("入力") If 入力 = "a" Then Call test End If Call test2 End Sub Sub test2() Range("A1") = Range("A1") + 1 End Sub これにより 「a」を入力している限りは先へ進めず 「a」以外を入力したところで セルA1に「1」と表示させるつもりでした。 しかし実際には 「a」を入力した回数プラス1が セルA1に表示されてしまいます。 仕方がないので Call test の後に Exit Sub と入力したところ、希望通り セルA1には「1」と表示されました。 Exit Sub を入力しなくても 何度も test() に戻るだけで Range("A1") に影響するのは、最後の Call test2 による1回だけと思うのですが なぜこのような結果になるのでしょうか。 今回もマクロについては まだまだ素人だと痛感しているところです。 回答をよろしくお願いいたします。

  • プロシージャが実行されたかの有無の判断

    Sub test() ・・・・・ IF ・・・・ then Call マクロ1 End If ・・・・・ ・・・・・ If testと言う名のプロシージャーの中でマクロ1と言うプロシージャーが実行されたなら Then MsgBox "マクロ1は実行されました" End If End Sub ということを実行したいのですがどうすればいいのでしょうか? マクロ1の実行条件自体が複雑でIf ~Thenの中に書ききれないので 実行の有無を値で返したりすることは不可能でしょうか? よろしくお願い致します。

  • VBA:Callステートメントでいつでもイベント発生可能な準備をしたい。

    タイトルどおり、Callステートメントでいつでもイベント発生可能な準備ができるようにしたいと考えています。しかし、Sub 実行準備SUBでエラーが出ています。どこをどう直せばよいのか教えて頂きたいです。 Private Sub Auto_Open() MsgBox "Ctrl + t でイベント実行準備を行います。" Application.OnKey "^{t}", "実行準備SUB" End Sub '--------------------------------------------------- Sub 実行準備SUB() Dim Target As Range Target = Range(Cells(1, 1), Cells(100, 100)) Call Worksheet_Change(ByVal Target) End Sub '--------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 2 Then r.Offset(0, -1).Value = Now End If Next r End Sub イベントは、シートの2列目のセルに変更があれば、1列目に日付時刻を記入するというものです。宜しくお願い致します。

専門家に質問してみよう