
レストランの予約表のメニューと注文数をマクロで並べ替えするため、
エクセル上ではユーザー定義の並べ替えを365日分行っておりました。
マクロ初心者のため、自動記録を使って以下のようなプログラムが書かれたのですが、
1シートに1日分の予約があり、プログラムの中にシート名の記載があります。
このままだと365日分のプログラムを書かなくてならないことになりますが、
それぞれのシートにマクロ実行ボタンを作り、
そのシートごとに並べ替えかできるためには、
この方法しかないのでしょうか?
以下がプログラムの内容です。
Sub hd()
' オーダー並べ替え
Range("E17:Q36").Select
ActiveWorkbook.Worksheets("1月1日").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("1月1日").Sort.SortFields.Add Key:=Range("P17:P36"), _
SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"ハンバーグ,エビフライ,グラタン,オムライス,お子様ランチ,ランチセット", DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("1月1日").Sort.SortFields.Add Key:=Range("Q17:Q36"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("1月1日").Sort
.SetRange Range("E17:Q36")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
No.1ベストアンサー
- 回答日時:
こんにちは。
>1シートに1日分の予約があり、プログラムの中にシート名の記載があります。
私も、昔は、1シートにひとつの処理するマクロを置いていたのですが、ファイルとして大きくなるだけでなく、マクロの修正の時に、本当に大変になってしまいます。ボタンが、ActiveX コントロールというのもいけなかったでした。それで作りなおしました。
マクロのコードのシート名は、ActiveSheet で良いです。
また、データの多い少ないは、大きさを自動で換えられます。
左端の一番上だけは決めてください。以下の場合は、E17 になっています。
ただし、ひとつのブックの中に、シートの365枚は作らないほうがよいです。管理が面倒になってしまいます。
次に、マクロの置く場所は標準モジュールです。
それに、「フォームのボタン」を[SortMacro]で、登録します。
今回は、カスタムオーダーリストを登録するマクロを作りました。以下では、Sheet3のA2から、下に向かって、リストが書かれています。しかし、ソートマクロといっしょに行ったら、ブックがハングしましたので、分離しました。そして、ユーザー登録したリストの削除するマクロも作りました。
実際は、リストは、同じブック内のどこでもよいし、一旦、リストを登録したら、シートに書き込みしたものは、削除しても残ります。
num = Application.CustomListCount
CustomOrder:=num コードの中で、num というのは、最後にカスタムリストを登録した番号のことです。
さて、同じブック内なら、シート全体をコピーして使っても構いません。ボタンの機能も一緒に着いていきます。
なお、マクロを移す時は、シートのコピー->新規ブックでよいのですが、マクロのコード自体は、新しいブックの標準モジュールに貼り付けるか、エクスポート・インポートしてあげればよいです。その時に、フォーム・ボタンの中身のマクロの登録も、新しいブックに登録しなおしてください。マクロで、そういうことも可能ですが、ちょっと大げさですね。
'//
'Option Explicit
Sub SortMacro()
Dim OrderList As Variant
Dim LastCell As Range
Dim Rng As Range
Dim num As Integer
num = Application.CustomListCount
On Error GoTo ErrHandler
With ActiveSheet
With .Range("E17").CurrentRegion
Set LastCell = .Cells(.Cells.Count)
End With
Set Rng = .Range("E17", LastCell)
.Sort.SortFields.Clear
.Sort.SortFields.Add _
Key:=Rng.Columns(12), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
CustomOrder:=num, _
DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=Rng.Columns(13), _
SortOn:=xlSortOnValues, _
Order:=xlDescending, _
DataOption:=xlSortTextAsNumbers
End With
With ActiveSheet.Sort
.SetRange Rng
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ErrHandler:
If Err.Number <> 0 Then
MsgBox Err.Number & ": " & Err.Description
End If
End Sub
Sub ResisterOrderList()
'カスタムリストの登録
Dim num As Integer
Dim myList As Variant
Dim buf As String
On Error Resume Next
With Worksheets("Sheet3")
'(場所は任意)ここでは、Sheet3のA2から一列
Application.AddCustomList .Range("A2", .Cells(Rows.Count, 1).End(xlUp))
End With
If Err() <> 0 Then
num = Application.CustomListCount
myList = Application.GetCustomListContents(num)
buf = Mid(Join(myList, ","), 1, 15)
MsgBox buf & "...." & vbCrLf & _
"すでに登録している可能性があります。", vbExclamation
End If
On Error GoTo 0
End Sub
Sub DeleteCustomOrderList()
'カスタムリストの削除
Dim num As Integer
Dim myList As Variant
Dim buf As String
With Application
On Error Resume Next
num = .CustomListCount
myList = .GetCustomListContents(num)
buf = Mid(Join(myList, ","), 1, 15)
If MsgBox(buf & "...." & vbCrLf & _
"このリストを削除してよろしいですか?", vbOKCancel) = vbOK Then
.DeleteCustomList num
End If
On Error GoTo 0
End With
End Sub
'///

とても細かくご指導いただきまして、感謝の言葉が見つかりません!!!
まだまだ勉強中の身なので、ひとつづつ作っていきたいと思いますが、きちんと理解するまでには時間がかかりそうですので、
まずは取り急ぎお礼を申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel_マクロ_現在開いているシートにマクロを実行したいです 1 2023/02/14 23:54
- Visual Basic(VBA) マクロで最終行を取得してコピーしたい 3 2022/04/06 19:07
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Excel(エクセル) 複数のブックをひとつのブック(複数のシートにまとめる)場合にシートとの順番について 5 2022/12/28 20:47
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WPSOffice_マクロの有効化について
-
複数のマクロボタンをまとめて...
-
Excel マクロの編集がグレーに...
-
エクセルの、記録を終了したマ...
-
Excelのマクロでボタンを押すと...
-
エクセル ボタンに設定したマク...
-
エクセル マクロ名にブック名...
-
エクセルマクロで、別のブック...
-
Excelマクロで、稼働中のマクロ...
-
エクセルで、「いいね」のよう...
-
エクセルの表を複数枚印刷した...
-
エクセルで明日の日付を表示す...
-
(Excel VBA)シートコピー時マ...
-
Excel:マクロを消す方法教えて...
-
マクロ実行ボタンを自動削除したい
-
エクセルでマクロ(Excel 4.0)...
-
LDPlayerのマクロの編集方法を...
-
個人マクロを移動させたい
-
excelのグラフをクリックして最...
-
他のBOOKにマクロを反映させな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WPSOffice_マクロの有効化について
-
Excel マクロの編集がグレーに...
-
複数のマクロボタンをまとめて...
-
エクセル ボタンに設定したマク...
-
エクセルでマクロ(Excel 4.0)...
-
エクセル マクロ名にブック名...
-
Excelのマクロでボタンを押すと...
-
Excelマクロで、稼働中のマクロ...
-
エクセルの、記録を終了したマ...
-
エクセルで、「いいね」のよう...
-
エクセルの表を複数枚印刷した...
-
エクセルマクロで、別のブック...
-
LDPlayerのマクロの編集方法を...
-
(Excel VBA)シートコピー時マ...
-
Excelのマクロ名の並び順の法則...
-
マクロをマクロを使ってコピー...
-
エクセルで明日の日付を表示す...
-
Excelマクロをバックグラウンド...
-
Ctrl+Zが使えない
-
マクロ実行ボタンを自動削除したい
おすすめ情報