未経験で、コーディングをして、2ヶ月程で、笑われそうな
質問ですが、callステートメントに関する引数の考え方がさっぱりです。
そもそも、引数とは?参考書読んでも、解りませんでした。
あんまり、難しいことはわかりませんが、よろしくどーぞ。

A 回答 (4件)

回答送れてごめんなさい。


しばらく、ネットがつながらなかったもので・・・

回答ですが、えーっと、大体そうです。
が、「sAは001で帰ってきて、sBは004で帰ってくる」ではなくて
「s01は001で帰ってきて、s02は004で帰ってくる」です。

ローカル変数はプロシージャ単位で考えましょう。
関数 FlKansuu 内では、
sA = "003"
sB = "004"
のコーディングあとはこの関数が終わるまでは
「sA は "003" sB は "004"」です。
関数から戻った時の
call側の引数の変数の値が
変化するByRef
変化しないのがByVal です。
細かいかも知れませんが後々混乱しますよ。

これが理解できたら次は、Sub と Function の違い使い方や
Optionalの使用など理解したらかなりいいかんじだと思います。
がんばってください
    • good
    • 0
この回答へのお礼

なんども、すいませんが、
別の言い方をすると、sAに001を渡し、sBに004を渡す。
という、考えはあっているでしょうか。

お礼日時:2001/09/02 12:25

callステートメントを使うのは、プロシージャを使うときですよね。

(Function、Subプロシージャ)これらの考え方は、数学の関数に近いと思います。

たとえば、変数AとBを与えて、その平均Cを出す計算をさせたいとします。そうすると、
C=(A+B)/2
と記述しますよね。
これを毎回書くのは大変なので(この場合は短いのでたいしたことはないですが)、次のように書くことにします。
C=Heikin(A,B)
ただし、Heikin(A,B)=(A+B)/2

ここで、「C=・・・」の部分が呼び出しCallステートメント、「ただし・・・」の部分がプロシージャになります。今回は計算ですが、プログラムでは、計算に限らず、いろいろな処理を書くことができます。

この、A、Bのことを引数といいます。つまり、そのプロシージャの中で処理するために必要なデータということになります。

ただ、この場合は、計算の結果がほしいのでC=・・・の記述になりますが、結果はいらない処理の場合、VBではCallステートメントを使うという決まりがあります。
上記の場合、結果がほしいときは、
C=Heikin(A,B)
と記述し、結果がいらないときは、
Call Heikin(A,B)
または
Heikin A,B
と記述することになります。

ちなみに、Subプロシージャは、結果を返さないプロシージャ、Functionプロシージャは、上記の2通りの記述方法で、両方に対応することができます。
    • good
    • 0
この回答へのお礼

最後の2行がよくわかりませんでしたが、
もう少し、かんがえてみたいです。
ありがとうございます。

お礼日時:2001/09/02 12:19

コーディング2ヶ月ですか。


理論的に理解するには、ちとつらいですかね。
簡単に説明すると

call 関数名(引数01,引数02)

という感じで関数にデータを渡せます。

関数側では
Function 関数名(引数A,引数B)

End Function

となり
引数Aに引数01のデータが
引数Bに引数02のデータが渡されます。

渡されるデータは、呼ぶ側(call側)の引数と呼ばれる側(Sub,Function)の引数の順番で決まります。
つまり関数側の引数の順番を変えると渡されるデータも変わります。
Function 関数名(引数B,引数A)

End Function

引数Bに引数01のデータが
引数Aに引数02のデータが渡されます。

大体こんな感じです。

あともうひとつ値渡し(ByVal)と参照渡し(ByRef)があります。
これは、データを渡された側(関数側)で渡されたデータを変更したとき、
Call側の引数の変数が変化するかどうかということです。
少し難しいかもしれませんが、簡単にいうと
値渡し(ByVal)は、変化しない
参照渡し(ByRef)は、変化する
です。
宣言のしかたは

Function 関数名(ByVal 引数A , ByRef 引数B )

End Function

引数A = 値渡し(ByVal)
引数B = 参照渡し(ByRef)

になり、関数のなかでそれぞれ、引数のデータを変更すると
call側に戻ったときに引数01,引数02のデータを比べて見てください。

ひとつ理解するとヘルプを再度見たときに新たに理解できることがありますよ。
ヘルプは、結構使えるので、ぜひおぼえてください。

参考プログラムです。

Private Sub Form_Load()

Dim s01 As String
Dim s02 As String

s01 = "001"
s02 = "002"

Call FlKansuu(s01, s02)

'イミディエトウィンドウに出力
Debug.Print "s01 " & s01
Debug.Print "s02 " & s02

