Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5711 / 13645 ツリー ←次へ | 前へ→

【49284】Call と Application.Run の違い 多摩川 07/5/30(水) 16:24 質問[未読]
【49286】Re:Call と Application.Run の違い Jaka 07/5/30(水) 16:41 発言[未読]
【49305】Re:Call と Application.Run の違い ichinose 07/5/30(水) 21:31 発言[未読]
【49314】Re:Call と Application.Run の違い 多摩川 07/5/31(木) 9:26 お礼[未読]
【49315】Re:Call と Application.Run の違い 多摩川 07/5/31(木) 9:56 質問[未読]
【49316】Re:Call と Application.Run の違い ウッシ 07/5/31(木) 10:12 発言[未読]
【49319】Re:Call と Application.Run の違い 多摩川 07/5/31(木) 11:04 質問[未読]
【49324】Re:Call と Application.Run の違い ウッシ 07/5/31(木) 12:00 発言[未読]
【49332】Re:Call と Application.Run の違い 多摩川 07/5/31(木) 13:41 お礼[未読]
【49317】Re:Call と Application.Run の違い Jaka 07/5/31(木) 10:13 発言[未読]
【49320】Re:Call と Application.Run の違い 多摩川 07/5/31(木) 11:21 質問[未読]
【49327】Re:Call と Application.Run の違い Jaka 07/5/31(木) 12:21 発言[未読]
【49333】Re:Call と Application.Run の違い 多摩川 07/5/31(木) 13:47 お礼[未読]

【49284】Call と Application.Run の違い
質問  多摩川  - 07/5/30(水) 16:24 -

引用なし
パスワード
   こんにちは。またまた,多摩川です。
#49282に関係するのですが,違う質問のため新規投稿しました。

そもそも当方 Call がだめだったから Application.Run を使うみたいに
詳細な違いが分かっていないですが,(一応 Help は読んだのですがいまいち分かりませんでした)
Call は Excel 以外からも呼び出し可,
Application.Run は Sub, Function, Property の各プロシージャのみを呼び出すExcel限定ってことなのでしょうか?

情けない質問なのですが,勉強させてください。

【49286】Re:Call と Application.Run の違い
発言  Jaka  - 07/5/30(水) 16:41 -

引用なし
パスワード
   私は、Application.Runは別ブックのマクロを呼び出す時とか、
目安箱に書いた、こんな感じで使ってます。
HTTp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=61;id=FAQ
HTTp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=182;id=FAQ

【49305】Re:Call と Application.Run の違い
発言  ichinose  - 07/5/30(水) 21:31 -

引用なし
パスワード
   多摩川 さん、Jakaさん、こんばんは。
Runメソッドの便利な点は、Jakaさんの目安箱を見ていただくとして・・・、

>Call は Excel 以外からも呼び出し可,
>Application.Run は Sub, Function, Property の各プロシージャのみを呼び出すExcel限定ってことなのでしょうか?
ん?Runメソッドだって、APIを呼び出すことだって出来ます。

例 新規ブックの標準モジュールに
'===========================================================
Declare Function GetAsyncKeyState Lib _
    "User32.dll" (ByVal vKey As Long) As Long
'===========================================================
Sub test()
  Dim inkey As Long
  Do While Run("GetAsyncKeyState", 40) = 0
   DoEvents
   Loop
  MsgBox "ok"
End Sub

testを実行すると、↓キーが押されると反応し、「ok」と表示されます。

runメソッドは、呼び出しを文字列で指定できる点が利点ですが

文字列であるがゆえにCallステートメントより、処理が遅い と思います。

又、Runメソッドの引数は、全て値渡しですから、
呼び出し先でデータを返すような引数は使えません。

例 新規ブックの標準モジュールに
'===================================================================
Sub main()
  Dim x, y, z
  x = 1
  y = 2
  z = 0
  Call 足し算(x, y, z)
  MsgBox z 'きちんと1+2=3の3を表示します
  z = 0
  Application.Run "足し算", x, y, z
  MsgBox z 'こっちは、0のまま
