最近VBを始めたんですけど、関数 定数 変数 引数 の意味がよく理解できません・・・。値を返すとか戻り値とか、あとプロシージャを作るってどういうことですか?なにかにたとえて教えてくれればうれしいです!
お願いします(^。^)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちは。

maruru01です。
これらの言葉はVB特有のものではないので、一般的な、昔私がしてもらったような説明をします。
定数と変数は値を入れる入れ物です。
定数は一度入れたら中身の変更は出来ません。No.1の方も例に出していましたが、「π」という箱に「3.141592」という数字を入れておいて、使いたい時にその箱を持って来ます。いちいちその都度「3.141592」という数字を記述しなくても、「π」という箱の名前を使えばよくなります。
変数は何度でも中身を変更出来ます。例えば、ある時点では「5」が入っていたけど、その後「7」を入れておきたければ、中身を変更します。そうすれば、その後は「7」として使えます。
次に、関数とプロシージャはこれもNo.1の方が言っているように同じようなものです。ただし、プロシージャにはSubプロシージャと、Functionプロシージャがあり、一般的な関数はFunctionプロシージャと同じようなものといえます。
どちらのプロシージャも、ある動作・仕事をする装置といえます。
例えば、スイッチを押すと家の電気がつくという場合、この電気をつける装置(仕組み)がプロシージャというわけです。スイッチを押すというのは、プロシージャを呼び出すことにあたります。
また、スイッチを押すだけじゃなく、ドアをあけたときとか、部屋に入ったときとかにも電気がつくかも知れません。そのような、人(ユーザー)がどんな動作をした時にその装置が動く(プロシージャが呼び出される)かは、作る人の自由です。
また、SubとFunctionプロシージャの違いは、具体的な結果をユーザーに返すかどうかの違いです。
例えば、ミキサーに材料と入れてスイッチを押すとミックスジュース(?)を返してくれます。このように具体的な結果(値)を返してくれるのがFunctionプロシージャで、何か動作をするだけなのがSubプロシージャです。この結果を戻り値と言います。
さらに、このミキサーには当然材料を入れないと結果は返ってこないですが、この材料が、ちょうど引数にあたります。
引数には入れていいものとまずいものがあります。ミキサーに例えば貴金属を入れたら壊れてしまいますよね。
また入れる材料(引数)が変われば、ミキサー(プロシージャ)が返してくれるジュース(戻り値)も変わってきます。

VBというのは、ユーザーが何か動作をした(ボタンをクリックした、リストから選択した、テキストボックスに何か入力したなど)時に、その動作(イベントと言います)に対応したプロシージャを呼び出します。さらにそのプロシージャの動作のなかで、別のプロシージャを呼び出したりします。
そういうプロシージャの集まりがVBというわけです。
ちょっと長くて分かりにくかったかも知れませんが、参考になれば幸いです。
では。
    • good
    • 0
この回答へのお礼

たくさん書いてくれてありがとうございます!
よ~く読んで理解してみます。(やっぱむずかしいです・・・)

ありがとうございました!

お礼日時:2002/02/16 15:15

こんにちは.


これら全て,わからなかったら何もVBできないですよ.
現在本を読んでいるんでしょうか..?

関数とプロシージャ-が同じようなものと考えてください.
定数とは,ある値が決定しているものとでも言えばいいでしょうか..
Const で定義されているものがそうです.
例えば,Const PI = 3.141592
とすれば,絶対にPIは3.141592として使用できます.
数学の式で
S=2πrというのがありましたが,πの値は決まっていますよね?
それが定数です.

逆にさっきの式のrの部分が変数になります.
rの値は円の半径が変わることから,変わりますよね.
例えば Dimなどで宣言されます.
例:
Dim aa as integer
dim bb as integer
aa = 2
bb = aa
aa = 3
とすれば,始めaaには2が入っています.
そして,bbにaaの値が代入され,
aaには3が代入されることになります.
aaやbbの値がその時その時によって変わるのがわかりますでしょうか?

次に引数ですが,
関数やプロシージャに渡すデータの事をいいます.
例えば,akikaというプロシージャがあるとします.

Private sub akika(aa as integer, bb as integer)
Dim cc As Integer
cc = aa
aa = bb
bb = 3
end sub

というプロシージャがあるとします.
(これってプロシージャを作ってることになります)
aa,bbが引数に当たります.
それで,他のプロシージャからこのaikaプロシージャを呼び出すときに,
akikaプロシージャに渡す引数を指定します.

例えば,
call akika(5,4)
とかです.
この場合,aaには5,bbには4が渡されます.
渡すものは値であっても,変数名であってもいいですよ.
わからなければ
また答えます.
    • good
    • 0
この回答へのお礼

たくさんありがとうございます!

土日よく勉強してみます。

また質問するかもしれないですが、そのときはよろしくお願いしますね。

ありがとうございました!

お礼日時:2002/02/16 15:16

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

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

Qプロシージャの引数の取り得る値がIntegerとDouble、両方ある

