現在、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# C++の標準入力の書き方 6 2023/02/23 23:53
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- 日本語 複合名詞(造語)について教えて欲しいです 2 2022/05/22 17:14
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- 数学 モデルのパラメータの定義がいまいちわかりません。 3 2022/10/11 15:16
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
エクセルVBA 「On Error GoTo 0」について
Excel(エクセル)
-
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
マクロの「Rangeメソッドは失敗しました’Globalオブジェクト」エラーの解決方法について
Excel(エクセル)
-
-
4
VBAでワークシートを引数としてサンプル関数に渡したい
Visual Basic(VBA)
-
5
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
6
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
7
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
8
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
9
エクセルで行の一番上にセルに移動させるVBA
Excel(エクセル)
-
10
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
11
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
12
エクセルVBAのエディターが上書きモード?に・・・・。
Excel(エクセル)
-
13
エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
Excel(エクセル)
-
14
エクセルでエラーが出て困っています。
Excel(エクセル)
-
15
【VBAユーザーフォームで閉じるボタンを表示したくない】
Visual Basic(VBA)
-
16
ACCESS 複数のフォームから同一テーブル参照
Access(アクセス)
-
17
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
18
「パス名が無効です」の発生原因
Visual Basic(VBA)
-
19
別のシートから値を取得するとき
Visual Basic(VBA)
-
20
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
2重定義って??
-
C言語について質問です。 子プ...
-
sshdログの意味
-
C++でboolにintの値を代入する...
-
Arduinoのプログラムについて
-
visualstudio C# テキストボッ...
-
エラー「invalid conversion fr...
-
main.c:7:43: warning: implici...
-
staticで初期化した変数(?)を使...
-
void main (void)について、、、
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
プログラムの中で別のmainを呼...
-
C言語 宣言した変数になにも代...
-
マイナスからプラスへ転じた時...
-
変数とパラメータとは違うもの...
-
「指定されたキャストは有効で...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
【#define】 defineで定義した...
-
void func( void )について
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
C++の(左辺値)参照を参照渡し
-
main()とint main(void)の違い
-
intとINTの違いは?
-
エラー「invalid conversion fr...
おすすめ情報