- ベストアンサー
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
- みんなの回答 (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 こうするとどうでしょう?
その他の回答 (4)
- papayuka
- ベストアンサー率45% (1388/3066)
#3です。 もう一点 Sheets.Add Before:=Worksheets(1) Set Wwh = ActiveSheet の2行を止めて Set Wwh = Worksheets.Add(Before:=Worksheets(1)) にしてみる。
- papayuka
- ベストアンサー率45% (1388/3066)
作業用新規シート(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
- ssssssssss
- ベストアンサー率23% (24/103)
#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の値が数値でない。 この構文からは、以上の要素があるとエラーが発生します。 ではでは。
お礼
何度もすみません! 何とか問題解決しました(≧д≦)ノ 本当にありがとうございます!!
- ssssssssss
- ベストアンサー率23% (24/103)
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の値はいくつなんでしょうか?
補足
ええっと・・・ それはシート数が多すぎるということでしょうかヽ(;´Д`)ノ ちょっと知識がなくてわかんないです…すみません
お礼
何度も丁寧に教えていただいてありがとうございます!! おかげさまで、何とか解決できました。 なかなか難しいものですねー いろいろと勉強してみようと思います、ありがとうございました (^人^)