[[20210625225354]] 『シートの並べ替えで』(ひろくん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シートの並べ替えで』(ひろくん)

いつもお世話になります
A1〜A12までのシート名をならべかえたら
A10
A11
A12
A1
A2
.
.
.
みたいになるので
一桁の数字のシートに0をくわえて
A01
A02
みたいにしたいのですが
どういうマクロを書けばいいでしょうか
よろしくお願いします

< 使用 Excel:Excel2019、使用 OS:Windows10 >


シート名の文字列の長さを見て(Len関数)、
2桁なら、
1桁目 & "0" & 2桁目
とする、というようなことではないですか?
Left関数、Right関数などを使うんでしょうか。

シート名による並べ替えって、そもそもどうやっているんですか?
(γ) 2021/06/25(金) 23:13


適当に手を加えてください。
並べ替えの方は考えてません。

Dim Sh As Worksheet
For Each Sh In Worksheets

    aa = Format(Val(Replace(Sh.Name, "A", "")), "A00")
    MsgBox aa
Next
(コロナで死ぬかワクチンで死ぬか・・・) 2021/06/26(土) 01:53

彼は、毎回説明不足!

過去の反省も出来ていない。
(!) 2021/06/26(土) 02:03


別に名前を変えなくても、順番に並び替えられますよ。
(むしろ名前で並び替えようとするから失敗するんでしょう。)
    Sub テキトー()
        Dim i As Long
        For i = 12 To 1 Step -1
            Worksheets("A" & i).Move before:=Worksheets(1)
        Next i
    End Sub

(もこな2) 2021/06/26(土) 02:30


ときに、新しい質問をするのも結構ですが↓はどうするんですか?
[[20210524221724]] 『月初めに起動するマクロを作るには』(ひろくん)

(もこな2) 2021/06/26(土) 02:43


https://plaza.rakuten.co.jp/carrascombu/diary/201504220000/
(beb) 2021/06/26(土) 02:49

コメントありがとうございます
書き忘れましたがAからDまであり
それぞれA1〜12 B1〜12 C1〜12 D1〜12まであります
書き忘れました すいません
(ひろくん) 2021/06/28(月) 19:35

>書き忘れました すいません
追加提示のあったものでも、既出の方法で解決しそうですが、何に困ってるのですか?

(もこな2) 2021/06/28(月) 20:05


   Worksheets("A" & i).Move before:=Worksheets(1)
をどう変えればB C D にも適用できるかわからないのです

(ひろくん) 2021/06/28(月) 20:27


■1
>どう変えればB C D にも適用できるかわからないのです
うーん
ステップ実行したりして、どれが固定で、どれが変わっていく(変数になっている)のか、また、どの命令が何をしているのか等々研究してみましたか?

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

また、以下も知っておいて損は無いと思います。

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

 【ブレークポイント】
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

たとえば、

 「A12」というシートなら↓ですし
Worksheets("A" & 12).Move before:=Worksheets(1)

 「A3」というシートなら↓ですよね
Worksheets("A" & 3).Move before:=Worksheets(1)

本当にわかりませんか?

■2
ちょっと私が勘違いしていたかもです。
シートを並び替えるんじゃなくて(書き出した?)シート名を並び替えたいといった話なら関係なかったので忘れてください。

そのうえで、A1セルから順番に書き出してあるならB列に↓のような数式を書いてみてはどうでしょうか?

 =LEFT(A1,1)&REPT("0",3-LEN(A1))&MID(A1,2,LEN(A1))

(もこな2) 2021/06/29(火) 07:40


 >『シートの並べ替えで』
 >シート名をならべかえたら

目的は、シートそのものの並べ替えなの?
それともシート名の一覧(シート上にある)を並べ替えるの?

 >みたいになるので

どうやったらそうなった?

 >みたいにしたい

ならば、その方法または作業手順を考えましょう。

 >どういうマクロを書けばいいでしょうか

作業手順を考えるところから、プログラミングは始まってます。
サンプルを書いてもらって、
傾向と対策で一部を変更すればよいとお考えのようですが、
作業手順を日本語で説明できるようにならなければ、
マクロを書けるようにはならないですよ。
(書けるようになりたいと思ってないかもですが。。。)

(まっつわん) 2021/06/29(火) 15:25


色々ありがとうございます
少し考えてみます
勉強してみます

(ひろくん) 2021/06/29(火) 21:14


コメント遅くなりました
もこな2さんのコードを試したところ
インデックスが有効範囲にありませんと出ます
で 再度みたところ
シート名が
A1
A2
ではなく

A1R
A2R
というふうに
最後にRがついてました
見落としてました すいません
(ひろくん) 2021/06/30(水) 19:46


なんか迷走しているようですが、
 【シート自体】を並び替える
 (シートに書き出した)【シート名】を並び替える

どっちですか?

(もこな2 ) 2021/06/30(水) 19:55


もこな2さん
説明が下手でした
シート自体を並べ替えるです
(ひろくん) 2021/06/30(水) 20:00

では、再掲
 「A12」というシートなら↓ですし
Worksheets("A" & 12).Move before:=Worksheets(1)

 「A3」というシートなら↓ですよね
Worksheets("A" & 3).Move before:=Worksheets(1)

本当にわかりませんか?

(もこな2) 2021/06/30(水) 20:21


Worksheets("A" & 3).Move before:=Worksheets(1)
の"A"を変えればよろしいでしょうか
ちなみに最後にRがつくのですが
(ひろくん) 2021/06/30(水) 20:34

■3
>〜よろしいでしょうか
[[20210524221724]] 『月初めに起動するマクロを作るには』(ひろくん)
↑でもコメントしましたが、【ご自身で検証した結果】問題がなければそれでよいでしょう。
いずれにせよ、検証(デバッグ)作業はご自身でなさるべきですよ。

>ちなみに最後にRがつくのですが
えっと。。。

 「"A"」と「12」を合体させると「A12」になります。
 「"A"」と「3」を合体させると「A3」になります。

では

 「"A"」と「10」と「"R"」を合体させると何になりますか?

(もこな2) 2021/06/30(水) 21:29


わかりました
すこしお待ちください
(ひろくん) 2021/07/01(木) 20:32

コメント遅くなりました
    Sub テキトー()
        Dim i As Long
        For i = 12 To 1 Step -1
            Worksheets("A" & i & "R").Move before:=Worksheets(1)
        Next i
    End Sub

としましたがまたインデックスが有効範囲にありませんと出ます

変数のiには12と出ています
(ひろくん) 2021/07/05(月) 20:09


>インデックスが有効範囲にありませんと出ます
そういうシートは存在しないということです。
そのマクロで何をしようとしいるのか。読み取れません。
(?) 2021/07/05(月) 20:27

上にも書きましたがシート自体を並べ替えたいです
(ひろくん) 2021/07/05(月) 20:34

 # 船頭多くしての類だが、最初にコメントしたので、追加したい。 

 簡単な例で示すと、こういうことでしょ?
 A2  A3   A4   A1
 とシートが並んでいたとして、
 これをA1,A2,A3,A4の順に並び変える方法は少なくも二つあります。

 (1)優先度の高いものから順に、ワークシートの最後に移動する
 A2   A3   A4   A1       A1を最後に(結果的に動かない)
 A3   A4   A1   A2       A2を最後に移す    
 A4   A1   A2   A3       A3を最後に
 A1   A2   A3   A4       A4を最後に
 または、
 (2)優先度の低いものから順に、ワークシートの先頭に移動する
 A4   A2   A3   A1       A4を先頭に移す           
 A3   A4   A2   A1       A3を先頭に
 A2   A3   A4   A1       A2を先頭に
 A1   A2   A3   A4       A1を先頭に

 どちらかといえば、(1)が自然じゃないかな。

 優先度順は、
 >それぞれA1〜12 B1〜12 C1〜12 D1〜12まであります
 ということなら明確じゃないですか。
 簡単に二重ループに落とし込めそうです。
(γ) 2021/07/06(火) 10:06

■4
>インデックスが有効範囲にありませんと出ます
とりあえず、↓を実行してイミディエイトに出力されたものをそのまま貼り付けて(投稿して)もらえませんか?
    Sub リスト出力()
        Dim buf(4) As String
        Dim i As Long, c As Long

        For i = 1 To Worksheets.Count
            buf(c) = Worksheets(i).Name
            If c = 4 Then
                Debug.Print " " & Join(buf, vbTab)
                c = 0
                Erase buf
            Else
                c = c + 1
            End If
        Next i

        If c > 0 Then Debug.Print " " & Join(buf, vbTab)
    End Sub

■5
お返事がないので確認。↓はわかった(理解出来た)のですか?

 「"A"」と「10」と「"R"」を合体させると何になりますか?
 >どう変えればB C D にも適用できるかわからないのです

また、私も↓のお返事が気になりますのできちんと返答されては如何ですか?
>シート名による並べ替えって、そもそもどうやっているんですか?

(もこな2) 2021/07/06(火) 11:13


もこな2さん いつもお世話になります
上記コードを実行してみました
イミディエイトに出力されたのは
 A2R A1R  A4R  A7R  A9R
 A10R A11R  B6R  B8R  B9R
 B10R C3R  C6R  C8R  C10R
 C11R A3R  A6R  A8R  A12R
 B2R B3R  B4R  B7R  B11R
 B12R C1R  C2R  C4R  C7R
 C9R C12R          
です
>「"A"」と「10」と「"R"」を合体させると何になりますか?
A10Rです
 >シート名による並べ替えって、そもそもどうやっているんですか?
質問の意味がわからないのですが・・・
(ひろくん) 2021/07/06(火) 18:57

| A1〜A12までのシート名をならべかえたら
| A10
| A11
| A12
| A1
| A2
| .
| みたいになるので
と質問の文章にあるので、
すでに並べ替えは実行されているかと受け止め、
どうやって並び替えたのですか?
と質問したわけです。

意味がわからないほど、おかしな質問ですか?
(γ) 2021/07/06(火) 19:16


失礼しました
別シートにシート名だけを書き出し単純に並べ替えを実行しただけです
(ひろくん) 2021/07/06(火) 19:49

了解しました。
シート名のソートと、シートそのものの並べ替えは関連はしても、別の話ですね。
船頭は多くてもいけないので、私はここでフェイドアウトします。
2021/07/06(火) 10:06で書いたアルゴリズムのイメージは、
理解促進につながるものと思っています。

(γ) 2021/07/06(火) 20:39


>別シートにシート名だけを書き出し単純に並べ替えを実行しただけです

シート上で並べ替えると、こうはならず

>A10
>A11
>A12
>A1
>A2

こうなるけどねえ? 2007

A1
A10
A11
A12
A2

まるっきり作ってまらうために
なんか適当言ってないですかね?
(おかしい) 2021/07/07(水) 01:05


こう?

="A" &TEXT(MID(A1,2,10),"00")
(おかしい) 2021/07/07(水) 01:24


書きためている間に話が進んでいたので、前後する部分もありますが、投稿しておきます。

■6
>>「"A"」と「10」と「"R"」を合体させると何になりますか?
>A10Rです
ちがいます。「A10R」です。(全角と半角は別物です)

>>シート名による並べ替えって、そもそもどうやっているんですか?
>質問の意味がわからないのですが・・・

冒頭に
>A1〜A12までのシート名をならべかえたら〜みたいになるので
と仰っているので、皆さん【何らかの方法で並び替えた結果】を前提に質問されているだと解釈してるとおもいますが・・・・・(少なくとも私はそう解釈してました)

■7
今回のケースは割と難題ですね。ポイントは数字部分です。
「■6」で指摘のとおり、全角と半角は別物ですから、数"字"部分を合体させる前に、1文字であれば全角に変換、2文字であれば半角のままという条件分岐をする必要でてきます。
たとえば、こんな感じ

    Sub 研究用()
        Dim i As Long

        For i = 1 To 12
            If Len(i & "") = 1 Then
                Debug.Print "A" & StrConv(i, vbWide) & "R"
            Else
                Debug.Print "A" & i & "R"
            End If
        Next
    End Sub

■8
既にγさんから二重ループの指摘があるところですが、実際にはどのように並べたいのですか?

 1) A1R,A2R,A3R.....B1R,B2R,B3R...
   ↑のようにアルファベットごとに、1〜12までならべたい

 2) A1R,B1R,C1R,D1R, A2R,B2R,C2R,D2R....
    ↑のように数字ごとに、A〜Dまでならべたい

