プロが教えるわが家の防犯対策術!

Excel マクロで For 文を使う時のインデックス (慣習的に i がよく使われていますね) は先に変数として宣言しておく必要があるのでしょうか。
独学で継ぎ接ぎに学びながら作ってきましたが、頭の方で Dim i As Integer などと宣言しなくても使えていたので必要ないと思っていました。しかし最近例として書かれているコードのほぼ全てで先に変数として宣言されていることに気づきました。
他の言語では先に宣言することはないようですが。
Excel マクロでは何故先に宣言するのでしょう。

A 回答 (7件)

こんにちは。



Basicは、その黎明期にC言語の影響を強く受けたようです。参考になるプログラムはほとんどCで書かれていた時代でしたから。

その頃のCのプログラマーは慣例的にソースコード冒頭で変数を宣言していたようです。

その慣習がそのままBasicに持ち込まれました。VBA プログラマーの多くが冒頭でまとめて変数を宣言するのは、その様なソースコードを見て学習してきたからです。簡単に言っていまうと、何となく皆そうしているからです。

メモリが数キロバイトしか無い時代では、variant なんてメモリドカ食いの型はなく、少しでも省メモリにするため、変数も省メモリの型を意識的に使用する必要がありました。数バイト削るのも大変な時代です。

例えば Integer は 4バイト必要ですが、byte型なら1バイト。

この様な事情から冒頭で変数の型を一元管理し、メモリが圧迫したら全体を見直すのにまとまって宣言されていた方が都合が良かった様です。

今はメモリが潤沢にあり、省メモリよりエラー防止、可読性、編集の容易さがより重視される時代に至りました。

変数は次の理由で使用する直前に宣言することを推奨されています。

1. スコープを短くとるため
2. 変数の型を画面をスクロールせず確認できる
3. ソースの1部をコピペするとき宣言が近くにあった方が楽

自分は冒頭でまとめて宣言することに合理的な意味を見つけられないため、直前に宣言する派です。

宣言が必須かと言われれば、VBAでは必須ではありません。

しかし、将来 WindowsAPI などでOSをコントロールしたり、他言語との連携があるかもしれません。

その時は厳格な変数の型(宣言)を意識せざる得ません。今のうち(学習初期)から意識することをオススメします。
    • good
    • 1
この回答へのお礼

今は狭い範囲に収めるという意見が増えてきているのですね。

お礼日時:2022/08/27 19:43

こんにちは


他の言語など分からない素人が回答して良いか分かりませんが、
個人的な理由を
はじめてVBAを書いた頃(95/98)は変数宣言をしていなかったと思います
理由は覚えていません(面倒、タイプ回数を減らしたかった・・;)

現在は
使い捨てコード以外はしています。。と言うより、する必要がある為です

私は独学で素人なので判らない事も多く、VBEの機能に頼る事が多いです
タイプミスなどでの実行時エラーはきついので最低でもコンパイルエラーで修正したい為、Option Explicit は必ず宣言していますし、入力候補、オブジェクトブラウザーなども使います
したがって変数宣言が必須となってしまいます
(オブジェクトブラウザーを使用するようになってメンバー型を意識するようになったような)

宣言の位置ですが、ローカル変数の場合、直前にするのが良いと言う記事を読んだ記憶があります。
記憶のサイトは見つかりませんでしたが、同様なサイトを
https://hatena19.com/position-of-variable-declar …

ただ私の場合、変数で検索したりする為、後からブロックごとに纏めたりする事があります。

話はズレてしまうかと思いますが、デバッグ作業に苦労しないようにするのが良いと思います。
そのように考えると変数宣言や型の明示は良い方法と思います
    • good
    • 0
この回答へのお礼

明示しなくても使えるけど明示はしおいて方がよい。まあ単純に考えればそうですね。

お礼日時:2022/08/28 14:34

品質を担保するためのひとつの手段だと思います。


プログラミングって、バグが混入しないように涙ぐましい努力をしているのです。その一環だと思ってください。

