
現在、VBAを使ってプログラミングを行っているところなのですが、
一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、このように型を定義しなくとも使うことが出来ます。もし定義しなかった場合、その変数の型は何に設定されているのでしょうか?
では型を定義するメリット及び、せずに使った場合のデメリットは何なのでしょうか?
私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?
No.4ベストアンサー
- 回答日時:
こんばんは。
>一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、
もし、入門者に対して、そのようなことを言う人は、経験のあるインストラクターではないと思います。有名な教本などには、そのようなことは書かれていないはずです。
変数を使う時の問題点をあえて書かせていただきます。
私は、今のところ、VBA専門の回答をしていますが、VBAの入門レベルの人は、変数のデータ型を宣言すると、初心者には分からないエラーが時々出るようになります。入門レベルでは、宣言するというのは、入力間違いを減らすために、モジュールの先頭に、Option Explicit と入れ、プロシージャ内で単に Dim 〇〇 とすればよいです。
データ型が決められていないなら、データ型の宣言しないほうが分かりやすいはずです。無理に入れたところで、初心者は、どうしてエラーが発生したか分かりません。それは、扱うデータ型のサイズなどが分からないからです。
VBAの変数のデータ型には、ほとんど、それしかないというものがあるのですが、そういう変数が分かるようになるまでは、しばらくは、テキストを参考にしたり、自分でトライアンドエラーを繰り返し、VBEditor のローカルウィンドウを確認しながら入れてもらうしかありません。ローカルウィンドウには、Variant/Long とか、本来のデータ型が出てきます。
私は、そういう話は、決まりきったことであっても、説明するのは面倒だと思うことが多いです。私は、あまり入門者に対しては教えることはしませんが、分からなければ、あえて使わなくてもよいと言います。
今のPCのスペックで、変数を宣言しないからといって、言うほどの大きな違いがあるとは思えません。Variant 型やString 型は、2Gまでの余裕があるのですが、VBAでは、それ以前に、アプリケーションがVBAに割付されたメモリの制限があり、そこでトラブってきてしまいます。まず、変数自体で、どうこうなるとは思えないです。
本格的には使いこなしは、建前論ではなく、本来、明示的に入れないと意味がありません。
主に、丸め誤差に対してデータ型のゆらぎが発生します。
'-------------------------------------------
'計算結果はどれも 0 となるはずです
Sub Sample1()
Dim dbl_A As Double
Dim sng_B As Single
Dim cur_C As Currency
Dim var_D As Variant
'リテラル値は変数型に影響を受けます。
'Variant型にしておいて、リテラル値に型宣言文字を使用するのは関心しません。
dbl_A = 0.5 - 0.4 - 0.1
sng_B = 0.5 - 0.4 - 0.1
cur_C = 0.5 - 0.4 - 0.1
var_D = 0.5 - 0.4 - 0.1
End Sub
'-------------------------------------------
>私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?
プログラミング言語自体は、ほとんどデータ型の宣言をしないといけないと思います。それだけ、前提となる敷居が高いということです。
逆に、VBAの親戚のVBScript の場合は、データ型の宣言が出来ません。それだけに、例えば、文字と数字の比較は、そのまま比較してはならないわけです。VBAの場合も本来は、If 文字 = 数字 Then という比較すること自体が間違いのはずですが、それがまかり通ってしまうのですから、そういう点でデータ型があやふやになってしまっているわけです。だから、そういうアプリケーションの便利な機能に助けられてコードが成り立っているわけですから、厳密に大きな問題にはならないと思います。
'-------------------------------------------
'VBAサンプルプログラム(本来は、間違いのはずです)
Sub Sample2()
Dim i As Long
Dim j As String
i = 1
j = "1"
If i = j Then
MsgBox "OK"
Else
MsgBox "different"
End If
End Sub
'-------------------------------------------
No.3
- 回答日時:
型を定義しない変数はVariant型といって
整数、実数、文字列など何でも入る型になります。
・・・で型定義のメリットというかVariant型のデメリットを
挙げるとすると、以下のようなものがあります。
□変数の使用メモリサイズが大きい。(16byte)
→1つの定義でByte型(1byte)が16個定義したのと同じです。
□暗黙の型変換が行なわれ、パフォーマンスが悪い。
→何でも値が入るためにその都度暗黙的に型変換が行なわれ
実行速度のパフォーマンスが型定義時に比べ悪い。
□保守性が悪い。
→作成者以外がソフトの改修を行なう際に変数の型が分からないと
調査などに無駄な時間が掛かる。
個人で作成するソフトならともかく
会社で使用するソフトなら変数の型定義は行なった方が良いです。
スクリプト系言語(Perl, JavaScript)などで型定義がないものも
ありますが、型定義が必要なものが一般的です。
No.2
- 回答日時:
VBAの場合、変数を定義しないとvariant型になります。
(状況にもよりますが…)万能の型ですので、いろいろな状況で使うことは出来ますが、他の変数に比べ、メモリの使用領域が増えます。
小さな規模のマクロですとあまり気にになりませんが、複雑で長いマクロを書くと、処理時間が顕著に違ってきます。
また、関数によっては値として受け取れるものが数字型限定のものもあり、この時variantのままだと、きちんと数字を入れているはずなのに型の不一致エラーを受け取るなんて事もあります。
プログラムをしている場合、想定外の動きをしないように用途を限定できる(つまり型を指定する)ということは処理上メリットになります。
variantのように複数の処理に応じられる、ということは裏を返すとどう動くか分からない、ということですので。
> 他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?
はい、あります。というより、殆どそうじゃないですかね。
言語によっては、「型を指定しないとエラーにする」というようなスイッチが存在する言語もあります。
他にもメリット・デメリットあると思いますので、他の方の意見も参考にしていただければと思います。
No.1
- 回答日時:
型宣言をしないと万能のバリアント型に定義されます。
バリアント型は万能ですが、その分メモリを多く消費し動作も遅くなります。
変数の型を管理できていないと言う事はそれだけで、
バグが発生する可能性があると言う事ですので好ましくはありませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
エクセルのVBAの標準モジュールの名前が文字化けしてしまうのですが。。
Excel(エクセル)
-
Excel VBA のdebug(F8キー) がうまく動作しません(超初心者です)
Excel(エクセル)
-
-
4
エクセルVBAで一つ上の階層を指定して保存したい
Excel(エクセル)
-
5
VBAでEmpty値って何ですか?
Excel(エクセル)
-
6
エクセルVBAでパスの¥マークについて
Access(アクセス)
-
7
VBA:Openステートメントで開いたCSVファイルの特定行を削除する方法
その他(プログラミング・Web制作)
-
8
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
main.c:7:43: warning: implici...
-
DWORDの実際の型は何でしょうか
-
ハンドルされていない例外が発...
-
構造体を引数とする、クラス間...
-
sshdログの意味
-
void func( void )について
-
【#define】 defineで定義した...
-
プログラムの中で別のmainを呼...
-
typedefの使い方
-
C++のコンストラクタを宣言する...
-
24ビットの変数
-
2重定義って??
-
C言語のコンパイルエラー
-
相互参照するクラス、俺こんな...
-
最早開始時間と最遅完了時刻を...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
値差の%計算方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
main.c:7:43: warning: implici...
-
long型の定数の末尾にLを付ける...
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
C++のfor文について
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
intとINTの違いは?
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
プログラムの中で別のmainを呼...
-
エラー「invalid conversion fr...
-
GCCで暗黙の型変換の警告を出し...
-
【#define】 defineで定義した...
-
sshdログの意味
-
DDVによるメッセージの変更
-
typedef enumの使い方を教えて...
-
構造体を生成時にわざわざ初期...
-
DLLでLIBファイルが作成されない
おすすめ情報