質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • VBA

    1798questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

見やすい 変数の 宣言位置

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 430

kamikazelight

score 48

 変数の宣言は最初でなくてもいいのでしょうか

最近コードの再利用などを考えるようになってから
多少の実行速度の差 等よりも見やすさを重視しているのですが、
変数の宣言位置に疑問を抱くようになりました。

その中で不要になったコードを消した際にそこで使われていた
変数が宣言されたまま取り残されていることが多々あることに気づきました。

その対策として変数を使う場所で宣言した方が管理がしやすいのではないかと
思うようになり一度試しに過去の質問で出してみたところ
「→VBでの文化はちょっと分からないんですがJavaなどでは変数の宣言は使う前がいいと言われてますね。」と言われたので
やめました。

でも実際のところ変数の宣言を途中で行ったとしてもバグの原因にはそんなにならないですよね?
極端な話

Sub tset()
    Dim i As Integer
    For i = 1 To 10
        Dim j As Integer
        j = j + 1
        Debug.Print j
    Next i
End Sub


こんなことをしてもエラーにならず ちゃんとJの値も保持されますし...

でも、文化として定着しているからにはそれなりの理由があるのではないかという
考えが頭をよぎり 
変えたほうが見やすい or 変えない方がいい の葛藤で毎度の様に手が止まります...

皆さまはどう考えますか?
教えて頂きたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+5

人によって変わると思いますが、私は「変数を使う場所で宣言」派です。

理由の一つは、質問内でも言及されている

不要になったコードを消した際にそこで使われていた
変数が宣言されたまま取り残されていることが多々あることに気づきました。

というコードを見ることが多く、それを反面教師としたためです。

それ以外の理由としては

  • 変数の有効範囲を狭めるため(コードを読むとき考慮すべき事項を減らす)
  • 処理の一部をプロシージャに分離するときに、コピーする範囲が少なくて済む

などがあります。

「最初で宣言する」派の意見の一つとして、
「まとめて宣言しておいた方が、どんな変数か確認しやすい」というものもありますが、
Ctrl + IShift + F2といったショートカットキーを使えば簡単に確認出来るため、理由としては弱いと考えています。

ただ、「一画面に容易に収まる程度の短いプロシージャ」であれば最初でまとめて宣言した方が見やすく感じることもあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/26 09:41

    他の方も先頭行で宣言して 不要になった変数の宣言の消し忘れがあるのですね
    >ただ、「一画面に容易に収まる程度の短いプロシージャ」であれば最初でまとめて宣言した方が見やすく感>じることもあります。
    これは悩みどこですが一画面に入るときは先頭行で宣言そうでないときは使う直前とすると
    線引きが曖昧になると思うのですが先頭行で宣言しているプロシージャとそうでないものが混在していてもいいのでしょうか?
    同じモジュール内くらいは統一した方がいいでしょうか?

    キャンセル

  • 2018/07/26 20:26

    実際の所、私が書く場合は使う直前で統一しています。

    書き方が上手ければ(十分な部品化が出来ていれば)、どちらの書き方でも大差は無い、という例と捉えていただければ。

    キャンセル

  • 2018/07/27 11:38

    やはり、統一はしたほうが良いのですね。
    ありがとうございました。

    キャンセル

+3

私も先頭ではなく使用する直前がベストだと思います。

「→VBでの文化はちょっと分からないんですがJavaなどでは変数の宣言は使う前がいいと言われてますね。」と言われたのでやめました。 

この部分で該当の過去の質問のベストアンサーを見てみましたが、kamikazelightさんが言ってる「変数を使う場所で宣言」と、unz.horiさんが言ってる「使う前」は、どちらも「使用する直前」を指しているように思えます。やめてしまったのは勘違いだったのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/26 09:08 編集

    勘違いしていたみたいですね^^;
    たぶん別の方に頂いた例題が先頭宣言だったのでごっちゃになってしまったのでしょう...
    ありがとうございました。

    キャンセル

+2

昔のコンパイラや言語では変数宣言を先頭で行う必要があった、というのが今も残っている……というのが正直なところでしょう。

個人的には「初期値を決定する時点で宣言する」ですね。
特殊な理由で初期値を設定できない場合(まずありませんが)は先頭に持っていきますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/26 09:32

    文化として定着しているからにはそれなりの理由があるからと警戒していたのですが
    先頭で宣言するのは 名残 なんですね
    ありがとうございました。

    キャンセル

+2

