Access VBA创建和格式化图表宏在Excel中工作,但在Access中不工作
我在Access中有一个模块,它可以生成一个新的Excel电子表格,生成一个新表,并将数据从数据库复制到表中。我想用这个表创建一个图表并格式化它。下面是创建图表的子项Access VBA创建和格式化图表宏在Excel中工作,但在Access中不工作,excel,ms-access,vba,Excel,Ms Access,Vba,我在Access中有一个模块,它可以生成一个新的Excel电子表格,生成一个新表,并将数据从数据库复制到表中。我想用这个表创建一个图表并格式化它。下面是创建图表的子项 Dim xlapp as Excel.Application Dim wb as Excel.Workbook Dim ws as Excel.Worksheet Set xlapp = New Excel.Application Set wb = 'created new workbook
Dim xlapp as Excel.Application
Dim wb as Excel.Workbook
Dim ws as Excel.Worksheet
Set xlapp = New Excel.Application
Set wb = 'created new workbook
Set ws = wb.Worksheets(1)
ws.Range("Results_Table[#All]").Select
ws.Shapes.AddChart2(201, xlColumnClustered).Select
ActiveChart.SetSourceData Source:=Range("Results_Table[#All]")
ActiveChart.FullSeriesCollection(1).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(1).AxisGroup = 1
ActiveChart.FullSeriesCollection(2).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(2).AxisGroup = 1
ActiveChart.FullSeriesCollection(3).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(3).AxisGroup = 1
ActiveChart.FullSeriesCollection(4).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(4).AxisGroup = 1
ActiveChart.FullSeriesCollection(5).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(5).AxisGroup = 1
ActiveChart.FullSeriesCollection(6).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(6).AxisGroup = 1
ActiveChart.FullSeriesCollection(7).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(7).AxisGroup = 1
ActiveChart.FullSeriesCollection(8).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(8).AxisGroup = 2
ActiveChart.FullSeriesCollection(9).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(9).AxisGroup = 2
ActiveChart.FullSeriesCollection(10).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(10).AxisGroup = 2
ActiveChart.FullSeriesCollection(11).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(11).AxisGroup = 2
ActiveChart.FullSeriesCollection(12).ChartType = xlColumnStacked
ActiveChart.FullSeriesCollection(12).AxisGroup = 2
ActiveChart.FullSeriesCollection(13).ChartType = xlXYScatterLines
ActiveChart.FullSeriesCollection(13).AxisGroup = 2
ActiveChart.FullSeriesCollection(14).ChartType = xlXYScatter
ActiveChart.FullSeriesCollection(14).AxisGroup = 2
ActiveChart.ChartGroups(2).Overlap = 100
ActiveChart.ChartGroups(2).GapWidth = 475
ActiveChart.ChartGroups(1).GapWidth = 159
在access中,此代码可以成功创建“Column Clustered”类型的图表。然而,仅此而已。下面我尝试将某些部分更改为堆叠的列或散点的所有内容都无效。我可以在所有寄存器的底部放一个print语句,所以我知道代码实际上达到了那个点
我还可以复制并粘贴这个精确的代码(将ws
更改为ActiveSheet
),它工作得非常完美,创建了我想要的图表,并按照预期的格式对其进行了格式化
我不确定为什么这些命令在Excel中有效,但在Access模块中无效。可能活动图表不是您刚才创建的图表?尝试以下方法:
dim chrt as Chart
set chrt = ws.Shapes.AddChart2(201, xlColumnClustered)
chrt.SetSourceData Source:=Range("Results_Table[#All]")
用chrt替换活动图表。本质上,您的问题是在Excel之外访问Excel对象。在MS Office应用程序中,当您不使用命名对象限定方法时,假定您正在访问主机应用程序中的对象。请参见下图中的工作簿对象
Dim xlApp As Excel.Application ' UNNECESSARY IF INSIDE MS EXCEL
Set wb = xlApp.Workbooks.Open(...) ' ASSIGN EXCEL WORKBOOK EXTERNALLY
Set wb = Workbooks.Open(...) ' ASSIGN EXCEL WORKBOOK INTERNALLY
因此,您的ActiveChart
指向MS AccessActiveChart
对象,该对象可能是其OLEDB图表表单/报告对象,或者您的代码出错,但您正在抑制消息(即,错误恢复下一步),因为这听起来不像MS Access对象
但要访问Excel的图表对象,请使用Set
运算符将其分配给定义的对象:
Dim myChart As Object ' LATE BINDING
'Dim myChart As Excel.Chart ' EARLY BINDING
...
ws.Range("Results_Table[#All]").Select
Set myChart = ws.Shapes.AddChart2(201, xlColumnClustered)
myChart.SetSourceData Source:=ws.Range("Results_Table[#All]")
myChart.Select
myChart.FullSeriesCollection(1).ChartType = xlColumnStacked
myChart.FullSeriesCollection(1).AxisGroup = 1
...
或者使用With…End With
块和带循环的干er代码
Dim xlApp As Excel.Application
Dim i As Integer
...
ws.Shapes.AddChart2(201, xlColumnClustered).Select
With xlApp.ActiveChart
.SetSourceData Source:=ws.Range("Results_Table[#All]")
For i = 1 To 14
.FullSeriesCollection(i).ChartType = xlColumnStacked
.FullSeriesCollection(i).AxisGroup = 1
Next i
...
End With
是的,access很可能认为ActiveChart
是access应用程序本身中的活动图表,对象需要显式绑定到excel图表。感谢您的回复。不幸的是,将chrt
声明为Chart
会导致类型不匹配。我试图将其声明为Excel.Chart
,但这也会导致类型不匹配。我假设因为我事先有.Select
行,所以activeChart就是我刚才选择的。无论如何,.SetSourceData
行可以与ActiveChartOK配合使用,我必须承认我对Access对象模型完全不熟悉。看起来确实不支持这些对象。另外,您是否尝试了“dim chrt as Graph.Chart”?请显示sub的dim
行,以便我们可以查看您的Excel对象。此外,我想知道您的错误处理,因为您可能会在下一步的错误恢复中出现抑制信息性错误。请发布一个更完整的代码示例以帮助我们。@Parfait这是整个sub,我在这里没有任何错误处理,因为我喜欢使用调试器指向问题行。我使用全局变量(不好的做法,我知道…),但我会在顶部包含Dim和Set语句。请发布公共子/功能行。我看不出Access如何识别ActiveChart
。您确定这是在MS Access独立模块中还是在Excel中运行?谢谢您的回复。我试图将myChart设置为对象,但在第一行出现错误。fullSeriesCollection行说“对象不支持此属性”,还值得指出的是,如果使用后期绑定访问,您将不知道xlColumnClustered
或xlColumnStapped
的含义。它们需要替换为它们的数字等价物-51和52。要查找数字,只需在Excels即时窗口中键入?xlcolumnstapped
。我错过了.SetSourceData
行。再试一次。