• ベストアンサー

どちらを使った方がいいでしょうか?

Sub test1() Dim ws As Worksheet For Each ws In Worksheets Debug.Print ws.Name Next End Sub Sub test2() Dim ws As Variant For Each ws In Worksheets Debug.Print ws.Name Next End Sub どちらも問題なく実行されますが、 VBA的にどちらを使った方がいいでしょうか?

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

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

こんにちは。 メソッド「test1」をご使用されることを強くオススメ致します。その理由は以下です。 (1)Variant型だとレスポンスが悪くなる。 (2)Variant型だとメモリを無駄に使用する。 (3)Variant型は予期せぬエラーの温床になる。 (3)Variant型で記述されたソースは変数内部に格納しているデータを特定しずらいため、ソースの修正や変更など保守作業の効率が悪くなる。又、予期せぬエラーを防ぐため、テスト件数が必然的に増え、その分開発効率が悪くなる。 以下のサイトで、Variant型を使用した場合と使用しなかった場合のレスポンス測定結果が紹介されています。 http://officetanaka.net/excel/vba/speed/s6.htm

nhbghnbg333
質問者

お礼

Variantを使うのはいいことがなにもなさそうですね。ありがとうございました。

その他の回答 (2)

回答No.2

一般論ですが、 VBでは、Variant型は極力使用しません。 ご質問の文では、型が判明していますので、test1を使用するべきです。 Variant型を使用するのは、プログラムの途中でいろいろな型の値が 設定され、特定の型を使用できない場合などです。 よろしくお願いします。

nhbghnbg333
質問者

お礼

Variant型はなるべく使わないようにします。 ありがとうございました。

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.1

素人です。 worksheetの方が、使うメモリ?が少なそうです。 その分、速いのかなと勝手に思っています。 エラーも分かりやすくなるし。

nhbghnbg333
質問者

お礼

worksheetを使った方がいいですね。 ありがとうございました。

関連するQ&A

  • 一回のループで次のオブジェクトの値も同時に取得する

    一回のループで次のオブジェクトの値も同時に取得するにはどのようなコードを書けばよいですか? 例えば、 ブックにシートが Sheet1 Sheet2 Sheet3 あり、 Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub のように、全てのシート名を取得する場合、 Sheet1とSheet2を1回のループで同時に取得する方法はありますか? Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name   Debug.Print s+1.Name Next End Sub みたいな方法があるのか知りたいです。 よろしくお願いします。

  • Worksheet Worksheets オブジェ

    「Worksheetオブジェクト」と「Worksheetsオブジェクト」は何が違うのでしょうか? 使い方もいまいちわかりません。 この二つを使う時は、 Sub test1() Dim w As Worksheet For Each w In Worksheets Debug.Print w.Name Next End Sub とするときなのですが、 なぜ、変数の宣言をする時は、Worksheetを使い、 ワークシートの数を数える時は、Worksheetsを使うのでしょうか?

  • 変数が増えてしまうのはなぜだか教えてください。

    こんにちは、マクロ初心者ではないつもりですが、基本ができていないのか、以下のSubで、変数の値が増えてしまいます。i = 3のままだと思っていたのですが、シートが移動するにつれてiの値が増えてしまうのは何故でしょうか。教えてください。 Sub tes() Dim i As Integer Dim ws As Worksheet i = 3 Debug.Print i For Each ws In Worksheets ws.Select For i = 1 To i Debug.Print i Cells(i, i) = i Next Next End Sub 新規のブックに書きました。Sheetは1~3です。

  • ブック内のシート名を右から取得したい

    Sub Sample() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub このコードを実行すると、左からシート名をひとつずつ取得しますが 右から取得して書き出すにはどうすればいいでしょうか?

  • シート名をループに

    質問を簡単にする為に以下のマクロがあるとします。 シート名が1~31とあるのですが、これをfor loopで 使うにはinteger等の定義が違うのでしょうか。 Sub bbb() Dim ws As Worksheet Dim 曜日 As String Dim i As Integer For Each ws In Worksheets For i = 1 To 31 If ws.Name = i Then  <----------ここでエラー  (コマンド) End If Next i Next End Sub

  • 右からループするにはどうすればいいですか?

    Sub test() For Each s In Worksheets Debug.Print s.Name Next End Sub これでシート名を取得する際は左から取得されますが 右からループするにはどうすればいいですか?

  • 「.Name」がエラーになる理由は?

    Sub 全てのシート名を取得する() Dim w As Worksheet Dim 行 As Long 行 = 1 For Each w In Worksheets Debug.Print w.Name 行 = 行 + 1 Next End Sub Sub 全てのブック名を取得する() Dim wb As Workbooks Dim 行 As Long 行 = 1 For Each wb In Workbooks Debug.Print wb.Name 行 = 行 + 1 Next End Sub 標準モジュールに ふたつのプロシージャーを作ったのですが 「全てのシート名を取得する」は問題なく動作しますが 「全てのブック名を取得する」は「.Name」の部分が 「コンパイルエラー メソッドまたはデータ メンバが見つかりません。」 (Error 461) になってしまいます。 なぜでしょうか? 全てのブック名を取得することはできないのですか?

  • エクセルVBA シート名の部分一致検索について エクセル2007

    VBAでエクセルの全シート名を部分一致で検索したいと考えています。 そこで以下のコードを書いたのですが、 インプットボックスにどんな文字列を入力しても全てのシート名を 取得してしまって途方にくれています。 どなたかお助けください。 Sub test01() Dim name As String Dim ws As Worksheet shn = InputBox("検索文字列を入力") For Each ws In ThisWorkbook.Worksheets If ws.Name Like " * " & name & " * " Then ws.Activate MsgBox ws.Name End If Next ws End Sub

  • VBAですべてのワークシートを処理したい

    ブック内の全ワークシートに対して同じ処理をするために、 For each ワークシート in Worksheets ~処理~ Next ワークシート を使ってみたのですが、その時にアクティブになっているシートしか処理されません。たとえば次のようなシンプルなコードでも、同様です。何が抜けているのでしょうか。 Sub allworksheets() Dim WS As Worksheet For Each WS In Worksheets Range("a1") = "123" Next WS End Sub マクロの勉強を始めたばかりで、基本的なことでつまづいてます。よろしくお願い致します。

  • Word VBA

    ※行頭の下線はプログラムに関係ありません、インデントと解釈ください。 Excel VBAで既に開いているワークブックの一覧取得は Sub test() __Dim wb As Workbook __For Each wb In Workbooks ____Debug.Print wb.Name __Next wb End Sub で成功したのですが、 Word VBAで Sub test() __Dim wb As Object __For Each wb In CreateObject("Excel.Application").Workbooks ____Debug.Print wb.Name __Next wb End Sub では何も表示されません。 問題解決のための知識を与えてくださる方、宜しくお願いします。

専門家に質問してみよう