End Sub

Sub FlKansuu(ByVal sA As String, ByRef sB As String)

sA = "003"
sB = "004"

End Sub
    • good
    • 0
この回答へのお礼

詳しい内容ありがとうございます。
ByVal、ByRefの違いも聞きたかったのですが、そこまで教えて頂いて、
助かります。
あと、ちょっと、参考プログラムの解説をしてもらいたいです。
sAは001で帰ってきて、sBは004で帰ってくる。
でいいんですかね?混乱中。
すいませんが、お願いします。

お礼日時:2001/08/23 14:18

Call Shell(AppName, 1)



というステートメントがあった時、
AppNameという変数、および1という定数が引数です。

Callで呼び出すSubもしくはFunctionに渡すパラメータ
のことなのですが...。
言葉だけの問題でしょうね。
    • good
    • 0
この回答へのお礼

言葉の定義ぐらいなら、解るんですが...。
内容(意味)が解りません。

お礼日時:2001/08/23 14:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAの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を呼び出すことが
できるのでしょうか。

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
----------------...続きを読む

Aベストアンサー

標準モジュールを1つ作って

public sub DB_Syori
(DBより表示処理)
end sub

Private Sub 表示_Click()
'''(DBより表示処理)
call DB_Syori
End Sub


Private Sub 登録_Click()
(DBへの登録処理)
UserForm1.Hide
'''Call WorkSheets("Sheet1").表示_Click() ・・・☆
call DB_Syori
Exit Sub
End Sub

こんな感じで
(DBより表示処理)
を外に移せば動きます。

QVBA: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列目に日付時刻を記入するというものです。宜しくお願い致します。

タイトルどおり、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_Ch...続きを読む

Aベストアンサー

#2です。
>今後のためにも、VBAの構造的な理解、Callステートメント、
>プロシージャ等の理解を助けてくれる本などご存知でしたら
>是非教えて頂きたいです。
最近は、もっぱらヘルプを中心に参照していまして、今どきの本などについては存じ上げませんので、残念ながらご紹介できるようなネタを持ち合わせておりません。

ただ、現在お使いの本をもっとシャブリ尽くす、さらに関数の使用法やVBAの文法などは本の内容に加えてヘルプを確認するなどで理解はすすむのでは、と思います。

また、WebなどにあるExcelのサンプルなどで、結果がどのように得られるのかという過程を検証するというのも実力アップにつながるのではないかと思います。(OKWebの回答もいいサンプルになります。Excelに関しては「コンピューター [家庭向け] > ソフトウェア > Microsoftアプリケーション」のカテゴリで質問されるのが多いです。)


>ExFlgとはどういった意味なのでしょうか?
これは私が勝手に決めた変数です。(Public変数というものですが、これについてはヘルプや本で確認できると思います。)
http://okweb.jp/kotaeru.php3?q=911764
の質問で#1(=#2)さんが、フラグを使ってコントロールする方法がありますという紹介をされていますが、それの具体的な例に当たります。
フラグといのはプログラムをコントロールするための変数です。フラグ=旗のイメージで、旗が立っていたら、プログラム上のある処理を行う。旗が寝ていたら、何も行わないなどといった形で使います。
この場合でしたら、ワークブックが開いたときにフラグを寝かして置く。Ctrl+Tが押されたらフラグを立てる。ワークシートが変更された時に、フラグが立っていたら、時刻を記入するという流れになります。

(「フラグを立てる」とかは一般的にも使いますが、普通「寝かす」とは言わないです。説明のための表現ですので、お間違えなきよう)

#2です。
>今後のためにも、VBAの構造的な理解、Callステートメント、
>プロシージャ等の理解を助けてくれる本などご存知でしたら
>是非教えて頂きたいです。
最近は、もっぱらヘルプを中心に参照していまして、今どきの本などについては存じ上げませんので、残念ながらご紹介できるようなネタを持ち合わせておりません。

ただ、現在お使いの本をもっとシャブリ尽くす、さらに関数の使用法やVBAの文法などは本の内容に加えてヘルプを確認するなどで理解はすすむのでは、と思います。

また、Webなど...続きを読む

Q初心者です call文の引数がかえってきません

ACCESSVBAでの質問です。こちらへの質問で大丈夫でしたでしょうか。。

初心者で、本やサイトを見よう見まねで書いており、
おかしな記述をしている可能性がありますが、すみませんお許しください。

Private Sub 金額_AfterUpdate()
Set objdb = Application.CurrentProject.Connection
strSQL = "SELECT [残高] FROM 入出金テーブル where [ID] = " & Me![ID] - 1
Set objrs = objdb.Execute(strSQL)

