错误在Excel,VBA(Excel 2010中)设置PlotArea.Width(Error se

2019-07-04 22:09发布

我在子程序中遇到错误尝试设置图表的plotarea.width财产。

如果我注释掉前面的行(多个)其它尺寸也导致此错误。 没有ActiveChart,没有选择等特定错误消息是这样的:“-2147467259(80004005)的方法对象的‘宽度’'PlotArea失败”

这是绊倒我有以下几个原因:

  • 在调试模式下,F8到步骤通过,不会发生该错误的代码。
  • AFAIK“宽度”是不是“方法”,而是一个图表的plotarea的“属性”,所以即使该错误消息是比较模糊。

有什么想法吗? 这里有尽可能多的代码,我可以分享的ChartSizeMedium子程序的全部,以及虚拟片段向您展示如何,我建立图表,并把它传递给该子这台之前传递给另一个函数的大小和其他一些特性,这添加系列数据到图表中。

    Option Explicit
    Private Sub EstablishChartObject()
    Dim cObj as ChartObject
    Set cObj = ActiveSheet.ChartObjects.Add(Left:=30, Top:30, Width:=740, Height:=300)
        ChartSizeMedium cObj.Chart, "Integer", "Example Chart Title"
    End Sub
    Private Sub ChartSizeMedium(cht As Chart, NumType As String, Optional chtTitle As String)
    'Subroutine to make a consistent size chart
    Dim s As Long
    With cht
    'Add a chart title if one exists.
        If Len(chtTitle) > 0 Then
        .HasTitle = True
        .chartTitle.Characters.Text = chtTitle
        End If
    'Create the default chart Legend
        .HasLegend = True
        With .Legend
        .Position = xlTop
        .Font.Size = 11
        .Font.Bold = True
        End With
    'Format the axes
        .Axes(xlValue).MajorGridlines.Format.Line.Visible = msoFalse
        .Axes(xlValue).MinorGridlines.Format.Line.Visible = msoFalse

    'Format the size of the chart
        With .Parent
        .Width = 740
        .Height = 396
        End With

        With .PlotArea
        .Width = 640    '<---- THIS LINE TRIGGERS THE ERROR
        .Height = 280
        .Left = 30
        .Top = 30
        End With
    End With
    'Some charts start with more than one series container, so make sure they're gone:
    With cht
    Do Until .SeriesCollection.Count = 0
    s = .SeriesCollection.Count
    .SeriesCollection(s).Delete
    Loop
    End With
    End Sub

UPDATE 2012年12月12日

我除去所有非有问题的代码,并只使用PlotArea用块,在相同的程序中,我也试图设置图表类型(数值)和示出在该示例中,试图设置之前手动添加一个序列数据的在PlotArea尺寸,但错误依然存在:

Option Explicit
Private Sub EstablishChartObject2()
    Dim cObj As ChartObject
    Dim sh As Worksheet

    Set sh = ActiveSheet
    Dim srs As Series
    Set cObj = sh.ChartObjects.Add(Left:=30, Top:=30, Width:=740, Height:=300)
    Set srs = cObj.Chart.SeriesCollection.NewSeries

    srs.Values = "={1,3,5,7,4}"
    cObj.Chart.ChartType = 57

    With cObj.Chart.PlotArea
        .Width = 100   '<---- THIS LINE TRIGGERS THE ERROR
        .Height = 280
        .Left = 30
        .Top = 30
    End With

End Sub

Answer 1:

两种解决方案,似乎是工作,也不是真的为“优雅”,因为我更喜欢(我希望会有办法与选择图表或任何部分做到这一点)。

选项1 -选择绘图区,然后取消选择它。 这似乎是最可靠/高效的解决方案。

With .PlotArea
    Application.ScreenUpdating = False
   .Select
    With Selection
        .Width = paWidth
        .Height = paHeight
        .Left = paLeft
        .Top = paTop
        ActiveSheet.Range("A1").Activate
    End With
    Application.ScreenUpdating = True
End With

选项2 -禁用错误处理的循环 (这从跟随Doug的链接)。 这似乎不是一个非常可靠的或有效的方法,虽然它似乎工作,我知道这循环中它是在每个属性的它成功地将在随后的传球之前他们未能一次。

With .PlotArea
    For pLoop = 1 To 5
        On Error Resume Next
        .Width = paWidth
        .Height = paHeight
        .Left = paLeft
        .Top = paTop
        On Error GoTo 0
    Next
End With


Answer 2:

我有一个类似的问题。 而它绝对是一个Excel的问题(有2013年)。

With .PlotArea 
    .Select 'err if delete this line of code
    .Top = 0
    .Left = 0
    .width = 40
    .Height = 40 
End With

如果删除了.select线,这将导致对下一行的错误。 请注意,我不与<工作with selection做的东西>。 的.select使得它的工作,而无需使用的选择,至极显然是一个Excel漏洞(以前版本?)



Answer 3:

希望你的表单和图表要得到一个宽度可达能力640 。 如果是这样的尝试明确提及。 也建议你改变width, height值较低值,看看程序如何响应。 既然你说,当你select它的工作原理,

  • 这也意味着,您的cht披着正确的图表对象-除非另有您选择使用图表ActiveChart.PlotArea.Width 。 因此,我想明确提到可以做是一个潜在的尝试。

cht.PlotArea.Width = 640
cht.PlotArea.Height = 280
cht.PlotArea.Left = 30
cht.PlotArea.Top = 30

此外,检查Aspect Ratio锁定或解锁。 如果没有这些作品,然后添加图表到您的工作表,并使用最简单的图表格式代码来检查widht, height, left, top的变化。


更新两个

让我们尝试specifing图表类型,并在第二设置图表对象sub为好。 我在结束试用,它的工作。 试着用以下更改代码。

代码:从调用按钮该子显示的表。

Option Explicit

  Public Sub EstablishChartObject()
  Dim mySheet As Worksheet
  Dim cObj As ChartObject

    Application.ScreenUpdating = False
    Application.StatusBar = "Chart is coming soon..."

    Set mySheet = Sheets(2) '-- set according to yours
    '-- create chart with some source data first, which you can change later
    Set cObj = mySheet.ChartObjects.Add(Left:=30, Top:=30, Width:=400, Height:=200)
    ChartSizeMedium cObj, "Integer", "Example Chart Title"

  End Sub


  'Subroutine to make a consistent size chart
  Private Sub ChartSizeMedium(chtObj As ChartObject, NumType As String, _
                                  Optional chtTitle As String)

  Dim myChart As Chart
  Dim s As Long

     Set myChart = chtObj.Chart '-- specify chart type
     myChart.SetSourceData Source:=Sheets(2).Range("B3:C12")  '-- set to what you have
     myChart.ChartType = xlXYScatterLines  '-- set to the type you want 
                                          'and make sure to **use correct properties**

        With myChart
            If .HasTitle Then
                .ChartTitle.Characters.Text = chtTitle
            End If

            'Create the default chart Legend
            If .HasLegend Then
                With .Legend
                    .Position = xlTop
                    .Font.Size = 11
                    .Font.Bold = True
                End With
            End If

            'Format the axes
            With .Axes(xlValue)
                .HasMajorGridlines = False
            End With

            'Format the size of the chart
            With .Parent
                .Width = 400 '-- change to yours
                .Height = 250 '-- change to yours
            End With

            With .PlotArea
                .Width = 300 '-- change to yours
                .Height = 180 '-- change to yours
                .Left = 30
                .Top = 30
            End With
    End With

    Application.ScreenUpdating = True
    Application.StatusBar = "Chart is Here!"

End Sub

Otput:

确保使用正确的属性为每个图表类型。 请注意,上面的代码并不会从表中删除任何遗留下来的旧图表。

.MajoreGridlines.Format.Lines.Visible失败。 所以设置.MajorGridlines = False ,你不希望显示网格线,以确保。 你还有什么想要做的,可以稍后再进行。 只是改变尝试最初的尺寸。

:从参考MSDN网格线属性



Answer 4:

我知道这是老了,该解决方案似乎不好,但它的工作原理。 我只想到这样做,你提到的是步进通过作品。

Option Explicit

Sub chart()

Dim cObj As ChartObject
Dim sh As Worksheet

Set sh = ActiveSheet
Dim srs As Series
Set cObj = sh.ChartObjects.Add(Left:=30, Top:=30, Width:=740, Height:=300)
cObj.chart.ChartType = 57
Set srs = cObj.chart.SeriesCollection.NewSeries
    srs.Values = "={1,3,5,7,4}"
Application.Wait Now + TimeValue("00:00:01") '<~~ Added This line
With cObj.chart.PlotArea
    .Width = 100
    .Height = 280
    .Left = 30
    .Top = 30
End With
End Sub


Answer 5:

编辑:这似乎是对一些图表类型的工作,但它仍然没有为其他图表类型。 我继续使用带有5倍的环On Error Resume Next ,这似乎是-遗憾的是-最“可靠”的解决方案是最新的。

原文 :这是基于User2140261建议的答复,上面:

https://stackoverflow.com/a/16041640/1467082

由于议题最初发布时,应用程序现在居住在PowerPoint中,所以我不能使用Applicaiton.Wait 。 我有一些间歇性错误有1秒的暂停,3秒太多停顿的,所以我建了以下错误陷阱。 同样的想法可以在Excel中配合使用Application.Wait

非常重要的是要准备给我适合这个代码块,所以我加了这个错误在Powerpoint中处理以模仿Application.Wait

RetryChartDimensions:
On Error GoTo ErrChartDimensions
With .PlotArea
    .Width = paWidth
    .Height = paHeight
    .Left = paLeft
    .Top = paTop
End With
On Error GoTo 0

' More code
' more code

Exit Sub 'gracefully exit this subroutine before the error-handling.'

ErrChartDimensions:
Err.Clear
'Pause before setting the PlotArea dimensions:'
Dim wtTime As Double
Dim startTime As Long

'A maximum 3 second delay should be more than enough time.
If wtTime < 3 Then
    wtTime = wtTime + 0.5
    startTime = Timer
    While Timer < startTime + wtTime
        DoEvents
    Wend
End If
Resume RetryChartDimensions

End Sub


Answer 6:

我没有足够的声誉添加评论,所以使用上述解决方案,我已经固定我的问题在2010年VB.Net和Excel饼图2013年xlLine图表从来没有造成问题,但我的代码会崩溃时相同的代码是撞上了用Excel 2013的xlPie图表(全是在Excel 2007中罚款)。

我现在工作的代码:

    appExcel.Visible = False
    xlchart_for_96_Well_Plate_Source = appExcel.Charts.Add(After:=wkbExperiment_Details.Sheets(wkbExperiment_Details.Sheets.Count))
    appExcel.ScreenUpdating = False

    With xlchart_for_96_Well_Plate_Source
            .SetSourceData(Source:=wksData.Range(wksData.Cells(2, byteCharts_added), wksData.Cells(intUsed_Rows, byteCharts_added)), PlotBy:=Microsoft.Office.Interop.Excel.XlRowCol.xlColumns)
            .ChartType = objChart_Type
            .PlotArea.Select() 
            .PlotArea.Top = 2
            .PlotArea.Select()
            .PlotArea.Left = 2
            .SeriesCollection(.SeriesCollection.count).xvalues = wksData.Range(wksData.Cells(2, 1), wksData.Cells(intUsed_Rows, 1)).Value ' Scale - wavelength for line chart
            .SeriesCollection(.SeriesCollection.count).Values = wksData.Range(wksData.Cells(2, byteCharts_added + 1), wksData.Cells(intUsed_Rows, byteCharts_added + 1)).Value
            .SeriesCollection(.SeriesCollection.count).Name = wksData.Cells(1, .SeriesCollection.count + 1).value
    End With
appExcel.ScreenUpdating = True


文章来源: Error setting PlotArea.Width in Excel, VBA (Excel 2010)