エクセルマクロVBAでシート名のソート方法

このQ&Aのポイント
  • エクセルのシート名をVBAでソートする方法を探しています。特定のグループだけをソートし、その他のシートはそのままにしたいです。しかし、2桁の数字が入ると上手くソートできません。
  • シート名をソートするためのVBAコードを作成中です。特定のグループのシートのみをソートし、その他のシートはそのままにしたいです。しかし、2桁の数字が含まれるとソートがうまくいきません。
  • エクセルのマクロ(VBA)でシート名のソート方法を教えてください。特定のグループのシートだけをソートし、その他のシートはそのままにしたいです。ただし、2桁の数字が入るとソートができません。どのようにしたらいいでしょうか?
回答を見る
  • ベストアンサー

エクセルマクロVBAのシートのソート

エクセルのシート名のソートをマクロでしたいのですが 例えば、aaa1,bbb3,bbb5,aaa12,aaa5,ccc1,vvv2,vvv10を ソート後、bbb5,ccc1,vvv2,vvv10,aaa1,aaa5,aaa12のようにしたいです。 aaaのものだけをソートしてシート後ろに移動できればいいです。 その他はそのままで。 ところが、aaa12のように2桁の数字が入ると上手くソートできず困っています。 If Sheets(i).Name > Sheets(j).Name Thenのようなものでは、数字2桁と数字1桁のグループに 分かれてソートされてしまいました。 どのようにしたらいいでしょうか?

  • devid
  • お礼率34% (166/478)

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

まぁ、チカラワザというよりは乱暴なだけですが: sub macro2()  dim i as long, u as long  for i = 1 to worksheets.count   if left(worksheets(i).name, 3) = "aaa" then    u = application.max(u, val(replace(worksheets(i).name, "aaa", "")))   end if  next i  on error resume next  for i=1 to u   worksheets("aaa" & i).move after:=worksheets(worksheets.count)  next i end sub

devid
質問者

お礼

ありがとうございます。 短いですね。すごいです。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>aaaのものだけをソートしてシート後ろに移動できればいいです。 ざっくり作ってみただけなので読みにくいですが。 Sub macro1()  Dim aaa()  Dim i As Long, n As Long  For i = 1 To Worksheets.Count   If Worksheets(i).Name Like "aaa*" Then    ReDim Preserve aaa(n)    aaa(n) = Val(Replace(Worksheets(i).Name, "aaa", ""))    n = n + 1   End If  Next i  qsort aaa, 0, UBound(aaa)  For i = 0 To UBound(aaa)   Worksheets("aaa" & aaa(i)).Move after:=Worksheets(Worksheets.Count)  Next i End Sub Private Sub qsort(aaa, l, u)  Dim cp As Long  Dim ix1 As Long  Dim ix2 As Long  Dim buf1 As Long  Dim buf2 As Long  If l >= u Then Exit Sub  cp = (l + u) \ 2  buf1 = aaa(cp)  aaa(cp) = aaa(l)  ix2 = l  ix1 = l + 1  Do While ix1 <= u   If aaa(ix1) < buf1 Then    ix2 = ix2 + 1    buf2 = aaa(ix2)    aaa(ix2) = aaa(ix1)    aaa(ix1) = buf2   End If   ix1 = ix1 + 1  Loop  aaa(l) = aaa(ix2)  aaa(ix2) = buf1  Call qsort(aaa, l, ix2 - 1)  Call qsort(aaa, ix2 + 1, u) End Sub

devid
質問者

お礼

ありがとうございます。 結構複雑になっちゃうんですね。

