エクセルのシートを数値順に並び替える方法

このQ&Aのポイント
  • エクセルのシートを文字列順ではなく数値順に並び替えたい場合、VBAを使用することで実現できます。
  • 以下のVBAコードを使用することで、シートを数値順に並び替えることができます。
  • シートを並び替えたいエクセルファイルを開き、Visual Basicエディタを起動して、指定されたVBAコードを挿入・実行することでシートの並び順を変更することができます。
回答を見る
  • ベストアンサー

シートが文字列で並び替えられて困っています。

エクセル2003を使用しています。 シートの並びについて、文字列(名前順)ではなく、数値順に並び替えたいのですが、 どのようなマクロを組めば良いのでしょうか? ↓これですと、シートの並びが文字列(名前順)になってしまうので、ダメなんです。 ------------------------------- Sub Sort() Dim intLoopA As Integer Dim intLoopB As Integer For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move After:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA End Sub ------------------------------- 例として、 01.午前中/02.午後/100/300/50/テスト ではなく、 理想型は 01.午前中/02.午後/50/100/300/テスト の順番です。 シート名に番号+日本語を付けているのがあるのは、数字の並び順になって欲しい対策です。 分かりやすくするために簡略化いたしましたが、 実際は300ほどのシートがバラバラに出入りし、それらは連番ではありません。 数値順にするvbaをよろしければ教えて頂けませんでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.1

yamayama456様 シート名を数値化すれば良いかと思います。 注)文字だけの時は頭1文字を文字コード順に並べています。 お試しください。   Sub Sort()  Dim intLoopA As Integer  Dim intLoopB As Integer  For intLoopA = 1 To Sheets.Count - 1   For intLoopB = intLoopA + 1 To Sheets.Count    If シートNO(Sheets(intLoopA)) > シートNO(Sheets(intLoopB)) Then     Sheets(intLoopB).Move before:=Sheets(intLoopA)    End If   Next intLoopB  Next intLoopA End Sub Function シートNO(シート As Worksheet) As Long  シートNO = Val(シート.Name)  If シートNO <> 0 Then Exit Function  シートNO = Val("&H700" & Hex$(Asc(シート.Name))) End Function

yamayama456
質問者

お礼

jcctaira様 >シート名を数値化すれば良いかと思います。 ヒントと回答、ありがとうございます! ばっちり希望通りにできました!! vba初心者なので、中身の解読に時間がかかりますが、 これからしっかり見て、勉強いたします。 本当に助かりました! ありがとうございました。