プロシージャの引数の取り得る値がIntegerとDouble、両方ある場合、

プロシージャの引数の型を、どう宣言しておけば良いのでしょうか。
型によって条件分岐し、それぞれの型に適したプロシージャを作り分けておくなんてことはないですよね?苦笑

If VarType(var) = vbInteger then
  Call FuncInteger(VarInt)
ElseIf VarType(var) = vbDouble then
  Call FuncDouble(VarDbl)
End If

FuncInteger(VarInt)と、FuncDouble(VarDbl)は、
引数の型が違うだけで、内容は同じ。

初歩的な質問で恐縮ですが、何卒宜しくお願い致します。

Aベストアンサー

>プロシージャの引数の取り得る値がIntegerとDouble、両方ある場合、
基本的には、一番、大きなデータ型(Double型やLong型)のデータ型で引数をあてます。

数値判定をして、
>  Call FuncDouble(VarDbl)

で送ります。

関数プロシージャやサブ・プロシージャの場合は、FuncDouble(ByVal arg As Double) とします。
あえてデータ型を変数に含めるなら、dblVar という書き方がよいでしょう。

Excel VBAでは、対ワークシート用で、本格的に作る場合は、Variant 型で受けるように作りますが、セルの値は、数字の場合と文字とエラーですから、プログラム内で分岐して、Double 型かLong型で扱います。場合によっては、Currency 型にしますが、Integer 型での扱いはしません。中級レベルぐらいまでは、そのような面倒なコードでは長くなりますし、プライベートで使うことが多いので、最初から決め打ちしてしまいますので、Variant型にするようなことはないはずです。分かっていてVariant 型にするのと、分からずにVariant 型にするのでは、雲泥の差があります。

一連の質問の様子からすると、今は、あまり細かいことにこだわらないほうが良いような気がします。

>プロシージャの引数の取り得る値がIntegerとDouble、両方ある場合、
基本的には、一番、大きなデータ型(Double型やLong型)のデータ型で引数をあてます。

数値判定をして、
>  Call FuncDouble(VarDbl)

で送ります。

関数プロシージャやサブ・プロシージャの場合は、FuncDouble(ByVal arg As Double) とします。
あえてデータ型を変数に含めるなら、dblVar という書き方がよいでしょう。

Excel VBAでは、対ワークシート用で、本格的に作る場合は、Variant 型で受けるように作りますが、セルの値は、数字の...続きを読む

QVBAの定数の使い方で、計算値を定数に入れることは可能ですか。

VBAの定数の使い方で、計算値を定数に入れることは可能ですか。

例えば、モジュール先頭に、

Option Explicit

Const TEISU_COUNT As Integer = Application.WorksheetFunction.CountA(Range("A1:IV1"))

と書き、その下に、

Sub TestTeisu()

  MsgBox TEISU_COUNT

  '↑定数式が必要です、のようなエラーが出ます。なぜでしょう?
  'エラー時、「.CountA」にスポットがあたります。
  'つまり、ここがダメということでしょうか?やはり、この点が動的だからでしょうか?

End Sub

と書いて、実行。
結果は、上述の通り、エラーとなります。

やはり、定数値には、固定的な数値(上記例では、Integer)や文字列を入れるべきなのでしょうか。

定数に入れることのできる値の注意事項について、
どなたかアドバイスして頂けますでしょうか。
宜しくお願い致します。

Aベストアンサー

#2の回答者です。

本当は、変数と定数の区別のつかない段階で、混乱するので、余計な話は聞かないで進めていったほうがよいのですが、一応、お答えしておきます。

定数は、変動したり値やプロパティを取得するものには使えません。だから、本来、比較のしようがありません。

グローバル変数のメリットとしては、一定の環境で、再取得することなく使えることです。主に、Auto_Open で取得して、最後まで使うことが多いです。グローバルにしておけば、他のプロシージャにでも、使えます。再取得する必要がないので、当然、処理スピードは上がります。

メモリについては、このレベルでは気にするほどのものはありません。String 型ですと、文字数に比例しますが、数値型は、仮にLong 型でも、4 Byte しかありません。Integer型は、2 Byte ですが、事実上、32ビットパソコンでは、4 Byte =32ビット分を使用します。メモリについては心配はほぼないと思います。処理速度の違いですが、定数と変数の違い自体は比べようもありませんが、再取得は別として、変数が100個も使うならともかく、その差は検知できないはずです。

グローバル変数のデメリットは、実は、マクロ稼働中にエラーが発生して、グローバル変数の内容がなくなってしまう、という問題があります。そうすると、以下のようなチェックコードが必要になるということがあります。

If g_Count =0 Then
 Call RowCount
End If

'//
Public g_Count As Integer

Public Function RowCount()
 g_Count = Application.WorksheetFunction.CountA(Range("A1:IV1"))
End Function

普通は、こんなことは気にしなくてよいのですが、複雑な内容のマクロですと、必要になることがあります。また、なるべく、変数の名称は、プロシージャ内の変数とは区別がつくようにしてやることがコツです。こういうマクロは、1~2年レベルの経験では使わないと思います。