関連するQ&A

  • ■助けてください。■エクセルのマクロで困っています。

    エクセルで、シートを一つ削除するマクロを教えてください。 本当に困っています。 マクロをご存知の方、ずぶの素人の私にご教示何卒よろしくお願いします。 文末にマクロを記述いたしますが、そちらは、 指定した日付以降にエクセルのファイルを開くと シートがすべて削除されて、「有効期限切れ」という シートだけが出てくるというものです。 現在、これを応用して、すべてのシートを 削除するのではなく、ひとつのシートだけ削除したいのです。 例えば「SheetA」、「SheetB」、「SheetC」、「有効期限切れ」という 4つのシートがあったとして、 指定した期日が来たら、「SheetC」だけを削除したいのです。 なお、エクセルファイルを開く際に、マクロを無効にされてしまうと 期日が来てもSheetCが削除されずに 残ってしまっては困るのです。 そこで、マクロを有効にしないと SheetCが現れないようにしたいのです。 (以下のマクロではそのようになっています) 一つだけシートを削除するマクロをやり方をご存知の方、マクロのご教示のほど 何卒よろしくお願い致します。 なお、小生、マクロはずぶの素人でして、 マクロの文面を頂いてコピー貼り付けするぐらいしか 能がありません。 つきましては、以下の文面を モディファイしてご教示頂けませんでしょうか。 よろしくお願いいたします。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("SheetA ").Visible Then Sheets("SheetC ").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "3008/09/29" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = " SheetC " Then If Not Sheets("SheetC ").Visible Then Sheets("SheetC ").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("b" & 3).Value = "ご利用ありがとうございました。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets(" SheetC ").Visible Then Sheets(" SheetC ").Visible = True End Sub

  • エクセルでシート名でソート

    エクセルのシートをシート名でソートしたいのですが、VBAで以下の様な条件で出来るのでしょうか。 ・シートは必ず5枚以上で、最大70枚です。 ・シート名は、半角英数字、漢字を使用しています。 ・ソートの順は、1文字の「0~9」→「A~Z」→「0_0~9_Z」→「A_1~Z_Z」の順になります。 ・シートの一番左端と右端3シートは並び替えしない(漢字名シート)。 例(ソートするシート) 0→4→5→F→0_1→0_9→4_1→5_4→5_5→F_5 「シートの並び替え」で検索してみましたら以下のサンプルが 有りましたので少し変更してみました。 ********************* Sub MoveSamp1() Dim i As Long Dim j As Long For i = 2 To Sheets.Count - 3 '---最初から最後の3つ前のシートまで For j = i + 1 To Sheets.Count '---i番め以降のシート全て If Sheets(i).Name > Sheets(j).Name Then '---シート名の比較 Sheets(j).Move Before:=Sheets(i) '---(1)シートの移動 End If Next j Next i End Sub ********************************************************** 結果 0→0_1→0_9→4→4_1→5→5_4→5_5→F→F_5 上手くいきませんでした。 他の方法として   ブック追加、シート名をセルに書き出し、セルとシート名比較、シート移動、ブック削除 なども試してみましたがダメでした。 シート名が数字ならば行くようですが。  エクセルは2003~2010で考えています。 すみませんが良いお知恵をお貸しくださいませんか。

  • ■シートを一つ削除するマクロを教えてください。

    前に、http://oshiete1.goo.ne.jp/qa4352149.html で質問させて頂きました。 その節は、お世話になりありがとうございました。 今回は、前回と似たようなものですが、 少々条件を変更したマクロを作成したいので ご協力のほど、何卒よろしくお願い致します。 文末にマクロを記述いたしますが、そちらは、 指定した日付以降にエクセルのファイルを開くと シートがすべて削除されて、「有効期限切れ」という シートだけが出てくるというものです。 今度は例えば「SheetA」、「SheetB」、「SheetC」という 3つのシートがあったとして、 指定した期日が来たら、「SheetC」だけを削除したいのです。 条件があり、「SheetC」は、マクロを有効にしないと使用できないようにしたいのです。 やり方をご存知の方、ご教示のほど 何卒よろしくお願い致します。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("SheetA ").Visible Then Sheets("SheetC ").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "3008/09/29" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = " SheetC " Then If Not Sheets("SheetC ").Visible Then Sheets("SheetC ").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("b" & 3).Value = "ご利用ありがとうございました。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets(" SheetC ").Visible Then Sheets(" SheetC ").Visible = True End Sub

  • Excel:  データを各シートへ振り分ける

    Excelでsheet1からsheet nまで準備されているものとします。sheet1として(2行1列目~50行2列目)までの表があってそれを1列目を昇順でソートしたとき数個のグループに分かれるものとします。またsheet nは事前にグループの分は充分用意されているものとします。 そこでソート後、そのシートを分かれたグループ仮にAAA,CCC,DDDと分かれたときに、sheet2にはAAAのグループを2行目以下へ転送し、sheet3にはBBBのグルーを2行目以下へ転送し、そしてsheet4にはCCCのグループを2行目以下へ転送するようにマクロ記述をしたいどのように記述すればいいですか。(マクロ実行はソート後実行します)

  • 集まり単位?でのソート

    FreeBSDに PostgreSQL7.4.6 + Apache + php4.3.10で色々と試していますが データソートのSQLについて悩んでいます 【テーブル(test)】 code name 1001 aaa 1002 bbb 2001 ccc 2002 ddd 3001 eee 4001 fff 【希望】 codeの4桁目基本にグループわけし、 各グループ単位で希望の順番(1,3,4,2)に並べたい グループ内は残り3桁の昇順で並べたい 【希望結果】 1001 aaa 1002 bbb 3001 eee 4001 fff 2001 ccc 2002 ddd

  • VBA ソートすると、1、11、2,3になって・・

    VBAにて下記のようなコードでソートすると、1、11、2,3になってしまいました。 数字ではなく、文字として認識していると、このようになると書かれていました。 どうすれば、1、2、3、11と並び替えれるのしょうか? If Numbers1(i) > Numbers1(j) Then

  • エクセルVBAで複数シートにマクロ実行

    エクセル2000です。 Sub 行列非表示() For i = 2 To 120 If Cells(i, "A").Interior.ColorIndex = 3 Then Cells(i, "A").EntireRow.Hidden = True End If Next i For n = 1 To 50 If Cells(1, n).Interior.ColorIndex = 3 Then Cells(1, n).EntireColumn.Hidden = True End If Next n End Sub 上記マクロを、シートAAAとCCCとEEEに実行する場合、 Sub test() Sheets("AAA").Activate Call 行列非表示 Sheets("CCC").Activate Call 行列非表示 Sheets("EEE").Activate Call 行列非表示 End Sub と書くよりももっとすっきり実行する方法は無いでしょうか? 各シートの非表示対象の行や列はそれぞれことなります。 また Sub 行列非表示 自体も、もっと効率的にやる方法はないでしょうか?

  • エクセルのマクロについて教えていただきたいのですが・・・

    見積書を作成しているんですが、1枚目のシート(見積書)に明細が書ききれなかった時に、マクロを実行すると、『明細書』と言う名前のシートが(1)~(5)枚目まで追加され、各シートの小計を1枚目のシートに書き出す・・・と言うマクロを作りたいのですが、うまくいかずに困っています>< 追加されるシートの元となる『見積もりマスター』と言うシートがあって、そのシート内でそれぞれのシートの小計は取れるのですが・・・ 下記のマクロの中に何か追加すればうまくいく方法はありますか?? (明細書は追加する時もあれば追加しない時もあってその都度、使う人が、最大5枚まで何枚追加するかを決めるそうです。) Sub Macro1() Dim cnt As Integer Dim wkNum As Double Dim ws As Worksheet  For Each ws In Worksheets   If Left(ws.Name, 4) = "明細書(" Then    If IsNumeric(Mid(ws.Name, 5, 1)) Then     wkNum = Val(Mid(ws.Name, 5, 1))     If cnt < wkNum Then      cnt = wkNum     End If    End If   End If  Next ws  If cnt >= 5 Then   MsgBox ("明細書シートが既に5枚以上あるため追加できません")   Exit Sub  Else   Sheets("明細マスター").Copy after:=Sheets(Worksheets.Count)   ActiveSheet.Name = "明細書(" & cnt + 1 & ")"  End If 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 ご理解いただけますでしょうか? お分かりになられる方宜しくお願い致します。

  • VBAで複数シート選択

    エクセルVBAで複数のシートを選択する場合、 Sheets(Array("AAA", "BBB", "CCC")).Select  と書くと思いますが、マクロを回してみないことにはシート名や枚数が特定できない場合、どのように記述したらいいのでしょうか? たとえば、新たに追加されたSheets(n)~Sheets(n+x)を選択するような場合です。 よろしくお願いします。

専門家に質問してみよう