VBAを勉強しています。超初心者の質問なんですけど、モジュール 変数 引数 関数 定数 このへんのことがごっちゃでよく区別がつきません。軽い説明でもいただけたらうれしいです!教えてくださいm(__)m

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

A 回答 (2件)

モジュールは作ったプログラムを保存するときに一つのファイルとなる単位です。

フォームを作る度に「フォームモジュール」が一つ出来る。(あまり深く考えないでいいと思います)


変数は数字をわかりやすい言葉に置き換えることとでも言いましょうか。
たとえば 一個100円のもの20個の値段を出したければ Kosuu(個数のこと) Tanka(単価) Goukei(合計) という変数を作れば

Tanka = 100
Kosuu = 20
と置き換えることによって
Goukei = Tanka * Kosuu
と計算する、といったように使います。


関数は先ほどの例で言えば

Goukei = Tanka * Kosuu

というのを一つの関数としてあらかじめ作ることによって合計を出したいときには Tanka Kosuu の値を指定して関数を呼び出すことによってGoukeiが出てくるというものです。関数に関しては実際に演習でもやってみると簡単に解ると思いますよ。
そして引数はこのときの関数で言うところのTankaとKosuuのことです。


定数は変数と同じようなものですが
変数はプログラムの途中で値が変えられるのに対し変えることが出来ません。

たとえばリンゴの計算をするときに
Tanka = 100
として計算した後にミカンの計算をするときには再び
Tanka = 50
のようにしてTankaの変数の値を変えることが出来ますが
定数として
Tanka = 100
としてしまうとプログラムの途中で変えることは出来ません。
変数にしておいて万が一どこかで値が代わってしまうといけないときに定数にします。

言葉で書くとこんな所ですが実際に演習でもしてみてから言葉を覚えた方がいいですよ。
    • good
    • 0

変数と定数


質問に○数と数がついた言葉が4つありますが、算術の数のイメージを捨ててください。算数の数直線をイメージしてください。それがメモリーのイメージです。メモリーの一部(したがってスタートポイントがあり)が何バイトか(したがって終わりがある)確保されている。1バイトを最小にして何バイトかの領域が確保される。何バイトになるかは変数の型で決まり、言語仕様で決まる。個々の変数は変数名を持ち、メモリー上に(スタートアドレスと長さ)を持ち、変数(名)はスタートアドレスに名前をつけ扱い憶えやすくして、長さを(陰に)背負わせたものといえる。コンピュータはその領域に値をセットできる仕組みがあり、上書きすれば前の内容は消え、上書きした内容に置き換わる。Basicは徹底してアドレスの考え、それを指し示すポインターの考えを隠しており、長さもLen,Midなど関数を考えるときに意識するぐらいでこれが初心者向けといわれる1つの理由と思う。
定数は変数にプログラマーの指定する内容をセットしたものと考えられる。ただVBではConst a=2 a=3はエラーにしている。それは
そのルーチン(スコープ)中は内容を変えないという考えを具現しているに過ぎない。代入式の右辺に書く値そのものを「リテラル」と言うことにすれば、Constを使わなくてもc=1とかc=”a”のリテラル表記をその言語がゆるせば、目的は達せられる。自分で変えなければ良いのだから。
変数に内容をセットする仕方は
(1)ファイルから読みこみ Input#1,a
(2)キーボードから入力してa=Inputbox(”a=”)
(3)演算して a=b+2
(4)他の部分より移送 a=c 
(5)リテラル利用 a=3 a=”abc”
(6)定数利用 Const a=3.14
(7)システムから a=Today()
定数を使う場面は
(1)数学の定数と同じく演算式 y=a*x+cのa,c
(2)比較の右辺 If a=c Then のc
(3)VbRedやxlThinなどの実は決めたコードを単語らしく表現
(4)具体的に順序数として a(c) のc
For i=1 To 3 と Start=1 End=3 For i=Start to End と は同じなのだが、何かが違うと思う
    • good
    • 0

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

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

Q.NET - 配列変数を省略可能の引数にする方法

お世話になっています。
.NETでのコーディングを行っています。

標記の件ですが、初めてなので
.NETからなのか、もともとそうなのかは不明なのですが、
プロシージャの引数をOptionalで宣言すると、
省略された時の値を設定する必要がありますよね。

