自分用メモ2
はい、ブック内の全てのシートのA30にあるセルの数値の大きい順にシートを並べるためのVBAコードを以下に示します。このコードは、シートの名前とA30セルの値をリストに格納し、そのリストを値の大きい順にソートしてシートの順序を変更します。
```vba
Sub SortSheetsByA30()
Dim ws As Worksheet
Dim sheetList As New Collection
Dim i As Long, j As Long
Dim temp As Variant
' シート名とA30の値をコレクションに追加
For Each ws In ThisWorkbook.Worksheets
sheetList.Add Array(ws.Name, ws.Range("A30").Value)
Next ws
' コレクションのソート
For i = 1 To sheetList.Count - 1
For j = i + 1 To sheetList.Count
If sheetList(i)(1) < sheetList(j)(1) Then
temp = sheetList(i)
sheetList(i) = sheetList(j)
sheetList(j) = temp
End If
Next j
Next i
' ソートされた順にシートを並べ替え
For i = 1 To sheetList.Count
ThisWorkbook.Sheets(sheetList(i)(0)).Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Next i
End Sub
```
このコードの動作について簡単に説明します。
1. すべてのシートをループし、シート名とセルA30の値をコレクション(`sheetList`)に追加します。
2. `sheetList`をA30の値に基づいて降順にソートします。
3. ソートされた順序に基づいてシートを並べ替えます。
このコードをエクセルのVBAエディタにコピーして実行すれば、ブック内のシートがA30セルの値の大きい順に並べ替えられます。
セルの値を小さい順に並べ替える場合、ソートの条件を変更するだけで済みます。以下のコードは、セルA30の値を小さい順にシートを並べ替えます。
```vba
Sub SortSheetsByA30Ascending()
Dim ws As Worksheet
Dim sheetList As New Collection
Dim i As Long, j As Long
Dim temp As Variant
' シート名とA30の値をコレクションに追加
For Each ws In ThisWorkbook.Worksheets
sheetList.Add Array(ws.Name, ws.Range("A30").Value)
Next ws
' コレクションのソート
For i = 1 To sheetList.Count - 1
For j = i + 1 To sheetList.Count
If sheetList(i)(1) > sheetList(j)(1) Then
temp = sheetList(i)
sheetList(i) = sheetList(j)
sheetList(j) = temp
End If
Next j
Next i
' ソートされた順にシートを並べ替え
For i = 1 To sheetList.Count
ThisWorkbook.Sheets(sheetList(i)(0)).Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Next i
End Sub
```
この変更により、`If sheetList(i)(1) > sheetList(j)(1) Then` という条件でソートされるようになり、A30の値が小さいシートが前に来るようになります。このコードを実行すれば、シートがA30セルの値の小さい順に並べ替えられます。
はい、2つの条件を組み合わせてシートを並べ替えることもできます。まずA30の値を小さい順に並べ替え、次に同じA30の値を持つシートの中でD6からD26の合計値を大きい順に並べ替えます。以下のコードはその実装例です。
```vba
Sub SortSheetsByA30AndSumD6toD26()
Dim ws As Worksheet
Dim sheetList As New Collection
Dim i As Long, j As Long
Dim temp As Variant
Dim sumRange As Double
' シート名、A30の値、D6からD26の合計値をコレクションに追加
For Each ws In ThisWorkbook.Worksheets
sumRange = Application.WorksheetFunction.Sum(ws.Range("D6:D26"))
sheetList.Add Array(ws.Name, ws.Range("A30").Value, sumRange)
Next ws
' コレクションのソート(A30の値の小さい順、次にD6-D26の合計値の大きい順)
For i = 1 To sheetList.Count - 1
For j = i + 1 To sheetList.Count
If sheetList(i)(1) > sheetList(j)(1) Or (sheetList(i)(1) = sheetList(j)(1) And sheetList(i)(2) < sheetList(j)(2)) Then
temp = sheetList(i)
sheetList(i) = sheetList(j)
sheetList(j) = temp
End If
Next j
Next i
' ソートされた順にシートを並べ替え
For i = 1 To sheetList.Count
ThisWorkbook.Sheets(sheetList(i)(0)).Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Next i
End Sub
```
このコードの動作について説明します。
1. 各シートについて、シート名、A30の値、およびD6からD26の合計値をコレクション(`sheetList`)に追加します。
2. コレクションをソートします。まずA30の値で小さい順にソートし、A30の値が同じ場合はD6からD26の合計値で大きい順にソートします。
3. ソートされた順序に基づいてシートを並べ替えます。
このコードを実行することで、シートがまずA30の値の小さい順に並べ替えられ、その次に同じA30の値を持つシートはD6からD26の合計値の大きい順に並べ替えられます。
頂いたサポートは鶏のささみを買って猫と半分こします!