Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1791 / 13645 ツリー ←次へ | 前へ→

【71900】目的のシート以外をプレビュー表示したい うろ 12/4/23(月) 18:56 質問[未読]
【71902】Re:目的のシート以外をプレビュー表示したい ちん 12/4/23(月) 21:35 発言[未読]
【71903】Re:目的のシート以外をプレビュー表示したい kanabun 12/4/23(月) 23:51 発言[未読]
【71904】Re:目的のシート以外をプレビュー表示したい kanabun 12/4/23(月) 23:55 発言[未読]
【71905】Re:目的のシート以外をプレビュー表示したい うろ 12/4/24(火) 11:22 お礼[未読]
【71906】Re:目的のシート以外をプレビュー表示したい ちん 12/4/24(火) 12:22 発言[未読]
【71907】Re:目的のシート以外をプレビュー表示したい うろ 12/4/24(火) 14:03 お礼[未読]
【71908】Re:目的のシート以外をプレビュー表示したい kanabun 12/4/24(火) 15:32 発言[未読]
【71909】Re:目的のシート以外をプレビュー表示したい うろ 12/4/24(火) 17:19 お礼[未読]

【71900】目的のシート以外をプレビュー表示したい
質問  うろ  - 12/4/23(月) 18:56 -

引用なし
パスワード
   いつも参考にさせていただいてます。

sheet1〜4以外の全てのsheetの印刷プレビューを表示するマクロです。

下記のマクロで、"インデックスが有効範囲にありません"とのエラーが出ます。
エラーは"Worksheets(ar()).Select"の部分です。

sheet1〜3だったときは問題なく動いてくれていたのですが、
一つ増やしたらエラーが出るようになりました。

問題はar()の変数がEmpty値になっていることだと思うのですが、
どう訂正すればいいのか、わからなくて困っています。

何卒、お力をお貸しください。
よろしくお願い致します。

使用しているのはExcel2007です。

Sub test

Dim i As Integer
  Dim j As Integer
  Dim n As Integer
  Dim ar() As Variant
    n = Worksheets.Count
    If n = 4 Then
    MsgBox "印刷できるシートがありません"
    GoTo Wayout
    End If 'シートひとつしかない場合
  ReDim ar(n - 4)
    For i = 5 To n
    ar(j) = i
     j = j + 1
  Next i
 
 Worksheets(ar()).Select

ActiveWindow.SelectedSheets.PrintPreview

Wayout:
End Sub

【71902】Re:目的のシート以外をプレビュー表示し...
発言  ちん  - 12/4/23(月) 21:35 -

引用なし
パスワード
   ▼うろ さん:こんばんわ ちんといいます。

うろさんのソースで試しましたが、エラーになります。
対策として、テーブルを1からはじめるようにするとエラーは回避できます。

Option Base 1  '*** テーブルを1からはじめる
Sub test()

Dim i As Integer
  Dim j As Integer
  Dim n As Integer
  Dim ar() As Variant
    n = Worksheets.Count
    If n = 4 Then
    MsgBox "印刷できるシートがありません"
    GoTo Wayout
    End If 'シートひとつしかない場合
    j = 1  '*** jを1からはじめる
  ReDim ar(n - 4)
    For i = 5 To n
    ar(j) = i
     j = j + 1
  Next i

  
  'シート名を格納した配列変数を指定してSelect
  Worksheets(ar).Select

'' Worksheets(ar()).Select

ActiveWindow.SelectedSheets.PrintPreview

Wayout:
End Sub

以上、参考までに・・・

【71903】Re:目的のシート以外をプレビュー表示し...
発言  kanabun  - 12/4/23(月) 23:51 -

引用なし
パスワード
   ▼うろ さん:
>下記のマクロで、"インデックスが有効範囲にありません"とのエラーが出ます。
>エラーは"Worksheets(ar()).Select"の部分です。
>問題はar()の変数がEmpty値になっていることだと思うのですが、

以下のようにしてもいいと思いますよ
ポイントは n がシート総数 のとき、5,6,7...n を配列 ar() に入れる
訳ですが、インデックス番号を Redim ar(5 to n) と
5から n までというインデックスにしていることです。

