[VBA] 型宣言の順番について

このQ&Aのポイント
  • VBAの初級者が宣言文を書く際、型宣言の順番について相談です。
  • 現在はプロシージャの一番上に全ての宣言文を書いており、大きい型のものから順番に書いています。
  • 他のソースコードを見ると、変数を使う直前で都度宣言することもあるため、正しい宣言の方法について教えていただきたいです。
回答を見る
  • ベストアンサー

[VBA] 型宣言の順番について

こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) 私はVBAのレベルとしては初級で、具体的には配列内で処理をしたり、連想配列のコードが書けるぐらいで、クラスモジュールはわかりません、ぐらいの感じです。(分かりづらくてすみません) 私はいつも宣言の文を書くときに、プロシージャの一番上に全て書き、順番もだいたい大きい(と感じる)型のものから書いています。 例: Sub test()  Dim FSO As Object  Dim oDic As Object  Dim wbSour As Workbook, wbDest As Workbook  Dim wsSour As Worksheet, wsDest As Worksheet  Dim r as Range  Dim tmp As Variant  Dim destDir As String  Dim i As Long, j As Long, k As Long  ~  ~  ~  ~  ~  ~ End Sub みたいな感じです。 いつもこれでいいのかなぁ?と思いながら宣言文を書いてるんですが、ネットに転がっている他のソースコードを見ると、変数を使う直前で都度宣言しているものもあったりするので、正しい(とされている)宣言のしかたってあるのでしょうか? そんなの人と場合によるって感じだと思うのですが、こういう理由で自分はこう宣言している、とか、これからのことを考えるとこうしたほうがいい、みたいなのがあれば教えてください。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>変数数を使う直前で都度宣言している C++やJavaをメインで使っている人の場合、その方がコードを書きやすく解りやすいようです。 >こういう理由で自分はこう宣言している 私の場合、VBAのヘルプに「プロシージャ内で Dim ステートメントを使用する場合は、通常、Dim ステートメントをプロシージャの最初で記述します。」とあるので、SubやFunctiionの後に纏めて書く様にしています。 ぶっちゃけ正しく動くならばどうでもいい話ですが。

rihitomo
質問者

お礼

ありがとうございます。 とても参考になりました。

その他の回答 (2)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

お気持ちは、すごく分かりますが、意味はないと思います。 私も、キッチリ順番を決めたい気持ちはすごくありますので、お気持ちは分かるのですが、自己満足の世界でしかないかと思います。 その変数を使う前であれば、いつ宣言しても、プログラム上、何の意味もないからです。 しかし、明確な順番みたいなのがあると、気分的に安心できるのは確かですが・・・ 私は、とりあえず、大きな意味のあるもの、と自分で思ったものからにしています。

rihitomo
質問者

お礼

ありがとうございます。 とても参考になりました。

回答No.1

Sub test() Dim FSO As Object Dim oDic As Object Dim wbSour As Workbook, wbDest As Workbook Dim wsSour As Worksheet, wsDest As Worksheet Dim r as Range Dim tmp As Variant Dim destDir As String Dim i As Long, j As Long, k As Long ・・・・・ End Sub ↓ Sub test() Dim I As Long         ' XXXXXXXXXXXXXXX Dim J As Long         ' XXXXXXXXXXXXXXX Dim K As Long         ' XXXXXXXXXXXXXXX Dim varTmp As Variant    ' XXXXXXXXXXXXXXX Dim strDir As String     ' XXXXXXXXXXXXXXX Dim objFSO As Object    ' XXXXXXXXXXXXXXX Dim objDic As Object     ' XXXXXXXXXXXXXXX Dim wbkSour As Workbook ' XXXXXXXXXXXXXXX Dim wbkDest As Workbook ' XXXXXXXXXXXXXXX Dim wstSour As Worksheet  ' XXXXXXXXXXXXXXX Dim wstDest As Worksheet  ' XXXXXXXXXXXXXXX Dim rngXXXX as Range    ' XXXXXXXXXXXXXXX ・・・・・ End Sub 私であれば・・・。

rihitomo
質問者

お礼

ありがとうございます。 とても参考になりました。

