Excel 2010 VBA ActiveChart.SetSourceData 失败

3
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个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年之间注意到的唯一差异。我不确定是否会导致此错误。
我不确定是否错过了任何证据。错误消息没有提供太多细节。是否有其他方法获取更多调试信息?
如果有人能帮助我找到问题并解决问题,我将不胜感激。
提前致谢
编辑1:obj是在另一个程序中创建的,并且DataRange在该程序中得到填充。
Workbooks.Add
MyWorkbook = ActiveWorkbook.Name
Set obj = ActiveWorkbook.Worksheets(1)

然后将数据插入到DataRange单元格中——F2:R2,F3:R3。我可以看到Excel文件显示了正确的数据。
编辑2:上面的子程序中的Workbooks(NewWorkBook)是由这些代码生成的,我可以看到新的带有图表的Excel显示在屏幕上。
Windows(Dir(TemplateFile)).Activate
ActiveWorkbook.Sheets("C1").Select
ActiveWorkbook.Sheets("C1").Copy
NewWorkBook = ActiveWorkbook.Name
Windows(NewWorkBook).Visible = True

编辑3 使用Sid的方法首先声明对象,就像这样 -

使用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年可以。


什么是 obj?什么是 DataRange?另外,您可能希望创建相关对象并与之一起工作,而不是使用 ActiveChart 或 Activesheet。 - Siddharth Rout
尝试声明对象,然后对其进行操作? - Siddharth Rout
如果您需要示例,请告诉我。 - Siddharth Rout
@SiddharthRout,感谢你,Siddharth。我已经将obj创建代码添加到主题底部了。我可以看到数据在Excel文件中显示得很正确,就像我发布的图片之一。 - Don
请看我第一条评论中的第三句话 :) - Siddharth Rout
显示剩余3条评论
3个回答

0

不需要声明额外的变量。这样就可以正常工作:

  With ThisWorkbook

  .Sheets(cstrParamTab).ChartObjects("IntradayChart1").Chart.SetSourceData _
    Source:=.Sheets(cstrChartBaseTab).Range(cstrColTimeStamp & clngTopRow & ":" & cstrColValueClose & plngLastRow), PlotBy:=xlColumns

  End With

定义选项卡和范围的变量是预定义的常量和变量。您可以像这样操作:

With ThisWorkbook

  .Sheets("Parameters").ChartObjects("IntradayChart1").Chart.SetSourceData _
    Source:=.Sheets("ChartBase").Range("B2:B239"), PlotBy:=xlColumns

  End With

但如果你的图表是动态的,这种方法就不起作用了。

祝好运


0

虽然我不完全确定以下是否完全是同样的问题,但我有一种感觉它很接近。

以下对我来说似乎是一个错误 - 为什么ActiveChart支持一个属性,但引用相同图表的对象变量却不支持该属性?

Sub findTheChart()

Dim p_Snapshot As Excel.Workbook
Dim myChartObject As Excel.ChartObject

Set p_Snapshot = Excel.Workbooks("theBookWithTheCharts")

Dim chtName As String
Dim dayNum As Integer
Dim sourceAddress As String
Dim ws As Excel.Worksheet
Dim r As Excel.Range

Set ws = p_Snapshot.Sheets("theSheetWithTheCharts")
sourceAddress = "$AW$69:$BA$84"

For Each myChartObject In ws.ChartObjects
    chtName = myChartObject.Name

    If (chtName = "Chart_nameGiven") Then
        myChartObject.Activate

        Set r = ws.Range(sourceAddress)
        'myChartObject.SetSourceData Source:=r '<<<<<<<<<<<<doesn't work
        Excel.ActiveChart.SetSourceData Source:=r '<<<<<<<<works fine!!!
    End If
Next myChartObject


End Sub

myChartObject是一个ChartObject,而ActiveChart是一个Chart。myChartObject.Chart是相应的Chart。 - Jon Peltier

0

针对上面的评论,这是您应该声明对象并与之交互的方式。您应该避免使用Activesheet/Activeworkbook/ActiveChart...等

您可能还想查看此处

这只是一个示例,请根据您的需求进行修改。

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

谢谢Sid。我已经使用对象声明重写了代码。但是我仍然遇到完全相同的错误。我可以在调试器中看到ws.Range("B2:B3,I2:I3")具有值,而Chrt是一个有效的对象。在Excel 2010调试中,有没有更多的调试信息可以获取? - Don
这里已经是凌晨3点了,我打算去睡觉。我们明天再聊这个问题,我保证会帮你的 :) - Siddharth Rout
可选参数PlotBy怎么样?指定它会有影响吗? - sancho.s ReinstateMonicaCellio
@sancho.s,添加PlotBy没有区别。该参数是可选的。 - Don
@Don:好的,我已经准备好了 :) 让我知道,我们可以解决这个问题 :) - Siddharth Rout
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接