End Sub
'================================================================
Sub 足し算(ByVal a, ByVal b, ByRef c)
  c = a + b
End Sub


上記のmainを実行してみてください。

【49314】Re:Call と Application.Run の違い
お礼  多摩川  - 07/5/31(木) 9:26 -

引用なし
パスワード
   Jakaさん,ichinoseさん,おはようございます。

あれから過去ログで Call と Runメソッドの使用例を見てみるうちに,
Call は呼び出し先のデータを返す例があり,
(#28808のichinoseさんの過去レスでした)
Runメソッドではどうなんだろうと思っていたので悩み解決です。

Jaka さんに教えていただいた目安箱の例は,
コードを新規モジュールにコピーして,ステップインで追うことで何とか流れは理解したものの,
利点が良く分からなかったのですが,ichinoseさんのご説明の後,見直すと
確かに,複数の同じようなFunctionプロシージャ(HorTB_M1,HorTB_M2・・・)を
文字列として変数を利用して,1回の記述で済ませているという利点が見えてきました。

お二方とも,ご丁寧説明していただき,大変ありがとうございました。
スキルアップできたと思います。


まとめると

Call と Application.Run はいずれも,基本的,双方とも値受け渡し及び他のAPIを含めた呼び出しを行うもの。
使い分けとしては,
Call → 呼び出し先からデータを戻す場合ことが可能。(文字列での呼び出しは不可)
Runメソッド → 文字列での呼び出しが可能。(値の受け渡しのみ)
上記に当てはまらない場合は,どちらを使用しても大差はない。お好みで!

こんな感じですかね?

【49315】Re:Call と Application.Run の違い
質問  多摩川  - 07/5/31(木) 9:56 -

引用なし
パスワード
   ふと,疑問に思いました。
お手数ですが,またお付き合い下さい。

Sub 挨拶()
  Dim a As String
  Dim b As String
  Dim c As String
  Dim d As String
  
  Call macro1(a)
  Call macro2(b)
  Call macro3(c)
  Call macro4(d)
  MsgBox a & b & c & d
  
End Sub

Sub macro1(aaa As String)
  aaa = "お"
End Sub

Sub macro2(aaa As String)
  aaa = "は"
End Sub

Sub macro3(aaa As String)
  aaa = "よ"
End Sub

Sub macro4(aaa As String)
  aaa = "う"
End Sub

こんなのがあったとします。
仮に,macro1〜macro100まであった場合,
返し値がなければ,
  For i = 1 To 100
    Application.Run "macro" & i, a
  Next i
と簡略化すると思うのですが,
値を返したい場合は,やはり,Callしか手がないのでしょうか?

【49316】Re:Call と Application.Run の違い
発言  ウッシ  - 07/5/31(木) 10:12 -

引用なし
パスワード
   こんにちは

使うとすれば、

Dim a() As String
Sub 挨拶()
  Dim i As Long
  Dim s As String
  For i = 1 To 4
    ReDim Preserve a(1 To i)
    Application.Run "macro" & i, i
    s = s & a(i)
  Next i
  MsgBox s
End Sub

Sub macro1(aaa As Long)
  a(aaa) = "お"
End Sub

Sub macro2(aaa As Long)
  a(aaa) = "は"
End Sub

Sub macro3(aaa As Long)
  a(aaa) = "よ"
End Sub

Sub macro4(aaa As Long)
  a(aaa) = "う"
End Sub

こんな感じになると思います。

【49317】Re:Call と Application.Run の違い
発言  Jaka  - 07/5/31(木) 10:13 -

引用なし
パスワード
   ▼多摩川 さん:
>値を返したい場合は,やはり,Callしか手がないのでしょうか?
だから、
HTTp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=182;id=FAQ

【49319】Re:Call と Application.Run の違い
質問  多摩川  - 07/5/31(木) 11:04 -

引用なし
パスワード
   ▼ウッシ さん:
こんにちは。
ありがとうございます。コードの書き方は分かりました。
今後に活かしたいと思います。
恐れ入りますが,下記について教えてください。

>
>Dim a() As String
変数aをグローバル変数として扱うということでよいのでしょうか?

>Sub 挨拶()
>  Dim i As Long
Integer を Long にする理由を教えていただけないでしょうか?
(Integer で試してみたら問題なかったようなので)
Integer の方がメモリの負担が少ないと思っていたのですが・・・

【49320】Re:Call と Application.Run の違い
質問  多摩川  - 07/5/31(木) 11:21 -

引用なし
パスワード
   ▼Jaka さん:
もう一度,見直してみましたが,答えを見出すことができませんでした。
すいませんが,教えてください。

HoriChk = Application.Run("HorTB_M" & Ct, Nen)
この部分が,該当箇所になると思うのですが,
例えば,Ct = 1 の場合,セルから Nen の値を格納し,
Private Function HorTB_M1(Nen As Long) As Variant
を呼び出し,
HoriChk = HorTB_M1 とさせているのでしょうか?

【49324】Re:Call と Application.Run の違い
発言  ウッシ  - 07/5/31(木) 12:00 -

引用なし
パスワード
   こんにちは

モジュールが分かれてるんでしたね。

>>Dim a() As String
Public a() As String
として下さい。

>Integer を Long にする理由を教えていただけないでしょうか?
現在のハード環境では、メモリの負担は考えなくていいと思います。
Integer より Long の方が内部処理は速いらしいです。

【49327】Re:Call と Application.Run の違い
発言  Jaka  - 07/5/31(木) 12:21 -

引用なし
パスワード
   ▼多摩川 さん:
>もう一度,見直してみましたが,答えを見出すことができませんでした。
ステップ実行で変数の中身を確認をしないと、
見直しただけだと解らないと思います。

>例えば,Ct = 1 の場合,セルから Nen の値を格納し,
>Private Function HorTB_M1(Nen As Long) As Variant
>を呼び出し,
>HoriChk = HorTB_M1 とさせているのでしょうか?
そうさせてます。

Sub 挨拶()
  Dim a As String
  Dim b As String
  Dim c As String
  Dim d As String
  Dim tb(1 To 4)
  For i = 1 To 4
    aaa = i
    tb(i) = Application.Run("macro" & i, aaa)
  Next
  MsgBox tb(1) & vbLf & tb(2) & vbLf & tb(3) & vbLf & tb(4)
End Sub

Function macro1(aaa As String)
  macro1 = "お" & aaa
End Function

Function macro2(aaa As String)
  macro2 = "は" & aaa
End Function

Function macro3(aaa As String)
  macro3 = "よ" & aaa
End Function

Function macro4(aaa As String)
  macro4 = "う" & aaa
End Function

張る方間違えたので修正。

【49332】Re:Call と Application.Run の違い
お礼  多摩川  - 07/5/31(木) 13:41 -

引用なし
パスワード
   ▼ウッシ さん:
こんにちは

>Integer より Long の方が内部処理は速いらしいです。
そうだったんですか!
勝手に思い込んでました。

これで,Call と Application.Run の使い分けが
更に詳しく理解できました。
いろいろ,ありがとうございました。

【49333】Re:Call と Application.Run の違い
お礼  多摩川  - 07/5/31(木) 13:47 -

引用なし
パスワード
   ▼Jaka さん:
こんにちは

Sub 挨拶2()
  Dim a As String
  Dim i As Integer
  Dim s As String
  Dim Ji As String
  
  Ji = Application.Run("macro" & 1, a)
  MsgBox Ji
 
End Sub

Function macro1(aaa As String)
  macro1 = "お"
End Function

と試してみて,"お"と得られなかったので,HoriChk = HorTB_M1 ではないのかな?と思い,伺ったのですが,
macro1 = "お" を aaa = "お" としていたためのイージーミスでした。
お手間を取らせてしまい申し訳ございませんでした。

Functionプロシージャはこういう使い道もあるんですね!
大変勉強になりました。
ありがとうございました。

5711 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free