Excel VBA: как отсортировать данные на одном листе перед созданием диаграммы на другом листе? - PullRequest
0 голосов
/ 24 апреля 2018

VBA: я пытаюсь заполнить гистограммы на основном листе на основе данных, которые содержатся на отдельном листе. Однако мне нужно получить vba для сортировки данных в порядке убывания перед заполнением диаграммы.

У меня есть макросы для заполнения таблиц лиг на ежегодной основе, однако каждый раз, когда я запускаю макрос для выбранного года, гистограмма генерируется без сортировки данных в порядке убывания. Когда я пытаюсь включить код для сортировки данных, я обычно получаю ошибку времени выполнения 91.

Вот мой текущий код - кто-нибудь может мне помочь? Это мой первый раз, используя VBA. В идеале я хотел бы отсортировать данные в столбце N перед созданием диаграммы. Благодарю.

Sub NewIssues2014()

Dim sht As Worksheet
Dim dashboard As Worksheet

Set sht = Worksheets("New Issues League Table")
Set dashboard = Worksheets("Dashboard")
ArrangerLastRow = sht.Cells(Rows.Count, 12).End(xlUp).Row
YearLastRow = sht.Cells(Rows.Count, 14).End(xlUp).Row

Sheets("New Issues League Table").Select
Range("M1:S1").Select
Selection.AutoFilter
ActiveWorkbook.Worksheets("New Issues League Table").AutoFilter.Sort.SortFields _
    .Clear
ActiveWorkbook.Worksheets("New Issues League Table").AutoFilter.Sort.SortFields _
    .Add Key:=Range("N1"), SortOn:=xlSortOnValues, Order:=xlDescending, _
    DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("New Issues League Table").AutoFilter.Sort
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

With dashboard
dashboard.Shapes.AddChart.Select
ActiveChart.ChartType = xlBarStacked
ActiveChart.SetSourceData Source:=sht.Range("L2:L" & ArrangerLastRow & ",N2:N" & YearLastRow), PlotBy:=xlColumns
ActiveChart.Axes(xlCategory).Select
ActiveChart.Axes(xlCategory).ReversePlotOrder = True
ActiveChart.Axes(xlCategory).Crosses = xlMaximum
ActiveChart.HasTitle = True
ActiveChart.HasLegend = False
ActiveChart.ChartTitle.Text = "2014 New Issue Deals"
End With

With ActiveChart.Parent
.Height = 325
.Width = 900
.Top = 1070
.Left = Range("B94").Left
End With

End Sub

1 Ответ

0 голосов
/ 25 апреля 2018

Автофильтр отлично работает при непосредственном использовании, но выглядит довольно обидно при управлении через VBA.Проверьте https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-sort-method-excel

Чтобы использовать стандартную функцию сортировки, вам просто нужно удалить «Автофильтр» из всего, и быть более точным с вашими диапазонами:

Sheets("New Issues League Table").Select
Range("M1:Sx").Select 'Replace x with the last row in your table
ActiveWorkbook.Worksheets("New Issues League Table").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("New Issues League Table").Sort.SortFields _
    .Add Key:=Range("N1:Nx"), SortOn:=xlSortOnValues, Order:=xlDescending, _
    DataOption:=xlSortNormal  'Again, replace x with the last row in your table
With ActiveWorkbook.Worksheets("New Issues League Table").Sort
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

РЕДАКТИРОВАТЬ:Ответ на комментарий-- Ваше заявление With немного отклонено.Вы открываете это, но затем фактически не используете это.Также разумно избегать использования функции .Select в максимально возможной степени - это на самом деле не нужно в большинстве ситуаций.Это было бы лучше:

dashboard.Shapes.AddChart
With ActiveChart
    .ChartType = xlBarStacked
    .SetSourceData Source:=sht.Range("L2:L" & ArrangerLastRow & ",N2:N" & YearLastRow), PlotBy:=xlColumns
    .Axes(xlCategory).Select
    .Axes(xlCategory).ReversePlotOrder = True
    .Axes(xlCategory).Crosses = xlMaximum
    .HasTitle = True
    .HasLegend = False
    .ChartTitle.Text = "2014 New Issue Deals"
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...