Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5232 / 13644 ツリー ←次へ | 前へ→

【51943】選択した複数のシートをソート 美貴 07/10/12(金) 15:25 質問[未読]
【51947】Re:選択した複数のシートをソート Jaka 07/10/12(金) 16:33 発言[未読]
【51948】Re:選択した複数のシートをソート 美貴 07/10/12(金) 16:41 質問[未読]
【51949】Re:選択した複数のシートをソート Jaka 07/10/12(金) 17:29 発言[未読]
【51993】Re:選択した複数のシートをソート Jaka 07/10/15(月) 9:19 発言[未読]
【51995】Re:選択した複数のシートをソート 美貴 07/10/15(月) 11:11 お礼[未読]
【52009】Re:選択した複数のシートをソート Jaka 07/10/16(火) 9:17 発言[未読]
【51959】Re:選択した複数のシートをソート ichinose 07/10/12(金) 22:41 発言[未読]
【51996】Re:選択した複数のシートをソート 美貴 07/10/15(月) 11:12 お礼[未読]

【51943】選択した複数のシートをソート
質問  美貴  - 07/10/12(金) 15:25 -

引用なし
パスワード
   みなさま、こんにちはー♪
久しぶりの投稿になります。(^。^)
会社の仕事で、うまく行かなくって困っています。
お助け、お願い致します。

ブック内の全シートのソートは、下記コード(某サイトから引用)で
OKなのですが、
選択した複数のシートを対象にソートするには、
どうしたらいいんでしょうか?
ActiveWindow.SelectedSheetsを使用すればできそうなのですが
私のレベルだと、うまくいきません!^^;


Sub シートの並べ替え()
'
Dim ShMax As Integer
Dim MyWS As Object
Dim CurMax As Integer
Dim i As Integer


With ActiveWorkbook

  ShMax = ActiveWorkbook.Sheets.count

  If ShMax = 1 Then Exit Sub

  CurMax = 0
  For Each MyWS In .Worksheets
    CurMax = CurMax + 1
    If CurMax = 1 Then
'      最初の1枚は先頭に。
      MyWS.Move before:=.Sheets(1)
    Else
'      (CurMax - 1)は処理済みシート数を表す。
      For i = 1 To CurMax - 1
'        MyWSより大きな名前の処理済みシートが
'        存在した場合、その直前に移動させる。
        If MyWS.Name < .Sheets(i).Name Then
          MyWS.Move before:=.Sheets(i)
          Exit For
        End If
      Next i
'      MyWSより大きな名前の処理済みシートが存在
'      しなかった(i = CurMaxになっている。)場合、
'      処理済みの直後に移動させる。
      If i = CurMax Then
        MyWS.Move after:=.Sheets(CurMax - 1)
      End If
    End If
  Next
  Sheets(1).Select

End With

End Sub

【51947】Re:選択した複数のシートをソート
発言  Jaka  - 07/10/12(金) 16:33 -

引用なし
パスワード
   ActiveWindow.SelectedSheetsの使い方はこんな感じ。

Dim Ws As Worksheet
For Each Ws In ActiveWindow.SelectedSheets
  MsgBox Ws.Name & " に対してここでソートする。"
Next

【51948】Re:選択した複数のシートをソート
質問  美貴  - 07/10/12(金) 16:41 -

引用なし
パスワード
   ▼Jaka さん:
ありがとうございます。

>  MsgBox Ws.Name & " に対してここでソートする。"
ここの記述がよくわからないんです(>_<)
すみません。


>ActiveWindow.SelectedSheetsの使い方はこんな感じ。
>
>Dim Ws As Worksheet
>For Each Ws In ActiveWindow.SelectedSheets
>  MsgBox Ws.Name & " に対してここでソートする。"
>Next

【51949】Re:選択した複数のシートをソート
発言  Jaka  - 07/10/12(金) 17:29 -

引用なし
パスワード
   すみません。
ソートってセルではなくシートだったんですね。
もう帰るので、他の方が回答してくれると思います・・・・たぶん。

シート名がどうなっているのかとか、選択されたシートだけを対象に並べ替えるのか等も書いておいた方が良いと思います。
昇順?降順?

【51959】Re:選択した複数のシートをソート
発言  ichinose  - 07/10/12(金) 22:41 -

引用なし
パスワード
   こんばんは。

>選択した複数のシートを対象にソートするには、
>どうしたらいいんでしょうか?
>ActiveWindow.SelectedSheetsを使用すればできそうなのですが
>私のレベルだと、うまくいきません!^^;