If objrs.EOF = False Then
Call aaa(Me.[入出金区分].Value, Me.[残高].Value, objrs("残高").Value, Me.[金額].Value)
Else
MsgBox "ありません", vbOKOnly + vbExclamation, "該当なし"
Cancel = True
End If
End Sub

Sub aaa(wInOut As Integer, wZandaka As Currency, wRSZandaka As Currency, wKingaku As Currency)
Select Case wInOut
Case 1, 4, 7
wZandaka = wRSZandaka + wKingaku
Case 2, 3, 5, 6
wZandaka = wRSZandaka - wKingaku
Case Else
Exit Sub
End Select
End Sub

金額が変更されたら残高を更新したいというもので、
上記のほかにも残高再計算などでaaa subを使いたいと思っています。
(call文の練習をかねてやってみたいと思っています)
そこで上記のように記載したのですが、wZandakaの値がMe.[残高].Valueにかえってきません。

どなたか教えていただけないでしょうか。
また、ほかにも書き方におかしな点は多々あると思います。
その点も教えていただければ助かります。

ACCESSVBAでの質問です。こちらへの質問で大丈夫でしたでしょうか。。

初心者で、本やサイトを見よう見まねで書いており、
おかしな記述をしている可能性がありますが、すみませんお許しください。

Private Sub 金額_AfterUpdate()
Set objdb = Application.CurrentProject.Connection
strSQL = "SELECT [残高] FROM 入出金テーブル where [ID] = " & Me![ID] - 1
Set objrs = objdb.Execute(strSQL)

If objrs.EOF = False Then
Call aaa(Me.[入出金区分].Value, Me.[残高].Value, objrs("残...続きを読む

Aベストアンサー

VB/VBAのサブプロシージャの引数は基本的には ByValの値渡しになります

呼び出し元に値を返したい場合は ByRefの参照渡しにしないとできません
また、1つの値だけ返すのであれば Function(関数)として定義する方法もありますよ

Sub aaa(wInOut As Integer, ByRef wZandaka As Currency, wRSZandaka As Currency, wKingaku As Currency)
  Select Case wInOut
    Case 1, 4, 7
      wZandaka = wRSZandaka + wKingaku
    Case 2, 3, 5, 6
      wZandaka = wRSZandaka - wKingaku
    Case Else
      Exit Sub
  End Select
End Sub
といった具合にします

関数定義なら

Function aaa(wInOut As Integer, wRSZandaka As Currency, wKingaku As Currency) as Currency
  dim wZandaka as Currency
  Select Case wInOut
    Case 1, 4, 7
      wZandaka = wRSZandaka + wKingaku
    Case 2, 3, 5, 6
      wZandaka = wRSZandaka - wKingaku
    Case Else
      Exit Sub
  End Select
  aaa = wZandaka
End Sub
として
呼び出し側は
Me.[残高].Value = aaa(Me.[入出金区分].Value, objrs("残高").Value, Me.[金額].Value)
といった具合に使います

VB/VBAのサブプロシージャの引数は基本的には ByValの値渡しになります

呼び出し元に値を返したい場合は ByRefの参照渡しにしないとできません
また、1つの値だけ返すのであれば Function(関数)として定義する方法もありますよ

Sub aaa(wInOut As Integer, ByRef wZandaka As Currency, wRSZandaka As Currency, wKingaku As Currency)
  Select Case wInOut
    Case 1, 4, 7
      wZandaka = wRSZandaka + wKingaku
    Case 2, 3, 5, 6
      wZandaka = wRSZandaka - wKi...続きを読む

QCallで呼び出し後にそのCallで例外が発生

例えば、下記のCallでプロシージャProc1を実行した後に、そのCallで例外(HRESULT からの例例:0x800A01B6)が発生します。

Call Proc1(a, b, c)

デバッグモードでこのCallにストップをかけ実行します。停止した後に1ステップごとに実行を進めるとと、Proc1が正常に終了した後、このCallで例外が発生したと報告されます。

環境は、Windows 7、VB 2010 Express、IE 11です。
何が起こっているのでしょうか?

Aベストアンサー

例外は登録されていないエラー種別なので、厳密には何が起きているか判りません。

ただ、Callで起きる場合の大半は型があっていないことが原因なので、
引数か関数そのもの型を確認してキャストしてみてください

QSETステートメントについて

こんにちは^^
vb6.0のSETステートメントについて質問です。
SETの使い方がいまいちよくつかめないのですがどういった時に使われるものなのでしょうか?

Aベストアンサー

オブジェクト変数への代入で使用します。

こちらの説明がわかりやすそうです。
http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/instance.html


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報