« シートを移動して並び替える1 | トップページ | 日付か時刻かの判別2 »

2011年4月10日 (日)

シートを移動して並び替える2

前の記事に続いて
シートの並び替えをします。

今回は「CodeName」で並び替えます。

名前で並び替える方法と
大体は同じですが、
シートを入れ替える箇所で少し変更があります。

シートのCodeNameを配列に入れて、
その配列を並び替えるまでは同じような流れです。

CodeNameでシートを指定するために
Object型の変数を使用します。

もしCodeNameが○○なら
そのシートをObject型の変数obj1に入れる。
このように指定したシートを入れたobj1とobj2を準備します。

これを使ってシートを入れ替えるコードは
次のようになります。

obj1.Move Bofore:=obj2

このコードは
obj1に入れたシートを
obj2に入れたシートの前(左)に移動します。

以上説明した変更箇所は
次のコードのFor Eachステートメント中や直後です。
注意してみてください。

コードはこちら

シートの並び替えをするコード:

Sub macro110410a()
'シートの並び替え
'CodeName順

    Dim i As Integer
    Dim strShname() As Variant
    ReDim strShname(Sheets.Count)
   
    '配列に名前を入れる
    For i = 1 To Sheets.Count
        strShname(i) = Sheets(i).CodeName
    Next i
   
    '配列を並び替える(昇順)
    Call BubbleSort2(strShname, 0)
   
    'シートの入れ替え
    '配列の最初から順番に左からシートを並べる
    Dim obj1 As Object, obj2 As Object
    For i = 2 To Sheets.Count
        For Each sh In Sheets
            If sh.CodeName = strShname(i) Then
                Set obj1 = sh
            ElseIf sh.CodeName = strShname(i - 1) Then
                Set obj2 = sh
            End If
        Next sh
        obj1.Move before:=obj2
    Next i

End Sub

さてCodeNameでシートを並び替えると、
シートを挿入した順に並び替えられます。
ただし、シートを削除したことがないワークブックのみです。
理由は以下の通りです。

CodeNameはシートが挿入された順番に
1、2、3、4、5のように番号が振られます。
(CodeNameはSheet1、Sheet2のようになりますが番号だけに省略します。)

例えば3のシートを削除したとします。
次にシートが挿入されるとCodeNameは6になります。
ここではまだ挿入した順になっています。

さて少し前に戻って
3のシートを削除して一旦ワークブックを閉じます。
再度ワークブックを開いてからシートを挿入すると、
このシートのCodeNameは3になります。
もう一枚シートを挿入するとCodeNameは6になります。
この場合は、シートは挿入順ではなくなりました。

以上の例のように
シートを削除したことがあり、
ワークブックを閉じたことがあるワークブックは
CodeNameがシートの挿入した順番になっていない可能性が高いです。

|

« シートを移動して並び替える1 | トップページ | 日付か時刻かの判別2 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: シートを移動して並び替える2:

« シートを移動して並び替える1 | トップページ | 日付か時刻かの判別2 »