首页 > 解决方案 > 如何使用来自不同工作表的源创建图表

问题描述

在来问之前我在网上搜索了很多,我找到的答案并没有解决问题。“数据”工作表与“报告”工作表位于同一工作簿中。

在此处输入图像描述

这是我的代码中对这个问题很重要的部分: Private Function CreateChart(ByVal DataRow As Integer, ByVal DataCol As Integer) Dim ChartRowOffset As Integer Charts.Add ActiveChart.ChartType = xlPie ActiveChart.SetSourceData Source:=Sheets("Data").Range(Cells(2, DataCol), Cells(DataRow - 1, DataCol + 1)), PlotBy:=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Report" ActiveChart.HasTitle = True ActiveChart.ChartTitle.Select ActiveChart.ChartTitle.Text = ThisWorkbook.Sheets("Data").Cells(1, DataCol).Value If DataCol > 1 Then ChartRowOffset = (DataCol - 1) * 2 Else ChartRowOffset = 2 End If With ActiveChart.Parent .Top = ThisWorkbook.Sheets("Report").Cells(ChartRowOffset, 1).Top .Left = ThisWorkbook.Sheets("Report").Cells(ChartRowOffset, 1).Left End With End Function

当我尝试从该行的不同工作表中选择源时,我收到错误代码 1004“应用程序定义或对象定义错误”: ActiveChart.SetSourceData Source:=Sheets("Data").Range(Cells(2, DataCol), Cells(DataRow - 1, DataCol + 1)), PlotBy:=xlColumns

如果我在没有 Sheets("Data") 的情况下执行此操作,它不会出错并创建图表,但它会从“Reports”工作表中选择单元格,而不是我需要的 Worksheet。我尝试选择“数据”工作表,激活它,到目前为止没有任何效果。

任何帮助,将不胜感激。

标签: excelvbacharts

解决方案


请尝试以下方法来修复引用样式问题 -

ActiveChart.SetSourceData Source:= _
Sheets("Data").Range(Cells(2, DataCol).Address, Cells(DataRow - 1, DataCol + _
1).Address), PlotBy:=xlColumns

臭名昭著的错误:1004会因为这样的事情而困扰你至死。此外,如果可以的话,如果您在适用的地方使用With语句,您的代码会更快、更短、更易于阅读。

前任:

With ActiveChart
    .Location Where:=xlLocationAsObject, Name:="Report"
    .HasTitle = True
    .ChartTitle.Select
    .ChartTitle.Text = ThisWorkbook.Sheets("Data").Cells(1, DataCol).Value
End WIth

-******更新*******-

测试后,我发现我必须重新设置变量......对我来说似乎很疯狂,但是,测试并为我工作:

Private Function CreateChart()

Dim cht As Chart
Dim rng As Range

Set rng = ThisWorkbook.Worksheets("Sheet1").UsedRange
Set cht = Charts.Add

With cht
    .SetSourceData Source:=rng, PlotBy:=xlColumns
    .ChartType = xlPie
    .Location Where:=xlLocationAsObject, Name:="Sheet1"
End With

Set cht = ActiveChart

With cht
    .HasTitle = True
    .ChartTitle.Text = ThisWorkbook.Sheets(1).Name
End With

End Function

丹尼,

ExcelVBADude


推荐阅读