おそらく↑のどちらかだとは思いますが、どちらでも、あえて二重ループにしないというものありだとおもいます。
いずれにせよ、数日後のご自身が理解出来る方法を採られるとよいと思います。
(いままでの質問の傾向からみて、かえって混乱しそうに思うので、コメントしました。心配不要ということなら、お読み流しください)

このほか↓について、一向にお返事が頂けないのですが大丈夫ですか?

 >お返事がないので確認。↓はわかった(理解出来た)のですか?
 >>どう変えればB C D にも適用できるかわからないのです

(もこな2) 2021/07/07(水) 08:59


■9
ちなみに、数字部分が二桁の場合のみ半角ということなら、確かに昇順では↓のように並ぶでしょうね
 A10R
 A11R
 A12R
 A1R
 A2R
 A3R
 A4R
 A5R
 A6R
 A7R
 A8R
 A9R

この場合は、B列に↓のような数式をかけば、目的は達成できたとおもいます。
=IF(LEN(A1)=4,JIS(A1),LEFT(A1,1)&"0"&RIGHT(A1,2))

シート上に書き出して並び替えたシート名の順番に、シート自体を並び替える算段があったのだとすれば、こちらのアプローチのほうが理解しやすいかもしれません。

(もこな2) 2021/07/07(水) 18:02


