Excel マクロで For 文を使う時のインデックス (慣習的に i がよく使われていますね) は先に変数として宣言しておく必要があるのでしょうか。
独学で継ぎ接ぎに学びながら作ってきましたが、頭の方で Dim i As Integer などと宣言しなくても使えていたので必要ないと思っていました。しかし最近例として書かれているコードのほぼ全てで先に変数として宣言されていることに気づきました。
他の言語では先に宣言することはないようですが。
Excel マクロでは何故先に宣言するのでしょう。
No.1
- 回答日時:
Cは、変数の型宣言は、省略不可でした。
Fortran 、basic、Excelマクロは、省略可能です。
iは、多くの言語で変数として使われています。
古いFortranは、ijklmnを変数の先頭にすると、整数型、以外の文字を先頭にすると、小数点以下も扱える実数型でした。例えばaを整数型変数で使う場合は、型宣言が必要でした。
Excelマクロは、型宣言は曖昧です。
Dim i as Integerをせずに、i=1.5とすると、エラーは出ませんが、配列で、a(i)とするとエラーが出ます。
Dim i as Integerをすると、i=1.5なら、エラーになります。
iに小数点以下のある数値を認めないために多くは、型宣言をしているのだと思います。
自身は、型宣言していません。特に支障はありませんから。
No.2
- 回答日時:
VBAでは宣言してない変数は、Variant型というなんでも入る変数として扱われます。
変数に型のある他の多くの言語では、先にもしくは同時に宣言します(CとかJavaとか)。
int i; for(i=0; i<10; i++) とか、for(int i=0; i<10; i++) とか。
変数に型がない言語では変数を宣言しなくてもよい言語も多いです(あなたの知っている他の言語というのはこれですね)。
型がなくても、変数のスコープ(有効範囲)を明示して宣言する言語もあります(JavaScriptとかPerlとか)。
VBAは変数に型のある言語なので、宣言するのが普通です。
冒頭にOption Explicitと書くと、宣言が必須になります(宣言しないで使うとエラー)。
No.3
- 回答日時:
まずは宣言と代入が同時に出来ないからでしょうね。
VBなら同時に
For i As Integer = 1 To 10
などと書けます。
⇒ただ旧VB(VB6.0)以降だったかと思います。
>ほぼ全てで先に変数として宣言されていることに気づきました。
逆に『後で宣言』じゃだめなの?という疑問はないのですよね?
であれば単純に旧VBを基本として作成されたVBAだからこそ、冒頭の行為が出来ないためってなると思いますよ。
For i = 1 to 10 のような使用直前の記載(代入)時には型宣言ができないから、そして Variant にしないため型宣言はした方が良い、ということでしょうか。
No.4
- 回答日時:
私は、宣言をしないで使うことがほとんどです。
例外的に、宣言することもあります。 ちょっと面倒な処理をして、変数を数多く使用する場合に、変数名を見て、これがなんであったのかの識別が楽になり、変数名を誤ってミスタイプし、無用な誤動作やエラーを生じさせないことが大事な場合に、変数名を宣言し、アルファベットの場合、適宜大文字を交えた名前に宣言しておきます。以前は、結構やっかいな処理を色々組合せ、そこそこに大きなプログラムをいくつか連動させることもしていたので、プロシージャ間の変数の値の受渡しも必要でしたし、後でシステムを改善するような場合、変数の宣言とコメントで、読みやすくすることも大事でした。 ですから、そうしたことをやっていたときには、宣言を忘れて変数を使うのを防止するために、Option Explicitの宣言もしていました。
でも、今は、ちょっとした処理をさせる程度で、コードも、30~40行程度の中で収まる処理なので、宣言はしないで、適当に、i,j,k,mb_2,mb_3,sTs,sTe,yss,yseなどのように使っています。 variantではマズイ、As Worksheet ,As Range, As Objectにしておく必要があるというような特殊なケースでは、もちろん宣言します。その方が楽ですから。
> Excel マクロでは何故先に宣言するのでしょう。
たぶん、可読性をよくし、メンテの都合、誤動作の排除、作業の分担をよくするという目的の為だと思います。
No.5
- 回答日時:
品質を担保するためのひとつの手段だと思います。
プログラミングって、バグが混入しないように涙ぐましい努力をしているのです。その一環だと思ってください。
一人で作っているうちは、宣言しなくても別に構わないと思いますが、システムを作る場合、一人ですべてを作ることって少ないと思います。
また、システムを運用しているとプログラム修正が必要になったりします。当然、別の人が作ったプログラムを読んで理解して修正することになるのですが、この時に、宣言もしていないようなコードだと、作成者は罵られます。
あなたの書いたプログラムを修正する人に「この糞プログラマが・・・」って言われないように宣言くらいはしましょうね。まぁ、宣言していてもロジックが糞だと結局は言われちゃうんですけどね。
No.6ベストアンサー
- 回答日時:
こんにちは。
Basicは、その黎明期にC言語の影響を強く受けたようです。参考になるプログラムはほとんどCで書かれていた時代でしたから。
その頃のCのプログラマーは慣例的にソースコード冒頭で変数を宣言していたようです。
その慣習がそのままBasicに持ち込まれました。VBA プログラマーの多くが冒頭でまとめて変数を宣言するのは、その様なソースコードを見て学習してきたからです。簡単に言っていまうと、何となく皆そうしているからです。
メモリが数キロバイトしか無い時代では、variant なんてメモリドカ食いの型はなく、少しでも省メモリにするため、変数も省メモリの型を意識的に使用する必要がありました。数バイト削るのも大変な時代です。
例えば Integer は 4バイト必要ですが、byte型なら1バイト。
この様な事情から冒頭で変数の型を一元管理し、メモリが圧迫したら全体を見直すのにまとまって宣言されていた方が都合が良かった様です。
今はメモリが潤沢にあり、省メモリよりエラー防止、可読性、編集の容易さがより重視される時代に至りました。
変数は次の理由で使用する直前に宣言することを推奨されています。
1. スコープを短くとるため
2. 変数の型を画面をスクロールせず確認できる
3. ソースの1部をコピペするとき宣言が近くにあった方が楽
自分は冒頭でまとめて宣言することに合理的な意味を見つけられないため、直前に宣言する派です。
宣言が必須かと言われれば、VBAでは必須ではありません。
しかし、将来 WindowsAPI などでOSをコントロールしたり、他言語との連携があるかもしれません。
その時は厳格な変数の型(宣言)を意識せざる得ません。今のうち(学習初期)から意識することをオススメします。
No.7
- 回答日時:
こんにちは
他の言語など分からない素人が回答して良いか分かりませんが、
個人的な理由を
はじめてVBAを書いた頃(95/98)は変数宣言をしていなかったと思います
理由は覚えていません(面倒、タイプ回数を減らしたかった・・;)
現在は
使い捨てコード以外はしています。。と言うより、する必要がある為です
私は独学で素人なので判らない事も多く、VBEの機能に頼る事が多いです
タイプミスなどでの実行時エラーはきついので最低でもコンパイルエラーで修正したい為、Option Explicit は必ず宣言していますし、入力候補、オブジェクトブラウザーなども使います
したがって変数宣言が必須となってしまいます
(オブジェクトブラウザーを使用するようになってメンバー型を意識するようになったような)
宣言の位置ですが、ローカル変数の場合、直前にするのが良いと言う記事を読んだ記憶があります。
記憶のサイトは見つかりませんでしたが、同様なサイトを
https://hatena19.com/position-of-variable-declar …
ただ私の場合、変数で検索したりする為、後からブロックごとに纏めたりする事があります。
話はズレてしまうかと思いますが、デバッグ作業に苦労しないようにするのが良いと思います。
そのように考えると変数宣言や型の明示は良い方法と思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ChatGPTに作らせたい Excel VBA 1 2023/04/05 19:56
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- その他(コンピューター・テクノロジー) ChatGPT ExcelVBAの精度は3.5と4で違いはある? 1 2023/04/21 21:00
- 政治 気象庁の「梅雨明け宣言」は不要。 14 2023/07/11 13:15
- Visual Basic(VBA) VBAに関する質問です 2 2022/03/30 22:44
- Visual Basic(VBA) VBAでPowerPointからExcelにレイアウト通りに出力する 4 2023/07/05 12:22
- 心理学 SNSで休止宣伝をしてるのに2日後に普通に更新する理由ってなぜですかね? 好きな人が去年の5月から受 3 2023/03/05 07:33
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- JavaScript 条件に該当した時のみ定数を宣言する事はできますか 8 2023/03/15 05:55
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ドリルドライバーのチャックが...
-
学習机の解体方法
-
写真のようなL字フックを電動ド...
-
切削油と潤滑油
-
一度ついた木工用ボンドを落と...
-
ふすまの引き手がとれません
-
PPT 画像挿入の際、レイアウト...
-
軽量鉄骨の倉庫内に棚を作りた...
-
PS3を自作PCとして使用するには...
-
ラティス組み立ての電動ドライバ
-
木に円形の掘り込みをする方法
-
【ワード】目次がずれてしまいます
-
(大至急)電動ドライバーのビッ...
-
photorecordのような写真レイア...
-
木材の加工方法を教えてください
-
日曜大工小技
-
マジックブレッドのブレードが...
-
安物の電動ドライバーについて
-
引越しにともなう、カーテンレ...
-
濃い色で塗った木材の塗料を薄...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
学習机の解体方法
-
ドリルドライバーのチャックが...
-
間柱が軽鉄・軽天の場合の棚板...
-
一度ついた木工用ボンドを落と...
-
濃い色で塗った木材の塗料を薄...
-
軽量鉄骨の倉庫内に棚を作りた...
-
切削油と潤滑油
-
手作り昇降機
-
クギを1回抜いてしまうともう...
-
(大至急)電動ドライバーのビッ...
-
ふすまの引き手がとれません
-
電動ドリルの差込口の太さと購...
-
Wordで図だけのページを作りたい
-
六角レンチを使う組み立て家具...
-
ガスコンロの魚焼き器のみ火が...
-
写真のようなL字フックを電動ド...
-
キーレスチャックのチャックが...
-
USBポートが曲がってしまった!
-
木に円形の掘り込みをする方法
-
本棚を安く作りたい
おすすめ情報