【问题标题】:Access VBA Creating and formatting chart macro works in Excel but not in AccessAccess VBA 创建和格式化图表宏在 Excel 中有效,但在 Access 中无效
【发布时间】:2018-06-13 19:38:56
【问题描述】:

我在 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

在访问中,这段代码可以成功创建一个'Column Clustered'类型的图表。然而,仅此而已。我尝试将某些部分更改为堆叠的列或散点图的下方的所有内容均无济于事。我可以在所有寄存器的底部放一个打印语句,所以我知道代码实际上到达了那个点。

我还可以复制并粘贴这个确切的代码(将 ws 更改为 ActiveSheet),它可以完美地创建我想要的图表并完全按照它应该的方式进行格式化。

我不确定为什么这些命令在 Excel 中有效,但在 Access 模块中无效。

【问题讨论】:

  • 请显示 sub 的 Dim 行,以便我们查看您的 Excel 对象。
  • 另外,我想知道您的错误处理,因为您可能有一个 On Error Resume Next 抑制信息错误。请发布更完整的代码示例以供我们帮助。
  • @Parfait 这是整个 sub,我在这里没有任何错误处理,因为我喜欢使用调试器来指向问题行。我使用全局变量(不好的做法,我知道...),但我会在顶部包含 Dim 和 Set 语句。
  • 请张贴公共子/功能行。我看不到 Access 如何识别 ActiveChart。您确定这是在 MS Access 独立模块中还是在 Excel 中运行?

标签: excel ms-access vba


【解决方案1】:

也许活动图表不是您刚刚创建的图表?尝试类似:

dim chrt as Chart
set chrt = ws.Shapes.AddChart2(201, xlColumnClustered)
chrt.SetSourceData Source:=Range("Results_Table[#All]")

用 chrt 替换活动图表。

【讨论】:

  • 是的,access 很可能认为ActiveChart 是access 应用程序本身中的活动图表,并且该对象需要明确绑定到excel 图表。
  • 感谢您的回复。不幸的是,将chrt 声明为Chart 会导致类型不匹配。我试图将其声明为Excel.Chart,但这也会导致类型不匹配。我曾假设,因为我事先有 .Select 行,所以 activeChart 将是我刚刚选择的那个。无论如何,.SetSourceData 行与 ActiveChart 一起使用
  • 好吧,我必须承认我完全不熟悉 Access 对象模型。似乎不支持这些对象。另外,您是否尝试过“dim chrt as Graph.Chart”?
【解决方案2】:

本质上,您的问题是在 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 图表表单/报告对象,或者您的代码 is 出错,但您正在抑制消息 (即On Error Resume Next),因为这听起来不像是 MS Access 对象。

但要访问 Excel 的 Chart 对象,请将其分配给使用 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 块和带有循环的 DRY-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

【讨论】:

  • 感谢您的回复冻糕。我试图将 myChart 设置为一个对象,但是在第一个 .fullSeriesCollection 行上抛出了一个错误,说“对象不支持这个属性”
  • 另外值得指出的是,如果您使用的是后期绑定,Access 将不知道xlColumnClusteredxlColumnStacked 是什么意思。他们需要替换为对应的数字 - 51 和 52。要查找数字,只需在 Excel 即时窗口中键入 ?xlColumnStacked
  • 我错过了.SetSourceData 行。再试一次。
猜你喜欢
  • 2016-01-14
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2021-09-14
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
相关资源
最近更新 更多