こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCELのシートを並べ替えすると・・・

エクセルのシートを並べ替えようと思って
こちらで調べてようやく並べ替えができるようになったのですが、幾つかあるデータの中で実行するとエラーが出るものがあります。
シートの名前は1日~31日&集計という構成なのですが、下記を実行すると実行エラー9:インデックスが有効範囲にありません!とでます…デバックを押すと
Worksheets(CStr(Wwh.Cells(N, 1).Value)).Move After:=Sheets(N)
のところが黄色になっています。
同じようなシートの構成があるデータで試してみると成功するものと失敗するものがありもう何がなにやら(;´Д`)
何か変更しないとだめなんでしょうか?
分かる人がいたらアドバイスお願いします。

Sub SortSheets()
Dim Wwh As Worksheet
Dim N As Integer
Application.ScreenUpdating = False
Sheets.Add Before:=Worksheets(1)
Set Wwh = ActiveSheet
For N = 2 To Worksheets.Count
  Cells(N - 1, 1).Value = Worksheets(N).Name
  Cells(N - 1, 2).Value = _
  Application.GetPhonetic(Worksheets(N).Name)
Next N
Range("A1").CurrentRegion.Sort Key1:=Range("B1"), _
  Order1:=xlAscending, Header:=xlNo, OrderCustom:=1 '昇順
'Range("A1").CurrentRegion.Sort Key1:=Range("B1"), _
  Order1:=xlDescending, Header:=xlNo, OrderCustom:=1 '降順
For N = 1 To Range("A1").End(xlDown).Row
  Worksheets(CStr(Wwh.Cells(N, 1).Value)).Move After:=Sheets(N)
Next N
For N = 2 To Worksheets.Count
  If Worksheets(N).Visible = xlSheetVisible Then
    Worksheets(N).Activate
    Exit For
  End If
Next N
Application.DisplayAlerts = False
Wwh.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Set Wwh = Nothing
End Sub

投稿日時 - 2004-05-11 17:31:32

QNo.855206

暇なときに回答ください

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

またまた #3 です。

これかなっていうのを思いつきました。
シート名が「01」などの場合です。

For N = 2 To Worksheets.Count
  Wwh.Cells(N - 1, 1).Value = Worksheets(N).Name
  Wwh.Cells(N - 1, 2).Value = _
  Application.GetPhonetic(Worksheets(N).Name)
Next N

ここを

For N = 2 To Worksheets.Count
  Wwh.Cells(N - 1, 1).NumberFormat = "@"
  Wwh.Cells(N - 1, 1).Value = Worksheets(N).Name
  Wwh.Cells(N - 1, 2).Value = _
  Application.GetPhonetic(Worksheets(N).Name)
Next N

こうするとどうでしょう?

投稿日時 - 2004-05-12 01:33:01

お礼

何度も丁寧に教えていただいてありがとうございます!!
おかげさまで、何とか解決できました。
なかなか難しいものですねー
いろいろと勉強してみようと思います、ありがとうございました (^人^)

投稿日時 - 2004-05-13 01:44:20

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

#3です。

もう一点

Sheets.Add Before:=Worksheets(1)
Set Wwh = ActiveSheet

の2行を止めて

Set Wwh = Worksheets.Add(Before:=Worksheets(1))

にしてみる。

投稿日時 - 2004-05-12 01:19:49

ANo.3

作業用新規シート(Wwh)のA1からWwhを除く全シート名とカナを順番に書き込んでソートし、A列にあるシート名の順序でシートを並び替えてから、Wwhを削除する。

この記述なら#2さんのおっしゃる N が Worksheets.Count を超えているって可能性は低いように感じます。また、Wwh.Cells(N, 1).Value の値はもともとシート名ですので、(2)(3)も当てはまらないと思われます。

ただ、エラー内容的にはやはり N が Worksheets.Count を超えているって感じなんですよね。
ダメもとで Range の 元シートを明確に指定してみても同じでしょうか?

Sub SortSheets_Test()
Dim Wwh As Worksheet
Dim N As Integer
'Application.ScreenUpdating = False
Sheets.Add Before:=Worksheets(1)
Set Wwh = ActiveSheet
For N = 2 To Worksheets.Count
  Wwh.Cells(N - 1, 1).Value = Worksheets(N).Name
  Wwh.Cells(N - 1, 2).Value = _
  Application.GetPhonetic(Worksheets(N).Name)
Next N
Wwh.Range("A1").CurrentRegion.Sort Key1:=Range("B1"), _
  Order1:=xlAscending, Header:=xlNo, OrderCustom:=1 '昇順
'Wwh.Range("A1").CurrentRegion.Sort Key1:=Range("B1"), _
  Order1:=xlDescending, Header:=xlNo, OrderCustom:=1 '降順
For N = 1 To Wwh.Range("A1").End(xlDown).Row
  Worksheets(CStr(Wwh.Cells(N, 1).Value)).Move After:=Sheets(N)
Next N
For N = 2 To Worksheets.Count
  If Worksheets(N).Visible = xlSheetVisible Then
    Worksheets(N).Activate
    Exit For
  End If
Next N
Application.DisplayAlerts = False
Wwh.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Set Wwh = Nothing
End Sub

投稿日時 - 2004-05-12 01:08:38

ANo.2

#1です。補足します。

For N = 1 To Range("A1").End(xlDown).Row
  Worksheets(CStr(Wwh.Cells(N, 1).Value)).Move After:=Sheets(N)
Next N

で、エラーが起きてて、さらに「実行エラー9:インデックスが有効範囲にありません!」というエラー内容ということで次の3点を推測しました。

まず、 Range("A1").End(xlDown).Row というのはA1を軸に下方に連続している行の行番号を表します。
例えば、A1~A5までデータが入って入れば5が返ってきます。

これを踏まえて、エラーの原因は
(1)A1~A??(データが入力されているA列のセル)までの行数が、全ワークシート数(Worksheets.Count)より大きい。

(2)Wwh.Cells(N, 1).Valueの数値のうち全ワークシート数(Worksheets.Count)より大きいものがある。

(3)Wwh.Cells(N, 1).Valueの値が数値でない。

この構文からは、以上の要素があるとエラーが発生します。
ではでは。

投稿日時 - 2004-05-11 23:03:29

お礼

何度もすみません!
何とか問題解決しました(≧д≦)ノ
本当にありがとうございます!!

投稿日時 - 2004-05-13 01:46:21

ANo.1

For N = 1 To Range("A1").End(xlDown).Row
  Worksheets(CStr(Wwh.Cells(N, 1).Value)).Move After:=Sheets(N)
Next N

のところで、

Range("A1").End(xlDown).Row が、Worksheets.Countの数を超えている為のエラーではないでしょうか?

そうでないとしたら、エラーが起きているときのNの値はいくつなんでしょうか?

投稿日時 - 2004-05-11 17:44:11

補足

ええっと・・・
それはシート数が多すぎるということでしょうかヽ(;´Д`)ノ
ちょっと知識がなくてわかんないです…すみません

投稿日時 - 2004-05-11 21:27:03

あなたにオススメの質問