コメント遅くなりました
■8 既にγさんから二重ループの指摘があるところですが、実際にはどのように並べたいのですか?

 1) A1R,A2R,A3R.....B1R,B2R,B3R...
   ↑のようにアルファベットごとに、1〜12までならべたい

 2) A1R,B1R,C1R,D1R, A2R,B2R,C2R,D2R....
    ↑のように数字ごとに、A〜Dまでならべたい

1)です
(ひろくん) 2021/07/08(木) 19:08


アルファベットごとに、1〜12までならべたいといいうことなら、直接ループ処理で並び替える方法でも、シート上に書き出したシート名を並び替えてからそれをシート自体の並び替えに反映させる方法でも、すでにアドバイスされている理屈で対応できるのではありませんか?

何処で詰まってるのですか?

(もこな2 ) 2021/07/09(金) 06:49


いや、ゴネていれば最終的に完成した物を書いてくれるみたいなので
(ゴネ) 2021/07/09(金) 08:59

コメント遅くなりました すいません  どういうコードを書いていいのかがわからなくて
(ひろくん) 2021/07/11(日) 18:11

 こんなのでいいんじゃないですか?

 Sub putSheetsInOrder()
     Dim i As Long
     Dim prefix
     Dim WsCount As Long

     WsCount = Worksheets.Count

     For Each prefix In Array("A", "B", "C", "D")
         For i = 1 To 12
             On Error Resume Next
             Worksheets(prefix & Format(i, "#0R")).Move after:=Worksheets(WsCount)
             Worksheets(prefix & Format(i, "00R")).Move after:=Worksheets(WsCount)
             On Error GoTo 0
         Next i
     Next prefix
 End Sub

