| 
    
     |  | ▼うろ さん: >内容が難しくて分かったような分からないような。。。
 >
 >自分の中で.selectのように、0を選び得ないような
 >構文ではテーブルを1以上で最初に設定しといたほうが
 >エラーが出にくいんだろうな・・・と
 
 ちょっと勘違いがあるようなので、レスしときます。
 
 > 問題はar()の変数がEmpty値になっていることだと思うのですが
 そういうことだと思います。
 >    n = Worksheets.Count
 >    ReDim ar(n - 4)
 >    For i = 5 To n
 >      ar(j) = i
 >       j = j + 1
 >    Next i
 なぜこの配列の宣言が適切でないのか?
 説明のため、たとえば、実際のワークシートの枚数 が
 6 だったとしましよう。
 n = 6 だとします。
 すると、
 >    ReDim ar(n - 4)
 は、具体的には ReDim ar(2) と宣言したことになります。
 ReDim ar(2) は ReDim ar (0 to 2) という3つの要素を宣言して
 いることになります。(Option Base 1 は使っていないものとして)
 ここに、あなたのプログラムは
 >    For i = 5 To n
 >      ar(j) = i
 >      j = j + 1
 >    Next i
 5〜6まで iをループさせ、Indexを要素に当てはめてます。
 しかし,ReDim ar (0 to 2)で「3つの要素を宣言」したのに、
 実際の代入は 最初の要素番号0 と2番目の要素番号1への代入
 しかおこなわれていません。
 要素番号→ 0   1   2
 要素内容→ [5]  [6]  [ ]
 したがって
 ar() 配列は 未定義の要素を孕んでいますから、
 > Worksheets(ar()).Select
 がエラーになるのです。
 Option Baseを 1 にするとかじゃなくて、
 必要な要素数をもった配列を Redim すればいいのです。
 たとえば、以下は 最初にご提示のコードの
 > ReDim ar(n - 4)
 を
 ReDim ar(n - 5)
 としているだけですが、エラーにならず5枚目以降のシート
 をまとめて Previewできると思います。
 
 Sub test_mod()
 Dim i As Integer
 Dim j As Integer
 Dim n As Integer
 Dim ar() As Variant
 n = Worksheets.Count
 If n <= 4 Then
 MsgBox "印刷できるシートがありません"
 Exit Sub
 End If
 ReDim ar(n - 5) '4ではなく5 に変更
 For i = 5 To n
 ar(j) = i
 j = j + 1
 Next i
 
 Worksheets(ar()).Select
 
 ActiveWindow.SelectedSheets.PrintPreview
 
 End Sub
 
 nが6のとき、5と6番目のシートを配列に入れればいいのですから、
 上のように
 Redim ar(0 to 1) と宣言すれば、 ar(0)= 5 : ar(1) = 6
 Redim ar(1 to 2) と宣言すれば、 ar(1)= 5 : ar(2) = 6
 Redim ar(5 to 6) と宣言すれば、 ar(5)= 5 : ar(6) = 6
 てな具合で、
 必要十分な要素数を宣言し、それぞれをIndexで埋めれば
 始まりの要素番号が0であろうと、1であろうと、はたまた
 5であろうと、問題なく動きます。
 
 
 |  |