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) 时出现错误消息 - 在此处输入图像描述

调试器中的 DataRange 是 F2:R2, F3:R3,obj 指向正确的 Excel 表单 - 在此处输入图像描述

ActiveChart 来自模板 - 在此处输入图像描述

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

最重要的是 Excel 2003 可以正常工作。我使用调试器比较 Excel 2003 和 2010 obj 和 ActiveChart。而且我在代码方面找不到太大的不同。我确实看到我的 ActiveChart 模板在 2003 年有点不同 - 在此处输入图像描述

原始模板与 2010 年显示的完全相同,但在 2003 年复制到工作表期间它已自动归零。这是我在 2003 年和 2010 年之间注意到的唯一区别。我不确定是否会导致此错误。

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

如果有人可以帮助我找到问题和解决方法,我将不胜感激。

提前致谢

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

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

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

Edit2 上面子中的 Workbooks(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 年起作用。

4

3 回答 3

0

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

你可能还想看这个

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

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
于 2013-11-14T20:44:14.973 回答
0

不是 100% 以下是完全相同的问题,但我感觉它很接近。

以下对我来说似乎是一个错误 - 为什么会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
于 2014-05-14T16:44:44.990 回答
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

但如果你的图表是动态的,它就不会起作用。

祝你好运

于 2016-07-28T19:15:38.833 回答