エクセルのシートを数値順に並び替える方法
- エクセルのシートを文字列順ではなく数値順に並び替えたい場合、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をよろしければ教えて頂けませんでしょうか。 よろしくお願いいたします。
- yamayama456
- お礼率85% (41/48)
- その他MS Office製品
- 回答数1
- ありがとう数2
- みんなの回答 (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
関連する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 とすれば取得できるのはわかりますが、こんなまだるっこい方法以外に簡単に一番左の可視シート名を取得する方法はないでしょうか? (^∇^)? ご教示くださいませ。
- ベストアンサー
- その他MS Office製品
- エクセルのシートに連番をつけたい
エクセル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
- ベストアンサー
- Visual Basic
- 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(エクセル)
- ワークシート上のチェックボックスのチェックをカウント
こんにちは 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
- ベストアンサー
- Visual Basic
お礼
jcctaira様 >シート名を数値化すれば良いかと思います。 ヒントと回答、ありがとうございます! ばっちり希望通りにできました!! vba初心者なので、中身の解読に時間がかかりますが、 これからしっかり見て、勉強いたします。 本当に助かりました! ありがとうございました。