(半平太) 2021/07/11(日) 20:36


ありがとうございますためしてみます
(ひろくん) 2021/07/12(月) 20:26

半平太さんありがとうございます
提示されたコードを実行してみましたが何も変化がなかったです何か他に必要なんでしょうか
すいません
(ひろくん) 2021/07/13(火) 21:00

 >何か他に必要なんでしょうか

 シート名に関する情報が不正確すぎます。

 下のプログラムを実行して、イミディエイトウィンドウに打ち出されるシート名を
 コピーして、この掲示板に貼り付けてください。(解決策はそれを見た後で考えます)

 こんな感じで出てくるはずです。
  ↓
 A1R A2R A3R A4R A5R A6R     
 A6R A7R A8R A9R A10R A11R A12R            
 A12R B1R B2R B3R B4R B5R B6R              
 B6R B7R B8R B9R B10R B11R B12R            
 B12R D12R 

 ’貼り付けるマクロ
  ↓
 Sub wsNamePrintInImeadiateWindow()
     Dim i, ws
     i = 0
     For Each ws In ThisWorkbook.Worksheets
         i = i + 1
         If i >= 6 Then
         i = 0
         Debug.Print ws.Name & " ", vbCr
         End If
         Debug.Print ws.Name & " ";
     Next
 End Sub