一人で作っているうちは、宣言しなくても別に構わないと思いますが、システムを作る場合、一人ですべてを作ることって少ないと思います。
また、システムを運用しているとプログラム修正が必要になったりします。当然、別の人が作ったプログラムを読んで理解して修正することになるのですが、この時に、宣言もしていないようなコードだと、作成者は罵られます。
あなたの書いたプログラムを修正する人に「この糞プログラマが・・・」って言われないように宣言くらいはしましょうね。まぁ、宣言していてもロジックが糞だと結局は言われちゃうんですけどね。
    • good
    • 0
この回答へのお礼

一般のプログラミングでは for 文用の使い捨てでも宣言するものなのですね。

お礼日時:2022/08/27 18:44

私は、宣言をしないで使うことがほとんどです。

 例外的に、宣言することもあります。 ちょっと面倒な処理をして、変数を数多く使用する場合に、変数名を見て、これがなんであったのかの識別が楽になり、変数名を誤ってミスタイプし、無用な誤動作やエラーを生じさせないことが大事な場合に、変数名を宣言し、アルファベットの場合、適宜大文字を交えた名前に宣言しておきます。
以前は、結構やっかいな処理を色々組合せ、そこそこに大きなプログラムをいくつか連動させることもしていたので、プロシージャ間の変数の値の受渡しも必要でしたし、後でシステムを改善するような場合、変数の宣言とコメントで、読みやすくすることも大事でした。 ですから、そうしたことをやっていたときには、宣言を忘れて変数を使うのを防止するために、Option Explicitの宣言もしていました。

でも、今は、ちょっとした処理をさせる程度で、コードも、30~40行程度の中で収まる処理なので、宣言はしないで、適当に、i,j,k,mb_2,mb_3,sTs,sTe,yss,yseなどのように使っています。 variantではマズイ、As Worksheet ,As Range, As Objectにしておく必要があるというような特殊なケースでは、もちろん宣言します。その方が楽ですから。

> Excel マクロでは何故先に宣言するのでしょう。

たぶん、可読性をよくし、メンテの都合、誤動作の排除、作業の分担をよくするという目的の為だと思います。
    • good
    • 1

まずは宣言と代入が同時に出来ないからでしょうね。



VBなら同時に

For i As Integer = 1 To 10

などと書けます。
⇒ただ旧VB(VB6.0)以降だったかと思います。

>ほぼ全てで先に変数として宣言されていることに気づきました。

逆に『後で宣言』じゃだめなの?という疑問はないのですよね?
であれば単純に旧VBを基本として作成されたVBAだからこそ、冒頭の行為が出来ないためってなると思いますよ。
    • good
    • 0
この回答へのお礼

For i = 1 to 10 のような使用直前の記載(代入)時には型宣言ができないから、そして Variant にしないため型宣言はした方が良い、ということでしょうか。

お礼日時:2022/08/27 16:30

VBAでは宣言してない変数は、Variant型というなんでも入る変数として扱われます。



変数に型のある他の多くの言語では、先にもしくは同時に宣言します(CとかJavaとか)。
int i; for(i=0; i<10; i++) とか、for(int i=0; i<10; i++) とか。

変数に型がない言語では変数を宣言しなくてもよい言語も多いです(あなたの知っている他の言語というのはこれですね)。
型がなくても、変数のスコープ(有効範囲)を明示して宣言する言語もあります(JavaScriptとかPerlとか)。

VBAは変数に型のある言語なので、宣言するのが普通です。
冒頭にOption Explicitと書くと、宣言が必須になります(宣言しないで使うとエラー)。
    • good
    • 1
この回答へのお礼

たしかに宣言していない変数へはなんでも代入できますね。
宣言しなくても動かせるけど宣言するのがマナーみたいなものでしょうか。

お礼日時:2022/08/27 16:43

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に小数点以下のある数値を認めないために多くは、型宣言をしているのだと思います。
自身は、型宣言していません。特に支障はありませんから。
    • good
    • 0

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