
No.4ベストアンサー
- 回答日時:
変数を宣言する目的の一つは、間違いを減らすためです。
打ち間違えて、使っていない変数名になってしまった、なんてときに、
Option Explicit が Off だと、エラーにはならずに、そのまま正しく動いているかのように見えてしまうこともあります。
これが、 On だと、打ち間違えた変数名は(多くの場合は)宣言されていないものになるので、エラーになって見つけることができます。
この効果を上げる方法の一つは、変数は使いたいところだけで有効にする、というものです。
#2さんのプログラムを借ります。
Dim u as Long
が適切な場所にあったとして、
もし、
'処理3
u = 5
が正しいのに
'処理3
v = 5
としてしまったとき、
★1 だとエラーにはなりません。★2だとエラーになります。
(たぶん。今Excelが手許に無いので確認できません)
これは、変数の有効範囲を狭めたことによる効果です。
言語によっては、より狭いスコープが使えるものがあります。
例えば、VB.netだと
For i as Integer=1 to 10
Next
だと、このForループの中だけで i が有効です。
No.3
- 回答日時:
こんにちは。
>変数の宣言Dimは、いつもSubの先頭に書いてます。
これは、一つの(コーディング)ルールですね。
VBAというよりも、VB6のしきたりで、Dim の宣言を先頭に出すというのが決まりだったのです。実は、意外に人の冷たい視線が気になったりするので、ルールはルール通り書いているだけだったりします。
>最近ネットで見た意見が「宣言は使う直前に書くべき、理由は変数の寿命が短くなるから」
「ローカル変数は、利用する直前で宣言する」という、VB.Net のルールです。
付け加えると「ローカル変数は、再利用しない」というものもあります。
理由としては、可読性・保守性の問題だとしています。
(『電通国際情報サービス』という所が、これをまとめています)
そういう、VB.Net は、旧VB6 のイメージを消すために新しい書き方をしているのではないかと思うこともありますね。それなりに理由はあるのは聞いてはいますが。
VB.Net と、VBA/VB6 とは違いますから、勝手も違うものだと思います。
VBAの場合は、一部の変数は使いまわしするという習慣があります。(カウンターのi, j など) 変数を使い終わっても、それの変数自体は残ってしまいますので、省メモリの観点から、再利用ということも、否定はできません。しかし、私は、ii とか、jj とか、i1, i2 という変数の書き方もあるのも知っていますが、そこまでしても意味があるのかなって思うことがあります。
ありがとうございます。
とりあえず、一回使ってみようかと思ってます。
下の方で「この変数、何だっけ?」と上に向かって探し始めてハマる危険はありそうです。
No.2
- 回答日時:
Sub t()
'------------------------------
'変数定義部
Dim ...
Dim i As Long '★1
Dim v As Variant = 0 '★1
'------------------------------
'------------------------------
'処理1
'------------------------------
'処理2
'------------------------------
'処理3
'------------------------------
'処理4
'------------------------------
'処理5
'------------------------------
Dim i As Long '★2
Dim v As Variant = 0 '★2
For i = 1 To 4
v = v + i
Next
Debug.Print v
'------------------------------
End Sub
処理の後ろの方になって、初めて出てくる変数の定義や初期化を★1と★2の
どちらで定義したらよりプログラムを読み易いかという話。
「変数の寿命」とか「End Subまでの間は短く」とは無関係。
No.1
- 回答日時:
要らない誤解釈しなくて済むように、先頭で書いておいた方が良いかと
というのは、ここで問題です
以下の ★ で表示される値は何でしょう
1) 4
2) 10
1) or 2) どちらが正解?
Sub t()
Dim i As Long
For i = 1 To 4
Dim v As Variant
v = v + i
Next
Debug.Print v ' ★
End Sub
ありがとうございます。
そんなぁ、やだなぁ、4でしょ?さらっと書いたフリして動作確認、、、ガーン10でした。
まだまだ修行が足りませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel マクロで For 文のインデックスを先に宣言する理由 7 2022/08/27 00:26
- Visual Basic(VBA) VBAに関する質問です 2 2022/03/30 22:44
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
-
4
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
7
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
8
名前をつけて保存した後、元のファイルに戻るには
その他(コンピューター・テクノロジー)
-
9
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
10
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
11
DoEventsがやはり分からない
Visual Basic(VBA)
-
12
エクセルのvbaにて thisworkbookに記載のマクロを他のブックにマクロにて自動コピー出来る
Excel(エクセル)
-
13
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
14
Excel VBA のdebug(F8キー) がうまく動作しません(超初心者です)
Excel(エクセル)
-
15
文字数に合わせて、コントロールの幅を設定する方法
Visual Basic(VBA)
-
16
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
17
Excelの入力規則で2列表示したい
Excel(エクセル)
-
18
Excel マクロ VBA プロシージャが大きすぎます のエラー対処方法
Visual Basic(VBA)
-
19
VBAコード記述に際して、コード全体を自動的にインデント付ける方法
Access(アクセス)
-
20
Accessの画面更新を一時的に停止する方法。
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSでIEを起動し、拡大率を変更...
-
エクセルVBA 宣言Dimの場所
-
TCPサーバ bind関数のエラーに...
-
vbscriptの変数宣言
-
EXCEL VBA API宣言でコンパイル...
-
CreateObjectの同時実行時について
-
ネットワーク上のPCのIPとホス...
-
C# try-catch でcatchに飛ばす方法
-
「Scripting.FileSystemObject...
-
ASP.net の OnClientClick
-
Response.Redirectで引数2つの...
-
ADSIについて
-
オープンオフィスでのトラブル
-
Sendmail、エラーメールの制御(...
-
winsock通信時エラーの回避
-
EXECLマクロでshapeがグルーフ...
-
FileCopy時のエラー
-
社内LANでASPをうごかすには
-
500エラーになりHPが表示されな...
-
CAsyncSocket::Create()がエラ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 宣言Dimの場所
-
ソケット通信で同時受信の制限?
-
TCPサーバ bind関数のエラーに...
-
VBSでIEを起動し、拡大率を変更...
-
名前が二重に定義されています
-
VBSにてサーバー中のエクセルフ...
-
vbscriptの変数宣言
-
式はメソッドではありませんと...
-
CreateObjectの同時実行時について
-
golang 空文字判定について
-
1つの作業の制限時間を増やしたい
-
EXCEL VBA API宣言でコンパイル...
-
ACCESSのAutoKeysマクロでアク...
-
VBSについて
-
標準モジュールPublic宣言変数...
-
ASPでAccessのデータを更新、削除
-
ネットワーク上のPCのIPとホス...
-
C# try-catch でcatchに飛ばす方法
-
GridView表示の高速化
-
CreateObject("Excel.Applicati...
おすすめ情報