• ベストアンサー

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

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

またまた #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 こうするとどうでしょう?

nakayosi
質問者

お礼

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

その他の回答 (4)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

#3です。 もう一点 Sheets.Add Before:=Worksheets(1) Set Wwh = ActiveSheet の2行を止めて Set Wwh = Worksheets.Add(Before:=Worksheets(1)) にしてみる。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.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

回答No.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の値が数値でない。 この構文からは、以上の要素があるとエラーが発生します。 ではでは。

nakayosi
質問者

お礼

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

回答No.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の値はいくつなんでしょうか?

nakayosi
質問者

補足

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