我在子程序中遇到错误尝试设置图表的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)