(半平太) 2021/07/13(火) 21:26


半平太さんありがとうございます
上記コードを実行してみました
イミディエイトウィンドウには
A2R A1R A4R A7R A9R A10R

A10R A11R B6R B8R B9R B10R C3R

C3R C6R C8R C10R C11R A3R A6R

A6R A8R A12R B2R B3R B4R B7R

B7R B11R B12R C1R C2R C4R C7R

C7R C9R C12R A2R A1R A4R A7R A9R A10R

A10R A11R B6R B8R B9R B10R C3R

C3R C6R C8R C10R C11R A3R A6R

A6R A8R A12R B2R B3R B4R B7R

B7R B11R B12R C1R C2R C4R C7R

C7R C9R C12R
と出ます

(ひろくん) 2021/07/13(火) 21:52


失礼しました2回貼り付けてました
正しくは
A2R A1R A4R A7R A9R A10R

A10R A11R B6R B8R B9R B10R C3R

C3R C6R C8R C10R C11R A3R A6R

A6R A8R A12R B2R B3R B4R B7R

B7R B11R B12R C1R C2R C4R C7R

C7R C9R C12R
です失礼しました
(ひろくん) 2021/07/13(火) 22:25


 これでどうですか?

  Sub putSheetsInOrder()
     Dim sortedLst As Object
     Dim i, NM, Temp
     Dim ws As Worksheet
     Dim wsCount As Long

     Set sortedLst = CreateObject("System.Collections.SortedList")

     For Each ws In ThisWorkbook.Worksheets
         NM = ws.Name
         Temp = Left(NM, 1) & Format(Mid(NM, 2, Len(NM) - 2), "00") & Right(NM, 1)

         sortedLst.Add StrConv(Temp, vbNarrow), ws.Name
     Next ws

     wsCount = ThisWorkbook.Worksheets.Count

     For i = 0 To sortedLst.Count - 1
         Worksheets(sortedLst.GetByIndex(i)).Move after:=Worksheets(wsCount)
     Next i
  End Sub

(半平太) 2021/07/13(火) 22:49


編集がかぶりましたがそのまま。

>シート名に関する情報が不正確すぎます。
またしょうもない回答者と怒られちゃいそうですが、シート名の状況は、「(ひろくん) 2021/07/06(火) 18:57」を見ればおわかりになるかと。

■10
結局ご自身で考えるのは放棄してしまわれたようで残念でなりません。

最後まで答えていただけませんでしたが、

 >どう変えればB C D にも適用できるかわからないのです