省略可能の引数を配列変数にしたい場合、どのように宣言したら良いのでしょうか?

初期値って言っても、今回省略可能にしたい変数は、
検索結果を格納するための変数ですので、
省略されたときには何の値も入っていなくて良いんです。


宣言部分は以下のとおりです。

Public Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _
ByRef Wstr_WeekNm() As String, _
ByRef Wstr_WeekNmR() As String) As Boolean

この、Wstr_WeekNmR()を省略可能にしたいのです。

このような場合、どうやって宣言するべきなのでしょうか?
ヘルプを見たのですが、よくわからなくて・・・(;_;)

念のため、省略された時に、何らかの値を設定する方法も知りたいです。
よろしくお願いいたします。

お世話になっています。
.NETでのコーディングを行っています。

標記の件ですが、初めてなので
.NETからなのか、もともとそうなのかは不明なのですが、
プロシージャの引数をOptionalで宣言すると、
省略された時の値を設定する必要がありますよね。

省略可能の引数を配列変数にしたい場合、どのように宣言したら良いのでしょうか?

初期値って言っても、今回省略可能にしたい変数は、
検索結果を格納するための変数ですので、
省略されたときには何の値も入っていなくて良いんです。


宣言部...続きを読む

Aベストアンサー

>ByRefは、呼び出された関数内で値を変えるための変数という認識でよいのでしょうか?
そうですね、呼び出し元のコピー(ByVal)でなく、呼び出し元で渡した変数自身を直接変更するということです。

>取得したい検索結果が3個あり、2つだけ取得したい場合と、3つ全部取得したい場合があります。
そういう場合は、
引数が3つある関数と2つある関数と2つ作っておけば、いいような気がします。
あるいは、
#3の方の言われる様に(註:ByRefでいいです)
Optional ByRef Wstr_WeekNmR() As String = Nothing
optional指定をした場合は、配列の場合nothingしか指定できません。
(なので、質問文で言われるような「省略された時に、何らかの値を設定する方法」(定数の配列?)はありません)
そして、Wstr_WeekNmR is Nothingで省略されたかどうか調べればいいですね。

Q関数の引数に複数のユーザ定義型変数を使いたい

一つの関数の一つのパラメータが異なるユーザ定義型を受けられるようにしたいのですが、どのようにすればいいのでしょうか?

Public Type TypeA
strCodeA As String
intNumA As Integer
End Type

Public Type TypeB
strCodeB As String
intNumB As Integer
End Type

Public Function funcTest(arg1 As Variant) As Integer
(略)
End Function

と記述して関数を
Dim datA As TypeA
iResult = funcTest(datA)
と呼び出そうとすると、次のようなエラーメッセージが表示されて進みません。

コンパイルエラー:
パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。

Aベストアンサー

ユーザ定義型ではなく、クラスを使いましょう。

インスタンスの生成(New)と破棄に気をつければ、ユーザー定義型と殆ど同じ使い勝手です。

例えば
---------------------- Class1'TypeAの代わり
Option Explicit
Public strCodeA As String
Public intNumA As Integer
---------------------- Class2'TypeBの代わり
Option Explicit
Public strCodeB As String
Public intNumB As Integer

としておいて

Dim TypeA1 As New Class1
Dim TypeB1 As New Class2

TypeA1.strCodeA = "Code1"
TypeB1.strCodeB = "Code2"

Call funcTest(TypeA1) 'call funcTest(TypeA)もどき
Call funcTest(TypeB1) 'call funcTest(TypeB)もどき

という風に出来ます。

funcTestでは

Public Function funcTest(arg1 As Variant) As Integer
Dim c1 As Class1
Dim c2 As Class2

If TypeOf arg1 Is Class1 Then '引数がClass1
Set c1 = arg1
Debug.Print c1.strCodeA
Else
If TypeOf arg1 Is Class2 Then '引数がClass2
Set c2 = arg1
Debug.Print c2.strCodeB
End If
End If
End Function

のようにすればいいでしょう。

ユーザ定義型ではなく、クラスを使いましょう。

インスタンスの生成(New)と破棄に気をつければ、ユーザー定義型と殆ど同じ使い勝手です。

例えば
---------------------- Class1'TypeAの代わり
Option Explicit
Public strCodeA As String
Public intNumA As Integer
---------------------- Class2'TypeBの代わり
Option Explicit
Public strCodeB As String
Public intNumB As Integer

