|    | 
     ▼うろ さん: 
>内容が難しくて分かったような分からないような。。。 
> 
>自分の中で.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であろうと、問題なく動きます。 
 
 | 
     
    
   |