下記のリンク先では、変数を使用する直前で宣言した場合のメリットを実例を含めて分かり安く解説しています。
私自身、今まで習慣的に最初で宣言していましたが、これを読んで、直前宣言派に転向しました。

VBA ローカル変数は使用する直前で宣言する - t-hom’s diary

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/26 09:11

    分かりやすいサイトでした。
    紹介してくださりありがとうございました。

    キャンセル

+1

制約あるいはコーディングルールがない限りは、使う直前に宣言したほうがわかりやすいでしょう。特に、JavaScriptでconstな変数を、ほかの値から生成するような場合、値が揃ったより後に宣言文を書くしか方法がありません。

【制限の例】

  • C言語では、C99以前には関数の先頭、あるいはブロックの先頭でしか変数宣言が認められていませんでした。
  • JavaScriptのvarは「巻き上げ」と言って宣言より上でもアクセスできてしまうので、先頭に書くほうが、変数の有効範囲と一致するようになるので逆にわかりやすくなります。

また、Rubyでは変数に明示的な宣言をする構文がなく、はじめての代入が宣言になるので、「先に宣言だけ」することがそもそもできません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/26 09:28

    JavaScript は 宣言より上でもアクセスできてしまう のですね 初めて知りました。
    JavaScriptでconstな変数を、ほかの値から生成 できるんですね
    VBAだと

    Sub tset()

    Dim A As Long
    Dim B As Long
    A = 1
    B = 2

    Const C As Long = A + B

    Debug.Print C

    End Sub
    と書くと「定数式が必要です。」っと出てしまい
    Const の値には変数が使えないっぽいですね
    主に Const は読みやすくするために使う時と 税などの今後変わる可能性の値を入れるために
    使うことがあると思うのですが 後者の場合は 書き換えやすいように行頭に置いた方がいいのでしょうか
    それともこれも使う直前の方がいいのでしょうか...?

    キャンセル

  • 2018/07/26 09:40

    JavaScriptのconstとVBAのConstではかなり性格が違いますね。

    消費税率のような、システム全体で一元管理すべき定数であればグローバル、あるいは何かのオブジェクト内に宣言するのが適当かと思います。

    キャンセル

  • 2018/07/26 09:54

    それもそうですね... すみませんでした。
    ではとある表から抜粋した情報を別表に書き出す処理があり
    抜き出す 列数 をConst で宣言していた.... っとします。
    この場合はどうでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    VBA高速化について

    20個のエクセルファイルを読み込み、特定のシートにあるテーブルから特定の値を探し出し、その右横にあるセルの値を取り出します。 集計用のエクセルのテーブルでも、同じ特定の値をテーブル

  • 解決済

    powerpointでタイトル(文字列+連続変数)をVBAで一括変換

    パワーポイントで、タイトルの位置に テキスト+数字 の形でFor文を使って作りたいです。 例)こんにちは1(スライド1枚目) こんにちは2(スライド2枚目) ...といった形です。

  • 解決済

    VBA ユーザーフォーム内でコマンドボタン等を移動させる方法

    PowerPointのVBAでユーザーフォームを作成しています。 そこで以下のようなプログラムを作成しています。 ①フォーム内のコマンドボタンをクリックすると新たなコマンドボタンを

  • 解決済

    VBA sheetのセレクト情報をリセットしたいです。

    VBAのプログラム内で、RangeやCellsを指定して.selectをしている箇所が複数あるのですが、 処理が一通り走った後、参照先のsheetを見ると、プログラム内部でSele

  • 解決済

    VBA Dictionary 取り出し方にて質問

    VBAにて下記実装を行いました。 Dim dictionary As Variant Set dictionary = CreateObject("Scripting.Dict

  • 解決済

    VBAでオブジェクト型の変数をモジュールレベルでコンストラクタするには?

    失礼いたします 帳簿処理用のユーザーフォームいくつかを作っています。 それぞれのフォームの構造が似ているので、イベント時の動作が変わらないコントロールに関してはコントロール名を

  • 解決済

    VBA 条件分岐 while文?

     VBAで背景色をつけたい。エクセルの範囲を指定せずに、複数の条件分岐を実現したい ここに質問の内容を詳しく書いてください。 かなり長文になると思いますが、色々試した結果、手詰まり

  • 解決済

    コンボボックスのリストの動的配列

     前提・実現したいこと ユーザーフォームのコンボボックスのリスト用の一覧があります。 A列が市町村、B列がそのグループです。 シート名は「一覧」です。 グループは、市町村がそのまま

同じタグがついた質問を見る

  • VBA

    1798questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。