vba - Excel 2010 VBA ActiveChart.SetSourceData 失败

标签 vba excel excel-2010

我有一个 Excel VBA 应用程序,该应用程序在 Excel 2003 中运行良好,但在 Excel 2010 中失败。

相关代码为

Public Sub Create_Chart
    Dim c
    Dim OutputText As String
    OutputText = OutputSource
    Workbooks(NewWorkBook).Activate

    With ActiveSheet
        obj.Range(DataRange).NumberFormat = "0.0%"
        ActiveSheet.ChartObjects(1).Activate
        ActiveChart.ChartArea.Select
        ActiveChart.SetSourceData Source:=obj.Range(DataRange)
    End With
End Sub

当调试器使用此窗口点击 ActiveChart.SetSourceData Source:=objNBR.Range(DataRange) 时,会出现错误消息 - enter image description here

调试器中的 DataRange 为 F2:R2、F3:R3,其中 obj 指向正确的 Excel 表单 - enter image description here

ActiveChart 来自模板 - enter image description here

我的调试器显示“ActiveChart.ChartArea.Select”为 true。 ActiveChart 和 obj 是有效对象。

最重要的是 Excel 2003 运行良好。我使用调试器来比较 Excel 2003 和 2010 obj 和 ActiveChart。我在代码方面找不到太大的不同。我确实发现我的 ActiveChart 模板在 2003 年有点不同 - enter image description here

原始模板与 2010 年显示的完全相同,但在复制到 2003 年工作表时已自动清零。这是我在 2003 年和 2010 年之间注意到的唯一差异。我不确定这会导致这个错误。

我不确定我是否遗漏了任何证据。错误消息没有提供太多详细信息。还有其他方法可以获得更多调试信息吗?

如果有人能帮助我找到问题并解决问题,我将不胜感激。

提前致谢

Edit1: obj 在另一个例程中创建,并且 DataRange 在该例程中填充 -

Workbooks.Add
MyWorkbook = ActiveWorkbook.Name
Set obj = ActiveWorkbook.Worksheets(1)

然后将数据插入到 DataRange 单元格 - F2:R2、F3:R3。我可以看到显示正确数据的 Excel 文件。

Edit2 上面子中的工作簿(NewWorkBook)是从这些代码生成的,我可以看到新的 Excel 和图表显示在屏幕上 -

Windows(Dir(TemplateFile)).Activate
ActiveWorkbook.Sheets("C1").Select
ActiveWorkbook.Sheets("C1").Copy
NewWorkBook = ActiveWorkbook.Name
Windows(NewWorkBook).Visible = True

Edit3使用Sid的方式先声明对象这样——

Public Sub Create_Chart()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim objChrt As ChartObject
    Dim Chrt As chart

    Set wb = Workbooks(NewWorkBook)
    Set ws = wb.Sheets(1)

    Set objChrt = ws.ChartObjects(1)
    Set Chrt = objChrt.chart

    With wb
        obj.Range(DataRange).NumberFormat = "0.0%"

        'Chrt.Export ("c:\temp\testChrt.gif")

        'With obj.PageSetup
         '   .PrintArea = DataRange
         '   .Zoom = False
         '   .FitToPagesTall = 1
         '   .FitToPagesWide = 1
         '   .Orientation = xlLandscape
       ' End With

       ' obj.PrintOut Copies:=1

        Chrt.SetSourceData Source:=obj.Range(DataRange)
    End With
End Sub

错误是完全相同的。请注意,我有注释掉的代码来打印并保存 Chrt 和 obj.Range(DataRange) 对象。这些值与上面的图 2 和图 3 相同。所以图表和数据就在那里。我只是想知道为什么“Chrt.SetSourceData Source:=obj.Range(DataRange)”在 2010 年的这种情况下不起作用,但在 2003 年却起作用。

最佳答案

除了上面的评论之外,这是您声明对象并使用它们的方式。您应该避免使用Activesheet/Activeworkbook/ActiveChart...等

您可能还想查看THIS

这只是一个例子。请修改它以满足您的需要。

Public Sub Create_Chart()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim objChrt As ChartObject
    Dim Chrt As Chart

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")

    Set objChrt = ws.ChartObjects(1)
    Set Chrt = objChrt.Chart

    Chrt.SetSourceData Source:=ws.Range("B2:B3,I2:I3")
End Sub

关于vba - Excel 2010 VBA ActiveChart.SetSourceData 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985930/

相关文章:

excel - 如何使每个工作表的被调用单元格唯一?

vba - Excel VBA : How to sum only values larger than a specific value?

excel - 基于现有 VBA 函数将数据验证应用于多个单元格

python - 如何复制 csv 内容并粘贴到 Excel 工作表?

excel - 如何更快地写这个?

excel - 查找下一个可见行

vba - 如何最好地构建 Excel VBA 代码以实现维护、清晰度和错误处理

excel - 在 Excel 表格中返回超过 1 个值(用于计算总路线距离)

workflow - 通过电子邮件有效地向部门分发数据透视图

vba - 我在这个二变量优化程序中遇到溢出问题