関連するQ&A

  • エクセル 漢字のシート名をあいうえお順に並び替え

    エクセル2003を使っています。 シートが80ほどあり、シート名は漢字で氏名になっています。 その80あるシートをあいうえお順に並べたいと思っています。 別のサイトで下記を見つけたので、使いました。 並びかわりましたが、漢字を使っているせいか、あいうえお順に 並び変わりませんでした。 試しに、2~3のシート名をカタカナに変えたら正しく並び変わりました。 やはり、漢字だとうまく並びかわらないのでしょうか。 また、何か別の方法はありますか? 教えて下さい。 Sub SortSheets() Dim intLoopA As Integer Dim intLoopB As Integer For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move after:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA End Sub

  • エクセルのシートをマクロで並び替えたいです。

    以前に、Q&Aがあったので、下記の物を入れてみましたが、シート名に会社名を入れている為、前(株)○○となると、全て(株)で集まってしまいます。 エクセル2003を使っています。 Sub SortSheets() Dim intLoopA As Integer Dim intLoopB As Integer For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move after:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA End Sub ご理解いただけますでしょうか? お分かりになられる方宜しくお願い致します。

  • シートをコピーして シートに1から連番をふる

    (マスター)というシートがありまして、そのシートをコピーしてシート名に1からの連番をふる マクロをお教え下さい。 Sub sub_CopySample() Dim myLooP As Integer For myLooP = 1 To 10 Sheets("マスター").Copy After:=Sheets(myLooP) Next myLooP For myLooP = 1 To 10 Sheets(myLooP + 1).Name = myLooP Next myLooP End Sub これだと止まりません。 1シートづつ増やしたいのですが。

  • Excel 複数 シートコピー 同時に名前も・・・

    Excelのシートコピーを複数つくるVBAを探しています。 Sheet1を10シートコピーする場合に方法はありますでしょうか? 本当は、それの名前もVBAで変更できればよいと考えているのですが、とりあえずシート名の変更は、以下のVBAでできました。 Sub シート名変更() Const OrgSh = "Sheet2" Dim Rw As Long Dim Cnt As Integer Sheets(OrgSh).Move Before:=Sheets(1) For Cnt = 2 To Sheets.Count Sheets(Cnt).Name = "Tentative" & Cnt Next For Cnt = 2 To Sheets.Count Sheets(Cnt).Name = Cells(Cnt, 1).Value Next End Sub なので、最初にシートをコピーして、名前を変更する、2段構えの覚悟はできています。 シートコピーのみでもよいので、だれか教えていただけませんか?

  • エクセルVBAで一番左の可視シート名を取得

    エクセルVBAで一番左側にあるシート名を取得する場合、通常は Sub test01()   MsgBox Sheets(1).Name End Sub で簡単にできますが、このSheets(1)が非表示になっている場合でもその名前が取得されるため、見た目での一番左側にあるシート名ではなくなってしまいます。 もちろん、非表示になっているシートを除外して Sub test02()   Dim n As Integer   For n = 1 To Sheets.Count     If Sheets(n).Visible Then       MsgBox Sheets(n).Name       Exit For     End If   Next End Sub とすれば取得できるのはわかりますが、こんなまだるっこい方法以外に簡単に一番左の可視シート名を取得する方法はないでしょうか? (^∇^)? ご教示くださいませ。

  • エクセルのシートに連番をつけたい

    エクセル2010を使用しています。 シートが100個あったとして、 下のコードで1~100番までは コマンドボタンを押すことで、シート名を 変えることができました。 ところがコードの 1 To・・・を 101 To・・・に変えても101~200番には ならないのです。 私がコードを書く時はてっきりこれで大丈夫だと 思っておりましたが・・・意味をはきちがえているみたいです。 どなたか数値を変えれば 何番でも対応できるコードを解説付きでお教えください。 Private Sub CommandButton3_Click() Dim i As Long For i = 1 To Sheets.Count Sheets(i).Name = i Next End Sub

  • シート名変更マクロ

    「1」というシートのH4にコピー数を入力し、「1」の後ろに挿入するマクロがあります。できたシートの名前は「1(2)」「1(3)」となってしまいます。このシート名を挿入した数の通し番号(「2」「3」に変更することはできるのでしょうか?挿入するシートの数は決まっていません。 Sub シートのコピー() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value For i = 1 To n Worksheets("1").Copy Before:=Worksheets(Sheets.Count) Next i End Sub

  • 最終シートからその手前まで5シートの選択したい

    最終シート名が「基本」、その前が「種別」、さらにその前が「一覧」と言うシート名になっています。 またその「一覧」の前2ケは、シート名をindexで指定したいです。 以下のコードを実行してもうまく、シートを除外してくれません。どうしたらよろしいでしょうか。 Sub 各シートに関数を入力() Dim EXCEPT_NAME As String EXCEPT_NAME = " 一覧  種別  基本" & Worksheets(Sheets.Count - 4).name & Worksheets(Sheets.Count - 5).name Application.ScreenUpdating = False ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path Dim list, sheetName For Each sheetName In ActiveWorkbook.Worksheets If InStr(EXCEPT_NAME, sheetName.name) = 0 Then Sheets(sheetName.name).Activate ActiveSheet.Unprotect Call 関数貼付 End If Next End Sub

  • Excel VBAシートの同一番地のセルのリスト化

    別々のシートの同一番地のセルの値をリスト化するのにこのようなVBAを見つけました。 シートは追加せず、既存のシートを指定したくて、色々と書き換えをチャレンジしましたがうまくいきません。 既存のシートを指定し、この作業を行うにはどうしたらよいのでしょうか? ご教示いただけますと幸甚です。 Sub Test1() Dim TmpSheet As Worksheet, i As Integer i = Worksheets.Count Set TmpSheet = Worksheets.Add(After:=Sheets(Sheets.Count)) With TmpSheet For i = 1 To i .Cells(i, 1).Value = Worksheets(i).Name .Cells(i, 2).Value = Worksheets(i).Range("E5").Value Next End With End Sub

  • ワークシート上のチェックボックスのチェックをカウント

    こんにちは EXCELのVBAに関する質問なのですが ワークシート上に配置したチェックボックス(コントロールツールボックス) で各シートのCheckbox1にチェックが入っている数を数えたいのですが 下記のように書いたところエラーが出ました。 何かよい改善案ご存知の方いらっしゃいませんか? よろしくお願いいたします。 Sub test() Dim myst As Worksheet Dim yes As Integer, myct As Integer myct = ThisWorkbook.Sheets.Count Worksheets.Add after:=Sheets(myct) Sheets(myct + 1).Name = "syuukei" For Each myst In Worksheets On Error GoTo elabel If ThisWorkbook.myst.CheckBox1.Value = True Then yes = yes + 1 End If elabel: Next with worksheets("syuukei") .range("a2")="YESの合計" .range("b2")=yes end with End Sub

専門家に質問してみよう