Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Access VBA创建和格式化图表宏在Excel中工作,但在Access中不工作_Excel_Ms Access_Vba - Fatal编程技术网

Access VBA创建和格式化图表宏在Excel中工作,但在Access中不工作

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

我在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
    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 Access
ActiveChart
对象,该对象可能是其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
行。再试一次。