2017-02-07 5 views
0

私はワークシートを使っていますが、そこにはコストのリストがあります。ただし、このリストは変更されるので、行数が変化する可能性があります。私の最終的な目標は、このコストリストをソートしてから小計することです。ソートと小計の行数は常に異なるため、ソートと小計を適用するセル範囲を選択するなど、あらかじめ選択されたデータだけで動作するマクロを作成できると考えていました。並べ替えや小計には含めたくない行があるため、アクティブなセルをすべて処理できません。データのソートと小計

データをソートして小計するために以下の単純なマクロを記録しましたが、マクロを記録したときに選択されたセルでのみ動作することに注意してください。誰もがマクロを変更する方法を知っているので、まずマウスでセル範囲を手動で選択してから、あらかじめ選択したデータを自動的にソートして小計をボタンでクリックすることができます。どのような助けを非常に感謝、ありがとう。

Sub Sort_and_Subtotal_CheckBox() 

    ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort.SortFields.Add Key:=Range(_ 
     "B151:B159"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
     xlSortNormal 
    With ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
    Range("B151:K156").Select 
    Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(10), _ 
     Replace:=True, PageBreaks:=False, SummaryBelowData:=True 
End Sub 

答えて

0

このコードを試してください。これにより、入力ボックスを使用して範囲を選択することができます。

Dim SortRng As Range 

Set SortRng = Application.InputBox("Select the range to sort", "Select Range", 0, , , , , 8) 

SortRng.Select 
Selection.Sort Key1:=SortRng, Order1:=xlAscending, Header:=xlGuess, _ 
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ 
DataOption1:=xlSortNormal 
Range("A1").Select 
+0

'Sub Sort_and_Subtotal_CheckBox()'と 'End Sub'を除いてコードを完全に削除し、自分のコードを使用してください。マクロを実行すると、入力ボックスが表示されます。入力ボックスが表示されたら、入力ボックスに範囲を入力するか、クリックしてドラッグして範囲を選択することもできます。 – sn152

+0

データのサンプルと達成しようとしている結果を表示できますか? – sn152

+0

私の答えがあなたを助けたら、それを受け入れることができますか? – sn152

0

選択した範囲を取得したい場合は、単にVBAでSelection.Addressを要求することができます。しかし、これは選択がセルのブロックであると仮定していると考えているので、これは常に望ましい結果を与えるとは限りません(たとえば、複数の選択された範囲の場合)。別の解決策は、コストのリストを表に変換することです。マクロでは、名前付き範囲、つまり新しく作成されたテーブルの列を参照するだけです。テーブルは動的な名前付き範囲として機能し、常にその範囲内の値の範囲をすべて含みます。コストのリストの下にデータが存在しないことが確かな場合、第2の選択肢は、コストのリストが格納されている列内の空ではない最後の行をチェックすることです。 .Cells(.Rows.Count, "A").End(xlUp).Rowのようなもので、リストを含む列の最後の行を取得します。

関連する問題