↑は、直ぐに理解できると思ったがゆえに”本当にわからないのか?と繰り返し確認していました。

 "A" & 10 & "R" ・・・・ 【A10R】  なのですから、
 "B" & 10 & "R" ・・・・ 【B10R】  になることはご理解いただけるのではないかと。

■11
半平太さんがやる気になられているようなので、私はこの辺で撤退しますが、「■7」をちゃんと研究していただいたなら、↓のようなコードができたとおもいますので参考に提示しておきます。

    Sub ループを複数回にわける()
        Dim i As Long

        For i = 12 To 1 Step -1
            If Len(i & "") = 1 Then
                Worksheets("D" & StrConv(i, vbWide) & "R").Move before:=Worksheets(1)
            Else
                Worksheets("D" & i & "R").Move before:=Worksheets(1)
            End If
        Next i

        For i = 12 To 1 Step -1
            If Len(i & "") = 1 Then
                Worksheets("C" & StrConv(i, vbWide) & "R").Move before:=Worksheets(1)
            Else
                Worksheets("C" & i & "R").Move before:=Worksheets(1)
            End If
        Next i

        For i = 12 To 1 Step -1
            If Len(i & "") = 1 Then
                Worksheets("B" & StrConv(i, vbWide) & "R").Move before:=Worksheets(1)
            Else
                Worksheets("B" & i & "R").Move before:=Worksheets(1)
            End If
        Next i

         For i = 12 To 1 Step -1
            If Len(i & "") = 1 Then
                Worksheets("A" & StrConv(i, vbWide) & "R").Move before:=Worksheets(1)
            Else
                Worksheets("A" & i & "R").Move before:=Worksheets(1)
            End If
        Next i
    End Sub
    '-------------------------------------------------------------
    Sub 二重ループで一度に処理する()
        Dim アルファベット As Variant
        Dim 数字 As Long

        For Each アルファベット In Array("A", "B", "C", "D")
            For 数字 = 12 To 1 Step -1
                If Len(数字 & "") = 1 Then
                    Worksheets("A" & StrConv(数字, vbWide) & "R").Move before:=Worksheets(1)
                Else
                    Worksheets("A" & 数字 & "R").Move before:=Worksheets(1)
                End If
            Next 数字
        Next アルファベット
    End Sub

 ※γさんがコメントされている(1)のようにしてもよかったのですが、
   個人的には【それ以外】のシートが後ろに集まったほうが気持ちが良いと思うので、
   どんどん前において後ろに押し出すようにしています。(好みの問題ですね)

(もこな2 ) 2021/07/13(火) 22:53


失礼。二重ループのほう間違えました。
    Sub 二重ループで一度に処理する_修正()
        Dim アルファベット As Variant
        Dim 数字 As Long

        For Each アルファベット In Array("D", "C", "B", "A")
            For 数字 = 12 To 1 Step -1
                If Len(数字 & "") = 1 Then
                    Worksheets(アルファベット & StrConv(数字, vbWide) & "R").Move before:=Worksheets(1)
                Else
                    Worksheets(アルファベット & 数字 & "R").Move before:=Worksheets(1)
                End If
            Next 数字
        Next アルファベット
    End Sub

(もこな2 ) 2021/07/13(火) 22:57


ありがとうございます
実行してみました
  Sub putSheetsInOrder()
     Dim sortedLst As Object
     Dim i, NM, Temp
     Dim ws As Worksheet
     Dim wsCount As Long

     Set sortedLst = CreateObject("System.Collections.SortedList")

     For Each ws In ThisWorkbook.Worksheets
         NM = ws.Name
         Temp = Left(NM, 1) & Format(Mid(NM, 2, Len(NM) - 2), "00") & Right(NM, 1)

         sortedLst.Add StrConv(Temp, vbNarrow), ws.Name
     Next ws

     wsCount = ThisWorkbook.Worksheets.Count

     For i = 0 To sortedLst.Count - 1
         Worksheets(sortedLst.GetByIndex(i)).Move after:=Worksheets(wsCount) ここ
     Next i
  End Sub
