我正在尝试使用vba保存excel图表作为图像。使用整个代码,我调用几个工作簿,查找所有工作表并保存所有图表。以下代码适用于Excel 2007和2010(但由于+ 4,有一个水平线和垂直线可见)。如果我将Round(shp.Width + 4,0)更改为Round(shp.Width,0),我在2010年会遇到以下错误(但不会在2007年):
运行时错误'-2147467259(80004005)': 指定的维度对当前图表类型无效。
Dim shp As Shape
Dim sht As Worksheet
Set sht = Application.ActiveWorkbook.Sheets(shtName)
Set shp = sht.Shapes(chrtName)
shp.CopyPicture xlScreen, xlBitmap
Dim objChart As ChartObject
Set objChart = sht.ChartObjects.Add(200, 200, Round(shp.Width + 4, 0), Round(shp.Height + 4, 0))
objChart.Activate
ActiveChart.Paste
ActiveChart.Export Filename:=fullPath, Filtername:=Right(fullPath, 3)
objChart.Delete
有人知道如何避免使用+4吗?
我发现了以下内容:
“只要将默认图表类型设置为其他图表类型而不是您尝试创建的图表类型,就会出现问题。例如,如果您尝试创建折线图,并且Excel中的默认图表是OHLC(烛台股票)图表)然后Excel将很快抱怨“指定的维度对当前图表类型无效”。即使您尝试从VB.NET创建图表也会出现相同的情况。因此,首先将默认图表类型更改为某些基本图表类型如折线图。问题将得到解决。“ http://www.excelbanter.com/showthread.php?t=204071
但我不知道如何使用VBA执行此操作。
答案 0 :(得分:1)
好久不回答。
你需要做两件事。首先,确保没有选择任何数据,或者Excel可能会尝试将其放入您正在创建的图表中。
插入此块
Dim rngTmp as range
If Typename(Selection) = "Range" then
Set rngTmp = selection
End If
With ActiveSheet
.Range("A1").Offset(.Rows.Count - 1).Select
End With
行前
Set objChart = sht.ChartObjects.Add(...)
并在上面的行
之后插入以下内容ObjChart.Chart.ChartType = xlLine ' or another "safe" chart type
If Not rngTmp is Nothing then
rngTmp.select
End If
严格地说,如果您不向图表添加数据,则无需更改图表类型,但为了OCD,最好完成。
答案 1 :(得分:1)
使用
Set objChart = Worksheet.Shapes.AddChart2().Chart.Parent
而不是
Set objChart = Worksheet.ChartObjects.Add()
前一个函数允许您在第二个参数中指定基本图表类型。
答案 2 :(得分:1)
我有同样的例外。我将问题追溯到保存路径。
如果保存路径错误,或指定的路径不存在,则将引发此异常。检查以确保路径存在。