Sub test3()
 Dim i As Integer
 Dim n As Integer
 Dim ar() As Variant
  n = Worksheets.Count
  If n > 4 Then
    ReDim ar(5 To n)
    For i = 5 To n
      ar(i) = i
    Next
   
    Worksheets(ar).Select
    ActiveWindow.SelectedSheets.PrintPreview
  Else
    MsgBox "印刷できるシートがありません", vbCritical
  End If
End Sub

【71904】Re:目的のシート以外をプレビュー表示し...
発言  kanabun  - 12/4/23(月) 23:55 -

引用なし
パスワード
   ▼うろ さん:

>    Worksheets(ar).Select
>    ActiveWindow.SelectedSheets.PrintPreview

の2行は
    Worksheets(ar).PrintPreview

でよかったですね。

【71905】Re:目的のシート以外をプレビュー表示し...
お礼  うろ  - 12/4/24(火) 11:22 -

引用なし
パスワード
   >ちん さん
>kanabun さん

早速のご返答ありがとうございます。

どちらも試してみましたが、どちらでもうまくいきました。
本当に有難うございます。

>ちん さん
もしよろしければ向学の為に教えていただきたいのですが、
なぜ、変数を<1>から始めることでエラーが回避できるようになるのか
教えて頂けないでしょうか?

>kanabun さん
変数の範囲を指定するのは、大変参考になりました。
今まで、あんまり意識してませんでしたので、
今後に生かしていきたいと思います。

【71906】Re:目的のシート以外をプレビュー表示し...
発言  ちん E-MAIL  - 12/4/24(火) 12:22 -

引用なし
パスワード
   ▼うろ さん、こんにちは、ちんといいます。
OPTION BASE 1は、昔々からあるBasic言語/COBOL言語(30年前かな?)の中での命令なので、記憶は定かでないですが・・・

OPTION BASE 0(デフォルト)なので、テーブルを定義(宣言)すると
DIM TBL(10) as String と、TBL(0)〜TBL(9) までのエリアが定義されます。

OPTION BASE 1 と、テーブルを定義(宣言)すると
DIM TBL(10) as String と、TBL(1)〜TBL(10) までのエリアが定義されます。

テーブルへのセットを0で始めるか、1ではじめるか の違いです。

COBOL言語の場合も、テーブルの始まりは1からだったような?記憶が定かでないです。

仕様書など、Opeion Base 0/1 かを必ず記述します。(複数人で開発)
私の場合は、必ずOpeion Base 1でした。

たくさんプログラムを作成し、テーブルを使用する時に、0からはじめた方が作りやすいか、1からはじめた方が作りやすいかは、うろさん次第です。

ExcelVBAで使用する Worksheets(TBL).Select のような命令の場合は、
テーブルは1以上の値でしようしないとエラーになるかもしれません。

以上、参考までに・・・

【71907】Re:目的のシート以外をプレビュー表示し...
お礼  うろ  - 12/4/24(火) 14:03 -

引用なし
パスワード
   >ちん さん

ご返答頂きありがとうございます。

内容が難しくて分かったような分からないような。。。

自分の中で.selectのように、0を選び得ないような
構文ではテーブルを1以上で最初に設定しといたほうが
エラーが出にくいんだろうな・・・と
かなり自己流解釈ですが納得しました。

わざわざ本当に有難うございました。

【71908】Re:目的のシート以外をプレビュー表示し...
発言  kanabun  - 12/4/24(火) 15:32 -

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

【71909】Re:目的のシート以外をプレビュー表示し...
お礼  うろ  - 12/4/24(火) 17:19 -

引用なし
パスワード
   >kanabun さん


すごい丁寧な説明ありがとうございます。

理解できました。
私がこのコードの動きを完全に理解していなかったって
ことですね。
独学でやっているので、色々つなぎ合わせながら、
コードを書いています。
構文の意味は調べればわかりますが、値がどのように格納されていくのかを
教えて頂き、目から鱗です。

すごい上っ面だけ理解してたんだな、と反省しました。

本当に有難うございました。

1791 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free