関連するQ&A

  • 【VB.NET】事後バインディングにおける引数の宣言方法

    【VB.NET】事後バインディングにおける引数の宣言方法  今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  開発環境:VB2008+XP になります。  Excel操作コードの部分を事後バインディングにすべく 勉強いたしております。  たとえば   「事前バインディング」     Dim myApp As New Excel.Application     Dim myBook As Excel.Workbook     Dim myBooks As Excel.Workbooks = myApp.Workbooks     Dim xlSheet As Excel.Worksheet     Dim xlSheets As Excel.Sheets       ↓   「事後バインディング」     Dim myApp As Object     Dim myBook As Object     Dim myBooks As Object     Dim xlSheet As Object     Dim xlSheets As Object     myApp = CreateObject("Excel.Application")     myBook = myApp.WorkBook     myBooks = myApp.WorkBooks     xlSheet = myApp.Worksheet     xlSheets = myApp.Sheets のようにするのだと思うのでございますが、  Sub Excel2(ByRef myRng As Excel.Range, ・・・・)                  ↑ここはどうやって宣言すべき                    なのでございましょうか???  「Sub Excel2」内ではmyAppが宣言されておりませんゆえ myApp.Rangeなどといたしますと「宣言されていません」とエラーが 出てしまうと思うのでございますが。。。。       もしお詳しい方がいらっしゃいましたら、是非ともアドバイスいただきたく お願い申し上げます。

  • Objectで宣言するのとObject型で宣言する

    Objectで宣言するのとObject型で宣言するのではどちらがいいでしょうか? エクセルです。 VBAでコードを作るにおいて、どちらのほうがいいのでしょうか? どちらも同じ動きをします。 Sub Sample1() Dim buf As Range Set buf = Range("A1") MsgBox buf.Value End Sub Sub Sample2() Dim buf As Object Set buf = Range("A1") MsgBox buf.Value End Sub ご回答よろしくお願いします。

  • VBAの変数の宣言で型が複数あるのは?

    Dim ws As Worksheet, i& このような内容の宣言をみたのですが、 i&はどんな意味があるのでしょうか? &はlong型を意味する事までは調べがついたのですが、i&の意味が分かりませんでした。 回答よろしくお願いします。

  • Excel2016 VBA

    Windows10 ,Excel2016 バージョン1809 , VBA7.1を使用しています。 下記のコード(ホームページに掲載されているコードを写して実行しようとした。)で、 Attributeの箇所に、 コンパイルエラーと構文エラーが出ます。 Module1をaaaにしたり、Attributesと書き換えたりしてもエラーが消えません。 どなたか正常にコンパイルする書き方を教えてください。 お願いします。 Attribute VB_Name = "Module1" '************************************ 'ラベル発行のサンプル '************************************ Option Explicit ' 各項目の配置定義用ユーザー定義 Private Type typLocation X As Long Y As Long COL As Long End Type Private Const cnsSH1 = "DATA" Private Const cnsSH2 = "LABEL" Private Const cnsSH1 = "設定" Private Const cnsOMIT = "除外" '******************************************************************************* ' ラベル発行 '******************************************************************************* Sub PrintLabels() Dim xlApp As Application Dim WBK As Workbook '本ブック Dim SH1 As Worksheet 'DATA Dim SH2 As Worksheet 'LABEL Dim SH3 As Worksheet '設定 Dim tblLoc(1 To 10) As typLocation '項目配置定義(ユーザー定義を配列化) End Sub

  • エクセル VBA 変数を一括で宣言したい

    こんにちは。VBAプログラム初心者です。 変数を宣言する際、 dim オーダ番号 as long, オーダ番号2 as long, …オーダ番号100 as long という内容を一括で宣言することは可能でしょうか? イメージ的には下のような感じなのですが。。。 dim i as integer for i = 1 to 100 dim オーダ番号i as long dim 単価i as long next マクロで便利にするつもりが余計面倒になっていて困っております。 解決策を教えていただけましたら幸いです。 何卒よろしくお願いいたします。

  • Excel VBA配列をFunctionに渡す

    こんばんは、引数について教えてください。 Excel VBAの関数を作っていましたが、 1.Function ColumnArrayの部分でコンパイルエラーが発生し、  「配列がありません」と表示されます。  引数を配列のみで渡した場合、問題なく渡せるようですが、  他の引数と、CriteriaArrsの配列と一緒に渡せないのでしょうか。  すべて配列として1つにまとめて渡さなければならないのでしょうか。 2.CriteriaArrs = Array("田中", "鈴木")の部分は、文字列の増減が発生しますので  配列はParamArray  CriteriaArrs()とした方がよいのでしょうか 説明が不足している点があるかもしれませんが宜しくお願いいたします。 Function ColumnArray(SheetName As Worksheet, _ StartCell As Range, _ FieldColumn As Long, _ CountColumn As Long, _ CriteriaArrs As Variant _ ) As Long ・・・ End Function ------------------------------------- sub test() Dim CriteriaArrs() As Variant Dim SheetA As WorkSheet DIm RangeA range CriteriaArrs = Array("田中", "鈴木") set SheetA =Worksheet(1) set RangeA=Range("B3") FilterCount = ColumnArray(SheetA, RangeA, 3, 2, CriteriaArrs) end sub

  • なぜ、ByVal Sh As Objectは

    NewSheetイベントについて質問なのですが、 なぜ、ByVal Sh As Objectは、Objectなのでしょうか? Sub Workbook_NewSheet(ByVal Sh As Worksheets) や Sub Workbook_NewSheet(ByVal Sh As Worksheet) にしたら、コンパイルエラーになります。 シートの方では、 Private Sub Worksheet_Change(ByVal Target As Range) のようにrange型で宣言しているのに、なぜシートはオブジェクト型で宣言するのでしょうか?

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

  • vbaの 変数の宣言 記号は使えない?

    vbaの 変数の宣言 記号は使えない? Sub test1() dim st @ End Sub みたいに変数の型を As String ではなく記号で表現ってできないんでしたっけ? エラーになってしまいます。

  • Excel VBA での動的配列の宣言の仕方

    Excel VBA で動的配列を宣言したところ,上手く行きません。何が悪いのでしょうか? Dim A() As Integer MsgBox LBound(A()) として実行すると,LBound(A())のインデックスが有効範囲にありませんというエラーが出ます いったい何が悪いのでしょうか?動的配列の定義に失敗しているものと思いますが,動的配列の宣言の仕方をお教えください。よろしくお願いします。

専門家に質問してみよう