ここというところが黄色くなり 
インデックスが有効範囲にありませんと出ます

(ひろくん) 2021/07/13(火) 22:59


 >またしょうもない回答者と怒られちゃいそうですが
 もこな2さんにそんなこと言った覚えはないです。
 その発言をしたときは「最近増えた回答者の中には」と言うニュアンスがあったはずですが。

 >>シート名に関する情報が不正確すぎます。
 >シート名の状況は、「(ひろくん) 2021/07/06(火) 18:57」を見ればおわかりになるかと。
 一応読んではいますが、そんな危なっかしい命名ルールではいつかミスを犯します。
 いや既に犯しているかも知れない。
 「済みません。そうなってないシートがありました」なんてオチは珍しくもない。
 なので、現物名を出してもらった次第です。

(半平太) 2021/07/13(火) 23:14


 >ここというところが黄色くなり 
 >インデックスが有効範囲にありませんと出ます

 あれれ? そんなこと起こるはずがないと思うんですがねぇ・・

 ちょっと、i、sortedLst.GetByIndex(i) 、WsCount がどうなっているかチェックして頂けませんか?

     For i = 0 To sortedLst.Count - 1
         Debug.Print i, sortedLst.GetByIndex(i) ,wsCount '←ーーーーーーーーーーーーーーー 一行挿入
         Worksheets(sortedLst.GetByIndex(i)).Move after:=Worksheets(wsCount)
     Next i

 あと、イミディエイトウィンドウの最終はどう出ていますか?
 こっちでは、こうなりますが、
         ↓
  30           C11R         32 
  31           C12R         32 

(半平太) 2021/07/13(火) 23:27


  Sub putSheetsInOrder()
     Dim sortedLst As Object
     Dim i, NM, Temp
     Dim ws As Worksheet
     Dim wsCount As Long

     Set sortedLst = CreateObject("System.Collections.SortedList")

     For Each ws In ThisWorkbook.Worksheets
         NM = ws.Name
         Temp = Left(NM, 1) & Format(Mid(NM, 2, Len(NM) - 2), "00") & Right(NM, 1)

         sortedLst.Add StrConv(Temp, vbNarrow), ws.Name
     Next ws

     wsCount = ThisWorkbook.Worksheets.Count

     For i = 0 To sortedLst.Count - 1
   Debug.Print i, sortedLst.GetByIndex(i), wsCount '←ーーーーーーーーーーーーーーー 一行挿入
   Worksheets(sortedLst.GetByIndex(i)).Move after:=Worksheets(wsCount)
     Next i
  End Sub
ですよねぇ
同じところでエラーになります・・・・・・・・・・・・・
(ひろくん) 2021/07/14(水) 19:33

失礼しました エクセルの個人用マクロブックに作ってました
実行するブックにマクロをつくったらできました
個人用マクロブックでできるようにはできないのでしょうか
ちなみに
最後は
 31           C12R         32
でした
(ひろくん) 2021/07/14(水) 19:41

撤退するといっておきながらですが。
>個人用マクロブックでできるようにはできないのでしょうか
できます。

↓について【どのブックの】シートを【どのブックの】シートの後ろに移動させるのか、それぞれブックをきちんと指定すればよいです。

 Worksheets(sortedLst.GetByIndex(i)).Move after:=Worksheets(wsCount)

(もこな2 ) 2021/07/14(水) 20:34


   ActiveWorkbook.Worksheets(sortedLst.GetByIndex(i)).Move after:=ActiveWorkbook.Worksheets(wsCount)
としましたがエラーになりました
(ひろくん) 2021/07/14(水) 20:53

 For Each ws In ThisWorkbook.Worksheets
                ~~~~~~~~~~~~

