Добавление серийной коллекции в диаграмму с помощью UserForm (combobox)
Я изучаю использование VBA для Excel в Excel 2016. На данный момент я работаю над заданием на этом веб-сайте: http://www.homeandlearn.org/vba_charts_and_user_forms.html, в котором я хочу показать график рассеяния одного результатов футбольных команд. Это делается путем выбора команды с помощью combobox в пользовательской форме.
Результат кода (см. Ниже) должен быть диаграммой рассеяния с одной строкой и заголовком, например: http://www.homeandlearn.org/images/vba_charts/chart_arsenal.gif (по какой-либо причине невозможно загрузить его)
Однако это результат моего кода.
- Link Combobox с текстовым полем в vba Excel
- Excel Macro Userform - отдельный код, обрабатывающий несколько флажков
- VBA Excel 2013: назначение значений массива из другой пользовательской формы
- excel vba userforms: пользовательский тип не определен
- Ошибка 381 при создании combobox (2 столбца) пустая
Как возможно, что с тем же кодом, что и на веб-сайте, Диаграмма не может отображать выбранные данные и заголовок? Я также задаюсь вопросом, откуда взялась пятая серия, поскольку у меня только четыре столбца.
Код выглядит следующим образом (и уникален для кода, описанного на веб-сайте):
Private Sub cmdLoad_Click() If cbSelect.Text = "Select a chart" Then MsgBox "Please select a chart" Exit Sub End If Dim MyChart As Chart Dim ChartData As Range Dim ChartIndex As Integer Dim ChartName As String ChartIndex = cbSelect.ListIndex Select Case ChartIndex Case 0 Set ChartData = ActiveSheet.Range("B2:B20") ChartName = ActiveSheet.Range("B1").Value Case 1 Set ChartData = ActiveSheet.Range("C2:C20") ChartName = ActiveSheet.Range("C1").Value Case 2 Set ChartData = ActiveSheet.Range("D2:D20") ChartName = ActiveSheet.Range("D1").Value Case 3 Set ChartData = ActiveSheet.Range("E2:E20") ChartName = ActiveSheet.Range("E1").Value End Select Application.ScreenUpdating = False Set MyChart = ActiveSheet.Shapes.AddChart(xlXYScatterLines).Chart MyChart.SeriesCollection.NewSeries MyChart.SeriesCollection(1).Name = ChartName MyChart.SeriesCollection(1).Values = ChartData MyChart.SeriesCollection(1).XValues = ActiveSheet.Range("A2:A20") 'Save chart as an image, remove the chart, then set updating screen to ON' Dim imageName As String imageName = ThisWorkbook.Path & "\gs16_pictures" & Application.PathSeparator & "TempChart.gif" MyChart.Export Filename:=imageName, FilterName:="GIF" ActiveSheet.ChartObjects(1).Delete Application.ScreenUpdating = True 'Load picture in user form UserForm1.Image1.Picture = LoadPicture(imageName)
cbSelect инициализируется следующим образом
Private Sub UserForm_Initialize() cbSelect.AddItem Range("B1") 'Arsenal cbSelect.AddItem Range("C1") 'Man City cbSelect.AddItem Range("D1") 'Newcastle cbSelect.AddItem Range("E1") 'Cardiff cbSelect.TextAlign = fmTextAlignCenter End Sub
- VBA - Как я могу дать код ошибки на основе суммы моих значений текстового поля в форме пользователя?
- Заполнение вопросов ComboBox - дублирование значений при каждом выборе поля, а именованный диапазон не заполняется
- Как добавить объекты управления в пользовательскую форму в коллекцию, а затем прокрутить коллекцию и получить доступ к их свойствам?
- Как загрузить данные в Excel Userform Listbox из формы Access напрямую?
- Текстовое поле VBA, отображающее валюту
- Excel VBA Userform Listbox Динамическое контекстное меню с использованием метода .OnAction
- Несколько пользователей для пользовательской формы Excel VBA
- Автоматизировать идентификатор с помощью пользовательских записей - Excel
Проблема заключалась в заявлении
Set MyChart = ActiveSheet.Shapes.AddChart(xlXYScatterLines).Chart
Этот оператор автоматически построил всю таблицу данных. Чтобы предотвратить это, необходимо было явно указать SourceData. Ниже приведен код, который вам нужен вместо строк, начинающихся с MyChart.SeriesCollection
With MyChart .SetSourceData Source:=ChartData .HasTitle = True .ChartTitle.Text = ChartName .SeriesCollection(1).XValues = ActiveSheet.Range("A2:A20") End With
Я не уверен, почему существует разница между Excel 2016 и примером с сайта. Возможно, Excel «умнее», чем раньше, и интерпретировал исходные данные.