У меня есть книга 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