Создание диаграммы на одном листе на основе динамического автоматического фильтра на другом листе - возвращение неверного диапазона - PullRequest
0 голосов
/ 05 июня 2019

У меня есть книга Excel с несколькими листами.Первый лист - это панель инструментов, на которой я отображаю диаграммы на основе данных с других листов.У меня есть лист под названием Daily Score.В нем три столбца: ID пользователя, Sum_PointsAdded, Day_Timestamp. В любой день пользователю может быть вставлена ​​строка с добавленными точками и добавленной датой.Строка заголовка начинается с A3 и применяется автофильтр.

На панели инструментов я создал кнопку, которая просит пользователя вставить идентификатор пользователя через поле ввода.Основываясь на этих данных, я фильтрую данные, чтобы показать только оценку этого пользователя.Пример результата может быть следующим:

User ID Sum_PointsAdded Day_Timestamp
777      38                28/3/19
777      11                20/3/19
777      44                2/4/19
777      24                13/5/19

Диаграмма, которую я добавляю, является линейной диаграммой и должна содержать только одну линию (и один тип записи в легенде).Ось X - это дата, а ось Y - это оценка.

Если я вручную использую фильтр на листе «Дневной счет», а затем нажимаю кнопку на листе «Панель инструментов» и запрашиваю фильтр, появляется диаграммаХОРОШО.Однако, если я просто нажму кнопку графика на приборной панели и не возлюсь с фильтром, полученная мной диаграмма будет содержать строку для Sum_PointsAdded и строку для Day_Timestamp (которую я не должен получать) и не будет строки для оценки.Легенда имеет четыре записи: Score, Sum_PointsAdded, Day_Timestamp и Series4

Я предполагаю, что я что-то не так с фильтром или определениями диапазона для диаграммы.Однако у меня есть еще один график на панели инструментов с точно такой же настройкой (только с двумя линиями на графике), и там у меня нет проблем.Я пытался изменить расположение определений диапазона, но это не сработало.Примечание: это динамические диапазоны.Вот мой код:

Public Sub CreateDailyScoreChart()

Dim WS As Worksheet
Dim WS2 As Worksheet
Dim Rng1 As Range
Dim Rng2 As Range
Dim myValue As Variant
Dim LastRow As Long
Dim FirstRow As Long
Application.ScreenUpdating = False

Set WS = ThisWorkbook.Sheets("Daily Score")
Set WS2 = ThisWorkbook.Sheets("Dashboard")

With WS
'set last row for entire table in order to define range
 LastRow = .Range("A" & Rows.Count).End(xlUp).Row
 Set Rng1 = .Range("A3:A" & LastRow)
 Set Rng2 = .Range("C3:C" & LastRow)
End With


'Input UserID
myValue = InputBox("Insert UserID")

'Filter based on UserID, for this month decending
Sheets("Daily Score").Activate
    On Error Resume Next
    ActiveSheet.ShowAllData
    Rng1.CurrentRegion.AutoFilter Field:=1, Criteria1:="=" & myValue


  On Error GoTo 0
With WS.AutoFilter.Sort
.SortFields.Clear
.SortFields.Add2 Key _
        :=Rng2, SortOn:=xlSortOnValues, Order:=xlAscending, _
        DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
Rng2.AutoFilter Field:=3, Criteria1:=13, _
        Operator:=11, Criteria2:=0, SubField:=0

With WS
 FirstRow = .AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Row
'reset last row for filtered table
 LastRow = .Range("A" & Rows.Count).End(xlUp).Row
End With

'Delete existing chart if it exists
On Error Resume Next
With WS2
.ChartObjects("DailyScore").Activate
.ChartObjects("DailyScore").Delete
End With
On Error GoTo 0

'Add new chart
'ThisWorkbook.Sheets("Dashboard").Shapes.AddChart2(322, xlLineMarkers).Select
WS.Activate
WS.Shapes.AddChart2(332, xlLineMarkers).Select


Dim Chart As Chart
Set Chart = ActiveChart


'Defining X and Y Axis values
Dim xRng As Range
Dim vRng1 As Range

With WS

Set xRng = .Range(.Cells(FirstRow, 3), .Cells(LastRow, 3))
Set vRng1 = .Range(.Cells(FirstRow, 2), .Cells(LastRow, 2))

End With


'Adding series 1
Chart.SeriesCollection.NewSeries
Chart.FullSeriesCollection(1).XValues = xRng
Chart.FullSeriesCollection(1).Values = vRng1
Chart.FullSeriesCollection(1).Name = "Score"


Chart.SetElement (msoElementLegendBottom)
Chart.SetElement (msoElementChartTitleAboveChart)
Selection.Caption = "User " & myValue & " Daily Score This Year"
Chart.Parent.Name = "DailyScore"
Chart.ChartArea.Select
Chart.Parent.Cut

Sheets("Dashboard").Select
Sheets("Dashboard").Activate
Range("K20").Select
ActiveSheet.Paste

Application.ScreenUpdating = True

End Sub


1 Ответ

1 голос
/ 06 июня 2019

Запись этого в режиме ответа, чтобы помочь другим: После Set Chart = ActiveChart добавить ActiveChart.ChartArea.ClearContents Содержание диаграммы должно быть очищено, и диаграмма вернется с желаемым результатом после завершения выполнения кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...