並べ替えを行いたいシート群を選択した状態で以下のコードを実行して見てください。
但し、並べ替えの判断は、美貴さんが提示されたコードと同じです。

Sub select_sht_sort()
  Dim g0 As Long, g1 As Long
  Dim sht1 As Worksheet
  Dim sht2 As Worksheet
  Dim ix1 As Long, ix2 As Long
  Dim wk As Variant
  ReDim col(1 To Windows(ThisWorkbook.Name).SelectedSheets.Count)
  For g0 = 1 To Windows(ThisWorkbook.Name).SelectedSheets.Count
    col(g0) = Windows(ThisWorkbook.Name).SelectedSheets(g0).Name
    Next
  For g0 = 1 To UBound(col()) - 1
    Set sht1 = Worksheets(col(g0))
    Set sht2 = Worksheets(col(g0 + 1))
    ix1 = sht1.Index
    ix2 = sht2.Index
    If sht1.Name > sht2.Name Then
     If UBound(col()) > ix2 + 1 Then
       sht1.Move before:=Worksheets(ix2 + 1)
     Else
       sht1.Move after:=Worksheets(ix2)
       End If
     sht2.Move before:=Worksheets(ix1)
     wk = col(g0)
     col(g0) = col(g0 + 1)
     col(g0 + 1) = wk
     For g1 = g0 To 2 Step -1
       Set sht1 = Worksheets(col(g1))
       Set sht2 = Worksheets(col(g1 - 1))
       ix1 = sht1.Index
       ix2 = sht2.Index
       If sht1.Name < sht2.Name Then
        wk = col(g1)
        col(g1) = col(g1 - 1)
        col(g1 - 1) = wk
        If UBound(col()) > ix1 + 1 Then
          sht2.Move before:=Worksheets(ix1 + 1)
        Else
          sht2.Move after:=Worksheets(ix1)
          End If
        sht1.Move before:=Worksheets(ix2)
        End If
       Next
     End If
    Next
  Worksheets(col()).Select
End Sub

↑は、バブルソートのアルゴリズムで作成しました。

【51993】Re:選択した複数のシートをソート
発言  Jaka  - 07/10/15(月) 9:19 -

引用なし
パスワード
   すでにichinoseさんからコードの提示があるけど書いてきたので。

Sub main()
Dim tb() As String, Ws As Worksheet, i As Long, ii As Long
Dim Sav As String

AcShNm = ActiveSheet.Name
ReDim tb(1 To 2, 1 To ActiveWindow.SelectedSheets.Count)
Application.ScreenUpdating = False
For Each Ws In ActiveWindow.SelectedSheets
  i = i + 1
  tb(1, i) = Ws.Index
  tb(2, i) = Ws.Name
Next
'昇順バブルソート
For i = 1 To UBound(tb, 2)
  For ii = i To UBound(tb, 2)
    If tb(2, i) > tb(2, ii) Then
      Sav = tb(2, i)
      tb(2, i) = tb(2, ii)
      tb(2, ii) = Sav
    End If
  Next
Next
'選択してあるシートを対象に昇順ソート
For i = 1 To UBound(tb, 2)
  Sheets(tb(2, i)).Move after:=Sheets(Int(tb(1, i)))
Next
'選択シートしてあったシートを選択状態にする
For i = UBound(tb, 2) To 1 Step -1
  Sheets(tb(2, i)).Select 0
Next
Sheets(AcShNm).Activate
Application.ScreenUpdating = False
Erase tb

End Sub

【51995】Re:選択した複数のシートをソート
お礼  美貴  - 07/10/15(月) 11:11 -

引用なし
パスワード
   ▼Jaka さん:

こんにちはー♪
ありがとうございます!!
うまく行きました!

【51996】Re:選択した複数のシートをソート
お礼  美貴  - 07/10/15(月) 11:12 -

引用なし
パスワード
   ▼ichinose さん:

こんにちはー♪
ありがとうございます!!
こちらも
うまく行きました!

【52009】Re:選択した複数のシートをソート
発言  Jaka  - 07/10/16(火) 9:17 -

引用なし
パスワード
   >'選択シートしてあったシートを選択状態にする
>For i = UBound(tb, 2) To 1 Step -1
>  Sheets(tb(2, i)).Select 0
>Next
>Sheets(AcShNm).Activate

↑これより
↓こっちの方がしっくりくるみたいです。

Sheets(AcShNm).Activate
For i = UBound(tb, 2) To 1 Step -1
  Sheets(tb(2, i)).Select 0
Next

最後に選択されているシートが全シート対象とした場合
気に食わないだけなんですけど...。

5232 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free