としておいて

Dim TypeA1 As New Class1
Dim TypeB1 As New Class2

TypeA1.strCodeA = "Code1"
T...続きを読む

QEXCELのブック名を引数(変数)として設定するには

マクロを保存したブック(シート)にデータをコピーしたいブックのウインドウをActiveにしてセルのコピーをしたいのですが、うまくいきません。下記に例を記載しますのでご教示願います。

1 Dim WBK As Workbook
2 Dim stWBK As String
3 Range("A3").Select 'このシートのA3にブック名があります
4 Selection.Copy
5 stWBK = Clipboard
6 Windows(stWBK)Activate

別のやり方で
stWBK= Range("A3").Select
も試しましたがだめです。

Aベストアンサー

複数のシートやブックを扱う時は、操作対象としているRangeがどのブックのどのシートであるかを明示しておいた方が、間違いが少なくなります。
ブック名、シート名で指定するなら、
 Workbooks("book1.xls").Worksheets("sheet1").Range("○○")
のようになります。(ブックやシート、Rangeなどは変数でも可)

作業中にかならず対象のブックが開いているという前提であれば、
 Windows("ブック名").Activate '/←「.」に注意
で対象のブックをアクティブにできます。
ご質問の例でいえば
 stWBK = ActiveSheet.Range("A3").Value (またはText)
 Windows(stWBK).Activate
で可能ですが、実は、手動での操作と違って、わざわざブックをアクティブにする必要はありません。

セルの値の単純コピーを例にすれば
 wb1.sh1.Range("A3") = wb2.sh2.Range("B5")
などとすることで、そのままコピーが可能です。
(Wb1,sh1などは、ブック、シートを示す変数です)

なお、対象とするブックが開いていない場合は、
 Workbooks.Open "○○~~~"
などで、ブックを開くところから記述する必要があります。

複数のシートやブックを扱う時は、操作対象としているRangeがどのブックのどのシートであるかを明示しておいた方が、間違いが少なくなります。
ブック名、シート名で指定するなら、
 Workbooks("book1.xls").Worksheets("sheet1").Range("○○")
のようになります。(ブックやシート、Rangeなどは変数でも可)

作業中にかならず対象のブックが開いているという前提であれば、
 Windows("ブック名").Activate '/←「.」に注意
で対象のブックをアクティブにできます。
ご質問の例でいえば
 stWBK = Acti...続きを読む

Q変数宣言(Dim)と定数宣言(Const)のメモリ使用量

VS2005で開発しています。
Constで定数宣言したものはソース上でカーソルを当てるとその場で内容を確認できますが、変数で宣言しておくことでメモリ使用量が少なくなると言われました。
そうするといちいち定義まで飛ばないと定数の中身が見れず不便に思っているのですが、本当にメモリ使用量が少なくなるのでしょうか?

Aベストアンサー

・Constはコンパイルしたときに消えるので、そもそもメモリを使っていない。

  Const A As Integer = 1
  Dim B As Integer = A

  コンパイルすると

  Dim B as Interger = 1

変数にするとメモリを使うので、むしろメモリ使用量が増える。

だだし、文字列を複数回使う場合は、Constより変数がいいかな。

  Const C As String = "***************************************************************"
  Dim D As String = C
  Dim E As String = D

  コンパイルすると

Dim D As String = "***************************************************************"
Dim E As String = "***************************************************************"

・Constはコンパイルしたときに消えるので、そもそもメモリを使っていない。

  Const A As Integer = 1
  Dim B As Integer = A

  コンパイルすると

  Dim B as Interger = 1

変数にするとメモリを使うので、むしろメモリ使用量が増える。

だだし、文字列を複数回使う場合は、Constより変数がいいかな。

  Const C As String = "***************************************************************"
  Dim D As String = C
  Dim E As String = D

  コンパイルすると

...続きを読む

QVBAのプロシージャーと変数の名前の区別について

VBAの初心者です。教えてください。
Sub ex()
Dim a As Integer
Dim b As Integer
a = 2
a a, b

MsgBox b
End Sub
Sub a(a As Integer, b As Integer)
b = a
End Sub
上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

Aベストアンサー

適用範囲が、同じ範囲になりますので、同じ名前を使うことは出来ません。


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

おすすめ情報