(ここも) 2021/07/14(水) 21:23


  Sub putSheetsInOrder()
     Dim sortedLst As Object
     Dim i, NM, Temp
     Dim ws As Worksheet
     Dim wsCount As Long

     Set sortedLst = CreateObject("System.Collections.SortedList")

     For Each ws In ActiveWorkbook.Worksheets
         NM = ws.Name
         Temp = Left(NM, 1) & Format(Mid(NM, 2, Len(NM) - 2), "00") & Right(NM, 1)

         sortedLst.Add StrConv(Temp, vbNarrow), ws.Name
     Next ws

     wsCount = ActiveWorkbook.Worksheets.Count

     For i = 0 To sortedLst.Count - 1
   Debug.Print i, sortedLst.GetByIndex(i), wsCount '←ーーーーーーーーーーーーーーー 一行挿入
   ActiveWorkbook.Worksheets(sortedLst.GetByIndex(i)).Move after:=ActiveWorkbook.Worksheets(wsCount)
     Next i
  End Sub

  Sub putSheetsInOrder()
     Dim sortedLst As Object
     Dim i, NM, Temp
     Dim ws As Worksheet
     Dim wsCount As Long

     Set sortedLst = CreateObject("System.Collections.SortedList")

     For Each ws In ActiveWorkbook.Worksheets
         NM = ws.Name
         Temp = Left(NM, 1) & Format(Mid(NM, 2, Len(NM) - 2), "00") & Right(NM, 1)

         sortedLst.Add StrConv(Temp, vbNarrow), ws.Name
     Next ws

     wsCount = ActiveWorkbook.Worksheets.Count

     For i = 0 To sortedLst.Count - 1
   ActiveWorkbook.Worksheets(sortedLst.GetByIndex(i)).Move after:=ActiveWorkbook.Worksheets(wsCount)
     Next i
  End Sub
でできました皆さんありがとうございました
(ひろくん) 2021/07/14(水) 21:58

撤退するといっておきながらですが、多少は研究する気があるようなので提供だけしておきます。
    Sub 二重ループで一度に処理する_その2()
        Dim i As Long, MySTR As Variant

        On Error Resume Next
        With ActiveWorkbook
            For Each MySTR In Split("A,B,C,D", ",")
                For i = 1 To 12
                    .Worksheets(MySTR & i & "R").Move after:=.Worksheets(.Worksheets.Count)
                    .Worksheets(MySTR & StrConv(i, vbWide) & "R").Move after:=.Worksheets(.Worksheets.Count)
                Next i
            Next MySTR
        End With
        On Error GoTo 0

    End Sub
    '------------------------------------------------------------------------
    Sub シート上で並び替えてから反映()
        Dim i As Long

        With Worksheets.Add
            'シートに書き出し
            For i = 1 To Worksheets.Count
                .Cells(i, "A").Value = Worksheets(i).Name

                '▼「■9」で提示の数式でよいはずだが「Formulaプロパティ」に代入するとNameエラーになっちゃうのでとりあえず..
                If Len(Worksheets(i).Name) = 3 Then
                    .Cells(i, "B").Value = Left(Worksheets(i).Name, 1) & "0" & Right(Worksheets(i).Name, 2)
                Else
                    .Cells(i, "B").Value = StrConv(Worksheets(i).Name, vbWide)
                End If
            Next i

            'シート上でシート名を並び替え
            .Range("A:B").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlNo

            '並び替えたシート名の順番にシート自体を並び替える
            For i = 1 To Worksheets.Count
                Worksheets(.Cells(i, "A").Value).Move after:=Worksheets(Worksheets.Count)
            Next i

            '作業用のシート削除する
            Application.DisplayAlerts = False
            .Delete
            Application.DisplayAlerts = True
        End With
    End Sub

(もこな2 ) 2021/07/14(水) 23:28


ありがとうございます勉強します
(ひろくん) 2021/07/15(木) 22:45

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.