プロが教える店舗&オフィスのセキュリティ対策術

Excel 2016を使用しています。
現在、利用予定表を作成しております。
下記のような表(画像参照)があり地域毎に並び替えを一気にしたいのですが可能でしょうか。

カレンダー形式にしており
A列,D列,G列…(3行毎) に通し番号
B列,E列,H列…(3行毎) に名前
C列,F列,I列…(3行毎)  に地域

これが31日分カレンダー形式で作っています。

通し番号はそのままで
日付のグループ?ごとに
地域順に並び替えをしたいのですがマクロで可能でしょうか。
その地域がまとまってくれればいいのでフリガナ等は考慮しなくて大丈夫です。

B5:C9の範囲ひとつでならマクロで並び替えできたのですが
どうしても複数となるとわからなくなってしまいました。

乱文で申し訳ありませんがよろしくおねがいいたします。

「Excel VBA マクロ 複数範囲を並」の質問画像

A 回答 (5件)

任意の地域順で並べられるように書いてみました。




Sub test()


Range("B5").Select

Dim i As Integer '下方向への繰り返し
Dim x As Integer '右方向への繰り返し

For i = 1 To 5 '5週分繰り返す
   For x = 1 To 7 '7日分繰り返す
    If ActiveCell.Value <> "" Then 'データが入っていなければ次に
     With ActiveSheet.Sort
       .SortFields.Clear
       .SortFields.Add Key:=ActiveCell.Offset(0, 1), CustomOrder:="東京, 大阪, 福岡, 京都, 愛知"
       .SetRange ActiveCell.Resize(5, 2)
       .Header = xlNo
       .Orientation = xlTopToBottom
       .Apply
     End With
    End If
    ActiveCell.Offset(0, 3).Select
   Next x
   ActiveCell.Offset(7, 0 - (3 * (x - 1))).Select
 Next i
 Range("B5").Select
 MsgBox ("地域の並べ替えが終わりました")

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます!今後並べ替えの順序も必要になってきそうなのでそのとき使わせていただきます!

お礼日時:2019/04/27 16:44

こんにちは!



横からお邪魔します。
お示しの画像の配置で列方向には7日分、行方向には1か月の最終日まであるとしての一例です。
尚、①~⑤に関しては並び替えはしなくてよいのですよね。
一例です。

Sub Sample1()
 Dim i As Long, j As Long
 Dim myRng As Range
  For i = 5 To Cells(Rows.Count, "B").End(xlUp).Row Step 7 '//←B列5行目~B列最終行まで7行おき★//
   For j = 2 To Cells(i, Columns.Count).End(xlToLeft).Column Step 3 '//←B列~最終列まで3列おき★//
    If Cells(i, j) <> "" Then
     Set myRng = Cells(i, j).Resize(5, 2)
      myRng.Sort key1:=myRng(2), order1:=xlAscending, Header:=xlNo
    End If
   Next j
  Next i
   MsgBox "完了"
End Sub

※ 都道府県?の昇順で並び替えを行っていますので、
お示しの画像だと「福岡」が最後の方にかまとまってしまいます。

コード内の
>xlAscending

>xlDescending
にすれば降順になりますので、福岡が上の方にまとまりますね。

昇順・降順は好みで変更してみてください。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございました!
こちらでなんとかいけそうです!!助かりました!

お礼日時:2019/04/27 16:44

なんどもごめんなさい。



、「 Range("A5:C9") のA5を ”A1セル” に見立てるので、C9セルは " C1 ” たことになる」というような意味になります。

も間違いで、正しくは、


、「 Range("A5:C9") のA5を ”A1セル” に見立てるので、C5セルを " C1 ” に見立てたことになる・・・(C9はC5に見立てたことになる」というような意味になります。

でした。

教えてGooって投稿を書き直せないのかしら・・・。すみません。
    • good
    • 0
この回答へのお礼

何度もありがとうございます!!わかりやすく説明していただき感謝しかありません。
もう少しいろいろがんばってみます。

お礼日時:2019/04/27 16:45

すみません。


変数設定の

Dim i_tate As Integer

のあとに

Dim i As Integer
Dim j As Integer

が抜けてましたので追記してください。

あと冒頭、「某」ではなく、」「私」でした。
    • good
    • 0

某も初心者なので、古いやり方でしかもダサいコードですみませんが、例えば以下のような感じではどうでしょうか?



全バージョンで使える「Range.Sortメソッド」を使っています。
「ユーザー設定リスト」で設定した並べ替えを適用したかったら、
「Order1:=xlAscending」
の後ろに、
「, OrderCustom:=13」
をくっつけるみたいです。
(13はいくつめの設定かによって数字が変わるようです。)
詳しくは
http://officetanaka.net/excel/vba/tips/tips148.htm
などもご参考に。

なお、「o_Rng01.Range("C1")」は「Range.Rangeプロパティ」ですが、
「Range("A5:C9").Range("C1")」といったような意味合いですが、
この場合ですと、「 Range("A5:C9") のA5を ”A1セル” に見立てるので、C9セルは " C1 ” たことになる」というような意味になります。
なので、相対的な感じのセルの指定になります。(説明下手ですみません。)
よって、並べ替えしたいセル範囲がズレていっても、常に、「3列目の1行目を並べ替えのセルの基準にしている」という意味になります。

2007以降は、「Range.Sortメソッド」での並べ替えのほかに、上記サイトにもあるとおり、「Sortオブジェクト」(Worksheet.Sort?)が使えます。

なお、下記コードをもしお試しになるなら、必ずファイルのバックアップをとってからにしてください。(データをめちゃくちゃにしてしまうといけませんので・・・)


Sub test()

Dim o_Rng01 As Range
Dim i_yoko As Integer
Dim i_tate As Integer

i_yoko = 0
i_tate = 0

For i = 1 To 5 '縦のループ(週単位)

For j = 1 To 7 '横のループ(日単位)

Set o_Rng01 = Range(Cells(5 + i_tate, 1 + i_yoko), Cells(9 + i_tate, 3 + i_yoko))

'並べ替えしたいキーの列が空白だったら、プログラムを終わる。
If o_Rng01.Range("C1") = "" Then Exit Sub

o_Rng01.Sort Key1:=o_Rng01.Range("C1"), Order1:=xlAscending

Set o_Rng01 = Nothing
i_yoko = i_yoko + 3

Next j

i_yoko = 0
i_tate = i_tate + 7

Next i



End Sub
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!