Excel VBA粘贴的图表与源图表不同

时间:2019-05-12 20:10:54

标签: excel vba

当复制由我的宏生成的图表并粘贴为图片时(为了避免在滚动时涉及大量数据点时渲染图表),图表的粘贴图片不会显示相同的数据。

我是excel vba的新手,所以我可能在这里做错了...

在excel中,我尝试右键单击图表并粘贴为图片,并收到相同的问题。我认为我正在使用的数据量(〜11k个数据点)可能会有限制,但是由于我没有收到错误,所以我不确定。

我尝试了不同的方法在excel vba中复制图表(chartarea.copy,chart.copypicture),但没有成功。

这是感兴趣的代码的一部分。...

'This is a small snippet of a much larger range of code, certain ranges/variables are defined earlier


Set localDate = Sheets(1).Range("A2:A" & lastRow)
Set plasmaNaVisRange = plasmaNaRange.SpecialCells(xlCellTypeVisible)
Set plasmaNaChart = Sheets(4).Shapes.AddChart.Chart

'Clears automatic charting done on source sheet
plasmaNaChart.ChartArea.ClearContents

With plasmaNaChart
  .ChartType = xlXYScatter
  .SetSourceData Source:=Range(localDate, plasmaNaVisRange),     PlotBy:=xlColumns
  .SetElement (msoElementChartTitleAboveChart)
  .ChartTitle.Text = "Plasma"
  .Parent.Height = 276
  .Parent.Width = 466
  .Axes(xlCategory).TickLabels.Orientation = 45
End With

'Forces correct assignment of axes
With plasmaNaChart.SeriesCollection(1)
   .XValues = localDate
   .Values = plasmaNaVisRange
   .Name = "Na"
End With

'Everything appears correct up to this point and chart displays as     corrected

plasmaNaChart.ChartArea.Copy

Sheets(4).Range("B36").Select
Sheets(4).Pictures.Paste
plasmaNaChart.Parent.Delete

在原始图表上,我看到了所有带有正确轴的数据点(y轴范围在0-160之间,x轴正确列出了日期)。在粘贴的图表上,我没有Y值,在粘贴它时也确认了同样多的内容,但没有发现y系列中的任何内容。而且我的x轴完全弄乱了,日期范围从1/0/1900到11/21/2036

1 个答案:

答案 0 :(得分:0)

解决了!通过设法解决我的问题,我设法绕过了这个问题。这是根本原因...

数据点的数量并不是我最初怀疑的问题,而是我试图绘制的数据范围太复杂了。通过自动筛选器分解了超过1万个数据点,该数据系列是对工作表的引用和PlasmaNaVisRange = PlasmaNaRange.SpecialCells(xlCellTypeVisible)创建的各个范围的巨大混乱。

相反,我坚持使用基本范围(PlasmaNaRange),这是我尝试提取并绘制图表的过滤列。使用chart.PlotVisibleOnly = true方法,我能够首先绘制基本范围的图表,然后仅绘制可见数据点,从而避免图表过于复杂。修改后的代码看起来像这样...

Set localDate = Sheets(1).Range("A2:A" & lastRow)
Set plasmaNaChart = Sheets(4).Shapes.AddChart.Chart

'Clears automatic charting done on source sheet
plasmaNaChart.ChartArea.ClearContents

With plasmaNaChart
   .ChartType = xlXYScatter
   .SetSourceData Source:=Range(localDate, plasmaNaRange), PlotBy:=xlColumns
   .SetElement (msoElementChartTitleAboveChart)
   .ChartTitle.Text = "Plasma"
   .Parent.Height = 276
   .Parent.Width = 466
   .PlotVisibleOnly = True         'Saves me from creating a filtered variable with a complex data series
   .Axes(xlCategory).TickLabels.Orientation = 45
End With

'Forces correct assignment of axes
With plasmaNaChart.SeriesCollection(1)
   .XValues = localDate
   .Values = plasmaNaRange
   .Name = "Na"
End With