>ある固定的な値を入れる容器として、
>定数を使った場合でも、
>また、グローバル変数を使った場合でも動く

具体的な状況が思い浮かびません。どちらでも動くから、定数を使うというものでもないように思います。
前回も書いたように、消費税や数式の係数に対して用いるというのが、基本です。

#2の回答者です。

本当は、変数と定数の区別のつかない段階で、混乱するので、余計な話は聞かないで進めていったほうがよいのですが、一応、お答えしておきます。

定数は、変動したり値やプロパティを取得するものには使えません。だから、本来、比較のしようがありません。

グローバル変数のメリットとしては、一定の環境で、再取得することなく使えることです。主に、Auto_Open で取得して、最後まで使うことが多いです。グローバルにしておけば、他のプロシージャにでも、使えます。再取得する必要がないの...続きを読む

QExcel2007VBAプロシージャの引数について

●質問の主旨
下記コードのうち、

buf = buf & msg & vbCrLfについて

1.右辺の変数bufはどんな役割があるのでしょうか?
2.右辺のbufを省略したら、メッセージボックスに
表示される「Excel」の文字は3つから1つになります。
これはなぜでしょうか?

ご存知の方ご教示よろしくお願いします。

●コード
Sub Sample8()

Call Sample9("Excel", 3)

End Sub

Sub Sample9(msg As String, n As Long)

Dim i As Long, buf As String
For i = 1 To n
buf = buf & msg & vbCrLf
Next
MsgBox buf

End Sub

Aベストアンサー

Forループの1回目はbufには何も入っていないので、

buf = "" & "Excel" & vbCrLf

になります。2回目はbufは上記のものが入っているので、

buf = "" & "Excel" & vbCrLf & "Excel" & vbCrLf

になります。右辺のbufがその時点のbufの内容と置き換えられてbufに代入されます。
右辺にbufがなければ、bufの内容にかかわらず

buf = "Excel" & vbCrLf

なので、ループさせる意味はありません。

Qプロシージャまたは関数の引数が多すぎますのエラー

お世話になります。

下記のコードを実行すると
プロシージャまたは関数 spTest の引数が多すぎます

どこが悪いのかご教示お願いいたします。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Integer
Dim conn As New SqlConnection(connstr)
Dim cmd As New SqlCommand

conn.Open()
cmd.Connection = conn

cmd.CommandText = "Delete Table2"
cmd.CommandType = CommandType.Text
Debug.WriteLine(cmd.ExecuteNonQuery())


For i = 1 To 100
spTest(cmd, i)
Next

conn.Close()

End Sub


sub spTest(ByRef cmd As SqlCommand, ByVal intID As Integer)

Dim param As SqlParameter

With cmd

.CommandType = CommandType.StoredProcedure
.CommandText = "spTest"

param = .Parameters.Add(New _
SqlParameter("@ID", SqlDbType.Int))
param.Value = intID

.ExecuteNonQuery()
   ''''' ここで2回目からエラーが発生します

End With


End sub

お世話になります。

下記のコードを実行すると
プロシージャまたは関数 spTest の引数が多すぎます

どこが悪いのかご教示お願いいたします。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Integer
Dim conn As New SqlConnection(connstr)
Dim cmd As New SqlCommand

conn.Open()
cmd.Connection = conn

cmd.CommandText = "Delete Table2"
cmd.CommandType ...続きを読む

Aベストアンサー

Sub spTestの中で、cmdに毎回SqlParameterを足しているからでは。1回目のAddでパラメータ1個、2回目のAddでパラメータ2個になり、2回目がエラーになるのでしょう。

QVB6 エラー「プロシージャの呼び出し、または引数が不正です。」につい

VB6 エラー「プロシージャの呼び出し、または引数が不正です。」について

いつもお世話になっております。

早速ですが、Form_Activateイベント内でこのエラーが出力されていることを
確認いたしました。

ただし、フォームアクティブ時に自動的に流れる時はエラーは出力されず、
明示的にForm_Activateイベント呼び出して動かす時にだけ出ています。

そこで質問です。
(1)Form_Activateイベントを明示的に呼び出すことはプログラム上問題がありますか?
(2)Form_Activateイベントでこのエラーが発生する事例などがあれば教えてください。
(3)画面がアクティブになった際にForm_Activateイベントを明示的に呼び出した場合、
 エラーが起こる事はありますか?
(4)Form_Activateイベント内に限らず、このエラーが出る事例などがあればお教えください。

始めたばかりで低レベルな質問でもうしわけありませんが、よろしくお願いします。

Aベストアンサー

#2です。説明を少し補足。

>Form_Load、Form_Active、Form_Paintの各イベント
>で行なって、フォームのサイズを変えて何が起こるか確認。

は、

Form_Load、Form_Active、Form_Paintの各イベント
で行なって、何が起こるか確認。その後、
フォームのサイズを変えて何が起こるか確認。

です。


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

おすすめ情報