
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
6
IF関数で空欄(")の時、Nullにしたい
その他(Microsoft Office)
-
7
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
8
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
9
VBA シートをコピーする際に Copyメソッドは失敗しましたのエラーが出てしまいます
Visual Basic(VBA)
-
10
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
11
エクセルのデータグループ化の際に貼り付けた図だけ一緒に折りたたんでくれません!
Windows Vista・XP
-
12
Excelマクロで、稼働中のマクロを確認する方法
その他(Microsoft Office)
-
13
ExcelのVBAでGoToの代わりに…
Excel(エクセル)
-
14
テキストボックスのvalueとtextの違い
Visual Basic(VBA)
-
15
private subモジュールを他のモジュールから呼び出して使う方法を教えてください(-.-)
Visual Basic(VBA)
-
16
【Excel VBA】CSV取込時、数字の先頭の0を消えないようにするには?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA セルの値がおかしいです
-
VBA セル間のリンク修正につい...
-
WindowsのOutlook を VBA から...
-
【ExcelVBA】値を変更しながら...
-
ExcelのVBAコードについて教え...
-
VBAでCOPYを繰り返すと、処理が...
-
マクロの記録を使用したマクロ...
-
vba textboxへの入力について教...
-
複数のExcelファイルをマージす...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
Excelのマクロについて教えてく...
-
Vba WorkBooks.Openについて教...
-
VBAから書き込んだ条件付き初期...
-
Vba 型が一致しません(エラー1...
-
【ExcelVBA】5万行以上のデー...
-
[Excel VBA]特定の条件で文字を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 宣言Dimの場所
-
ソケット通信で同時受信の制限?
-
式はメソッドではありませんと...
-
TCPサーバ bind関数のエラーに...
-
EXCEL VBA API宣言でコンパイル...
-
SumIFsとDateSerial vba
-
名前が二重に定義されています
-
VBSでIEを起動し、拡大率を変更...
-
CreateObjectの同時実行時について
-
golang 空文字判定について
-
vbscriptの変数宣言
-
ダブルクォーテーションの吐き出し
-
メール一括送信VBAへのアドレス...
-
VBSについて
-
VBSにてサーバー中のエクセルフ...
-
ネットワーク上のPCのIPとホス...
-
C# try-catch でcatchに飛ばす方法
-
画面のリフレッシュを意図的に...
-
CreateObject("Excel.Applicati...
-
ASP内で他のASPファイルを読み...
おすすめ情報