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