[リストへもどる]
一括表示

投稿時間:2002/10/24(Thu) 14:13
投稿者名:えむぴー
Eメール:
URL :
タイトル:
Callの使い方
フォーム上にコマンドボタンをクリックすると走る下記の記述をしています。
下記の記述は、標準モジュールにPublic Subとして記述したマクロ(Sample1〜Sample20)
を順番に呼び出したいのですが、実行するとエラーがでます。
「1004 マクロSample1が見つかりません」とでます。
なにか間違いがあるのでしょうか?ExcelのVBAのような形しか知らないもので・・・

<フォーム上>
For i = 1 To 20    
    Call Application.Run("Sample" & i)
Next i

<標準モジュール上>
Public Sub Sample1()

End Sub

Public Sub Sample2()

End Sub

です。よろしくお願いします。

投稿時間:2002/10/24(Thu) 15:33
投稿者名:A221
Eメール:
URL :
タイトル:
Re: Callの使い方
> フォーム上にコマンドボタンをクリックすると走る下記の記述をしています。
> 下記の記述は、標準モジュールにPublic Subとして記述したマクロ(Sample1〜Sample20)
> を順番に呼び出したいのですが、実行するとエラーがでます。
> 「1004 マクロSample1が見つかりません」とでます。
> なにか間違いがあるのでしょうか?ExcelのVBAのような形しか知らないもので・・・

>     Call Application.Run("Sample" & i)
このCall文はVBAに依存しています。
※ApplicationオブジェクトのRunメソッドで実行している形です。

VBでのコール文は基本的には
Call Sample1

正確にはModeule内ならば
Call Modeule1.Sample1(引数:ない場合は省略)
となります。

詳細はヘルプで確認してください。
MSDNより------------------------------------------
Sub プロシージャ、Function プロシージャ、ダイナミック リンク ライブラリ (DLL)
プロシージャに制御を渡すフロー制御ステートメントです。

構文

[Call] name [argumentlist]

Call ステートメントの構文は、次の指定項目から構成されます。

指定項目 内容
Call 省略可能なキーワードです。指定するときは、次に示すように引数リスト
(引数 argumentlist) をかっこで囲む必要があります。

name 必ず指定します。呼び出すプロシージャの名前を指定します。

argumentlist 省略可能です。プロシージャに引き渡す変数リスト、
配列、式のいずれかを指定します。複数指定するときは、カンマ (,) で区切ります。
引数 argumentlist に指定する各項目には、キーワード ByVal または ByRef を使って
プロシージャに引数の値をどのように渡すかを指定できます。
ただし、キーワード ByVal および ByRef は、DLL プロシージャを呼び出すときだけ
Call ステートメントで使用できます。

解説

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

配列全体を引数として渡す場合は、配列名の後ろに空のかっこを付けてください。

投稿時間:2002/10/24(Thu) 16:05
投稿者名:えむぴー
Eメール:
URL :
タイトル:
Re^2: Callの使い方
すいません。Call文の使い方は分かりました。ありがとうございます。
あと、もう一点教えていただけないでしょうか?
呼び出したいプロシージャの後ろに変数を付けたいのです。
今回であれば、Sample & i のような感じで。
ただそうすると、区切りがおかしくなるので、赤字表示になります。
その場合はどのようにすれば良いのでしょう。
VBAであれば、Application.Run("Sample" & i) のような感じ
だったとは思うのですが・・・

投稿時間:2002/10/24(Thu) 16:36
投稿者名:A221
Eメール:
URL :
タイトル:
Re^3: Callの使い方
> すいません。Call文の使い方は分かりました。ありがとうございます。
> あと、もう一点教えていただけないでしょうか?
> 呼び出したいプロシージャの後ろに変数を付けたいのです。
> 今回であれば、Sample & i のような感じで。

呼び出し側はこんなカンジです。
Call Sample(i)

呼び出される側は、
Public Sub Sample(Byval X as Long)
Select Case X
    Case 1
        '1のコード
    Case 2
        '2のコード
    Case 3
        '3のコード
End Select
End Sub

投稿時間:2002/10/24(Thu) 17:06
投稿者名:えむぴー
Eメール:
URL :
タイトル:
Re^4: Callの使い方
A221様、ありがとうございます。もう一つ質問よろしいでしょうか?
今現在Sampleプロシージャが20個以上あります。
それが
Public Sub Sample1()

End sub
みたいな感じで20個以上あります。
A221様の言うとおりの記述にするとなると、Public SubとEnd Subの部分
を消していかないといきません。

このままで呼び出すことは出来ないのでしょうか?
例えば、VBAでいう所のApplication.Run("Sample" & i)の「Application」
の部分をVB用に変えるだけで良いとか・・・

またA221様のようにSelect文を使うと、速度が速くなるとかの利点は
出てくるのでしょうか?(それとも他に利点が・・・)

などなど、質問してばかりでスイマセン。
ただ今VB勉強中の身なので、本当にお手間だとは思いますが
よろしくお願いします。

投稿時間:2002/10/24(Thu) 17:32
投稿者名:A221
Eメール:
URL :
タイトル:
Re^5: Callの使い方
> A221様、ありがとうございます。もう一つ質問よろしいでしょうか?
> 今現在Sampleプロシージャが20個以上あります。
> それが
> Public Sub Sample1()
> 〜
> End sub
> みたいな感じで20個以上あります。
> A221様の言うとおりの記述にするとなると、Public SubとEnd Subの部分
> を消していかないといきません。

単独で呼び出すことがあるのであれば

Select Case X
    Case 1: Call Sample1
    Case 2: Call Sample2
End Select

> このままで呼び出すことは出来ないのでしょうか?
> 例えば、VBAでいう所のApplication.Run("Sample" & i)の「Application」
> の部分をVB用に変えるだけで良いとか・・・

残念ながら、Application.Run("Sample" & i)はApplicationオブジェクトの
Runメソッドに文字列("Sample" & i)を引数として与えて実行しているものです。

VBAで可能であったのはVBA側でApplication.Runというものをサポートしていた
からで、VBの場合は自分で関数を作らねばなりません。

まったく同様の機能を持たせるのであればクラスモジュールを利用した
プログラミングになりますし、簡易でよければ先に示したもののようになると思います。

> またA221様のようにSelect文を使うと、速度が速くなるとかの利点は
> 出てくるのでしょうか?(それとも他に利点が・・・)

IIFよりは早いです。IFとは雀の涙くらい早いくらいだと。

> などなど、質問してばかりでスイマセン。
> ただ今VB勉強中の身なので、本当にお手間だとは思いますが
> よろしくお願いします。

投稿時間:2002/10/24(Thu) 18:42
投稿者名:えむぴー
Eメール:
URL :
タイトル:
Re^6: Callの使い方
ありがとうございます。
Selectでやってみます。
お答え、ありがとうございました。