我正在做一个导出工作表中所有图表的宏,然后打开Outlook并附加它们。但是,我注意到,有几次图表会导出但是为0KB(文件已创建,但图像无法看到)
但并非所有图表都会发生。只是大部分时间,有时候,它们都会毫无问题地生成它们。 (当我逐步执行代码时,所有图表生成都没有问题,也是在执行一步一步后,然后我正常执行它并生成所有图表,但如果我关闭并重新打开工作簿,它会给出同样的问题,只生成两个,其余的都是空文件)
以下是代码:
Dim sheetNumber, Size, i As Integer
Dim chartNames(), FNames() As String
Dim objChrt As ChartObject
Dim myChart As Chart
'Activate Charts Sheet
Sheets("GRAFICAS").Activate
'Calculate Number of Charts in Sheet
Dim chartNumber
chartNumber = ActiveSheet.ChartObjects.Count
'Redimension Arrays to fit all Chart Export Names
ReDim chartNames(chartNumber)
ReDim FNames(chartNumber)
'Loops through all the charts in the GRAFICAS sheet
For i = 1 To chartNumber
'Select chart with index i
Set objChrt = ActiveSheet.ChartObjects(i)
Set myChart = objChrt.Chart
'Generate a name for the chart
chartNames(i) = "myChart" & i & ".png"
On Error Resume Next
Kill ThisWorkbook.Path & "\" & chartNames(i)
On Error GoTo 0
'Export Chart
myChart.Export FileName:=Environ$("TEMP") & "\" & chartNames(i), Filtername:="PNG"
'Save path to exported chart
FNames(i) = Environ$("TEMP") & "\" & chartNames(i)
Next i
我错过了什么?
答案 0 :(得分:5)
事实证明,对于Excel 2010-2013用户来说,这是一个随机错误。 然而,经过一些更多的谷歌搜索。我遇到了答案here
你只需要添加
continue n
选择图表后。所以 在我的例子中,最终代码如下所示:
objChrt.Activate
答案 1 :(得分:1)
经过一些头部刮擦之后,似乎要导出的图表需要位于嵌入该图表的工作表的可见区域内。工作表不必是可见的,但如果嵌入图表的工作表是ActiveSheet,则图表必须在可见的区域内。否则,将写入空文件。
答案 2 :(得分:0)
我和许多其他用户一样,经历过同样的问题。 经过多次试验,一些googleing,我发现EXCEL对图表的可见性,位置,大小都很敏感。 所以我想,从你的例子来看,屏幕上只能看到Mychart6和Mychart7。
下面我把我今天使用的代码用于非常类似的任务。到目前为止,没有任何问题。它是如何工作的: 在sheet33中的所有图表中循环 移动图表,将topleft corner重叠到单元格B2的topleft corner(应该是可见的) 出口图表 回到原来的位置 范围B2:G13已被设置为范围对象,以便在需要时允许我管理不同维度的图表(设置。图表的高度和.width属性与B2范围相同的属性:G12)
Sub export_kpi()
On Error Resume Next
Dim pd As String
Dim ob As ChartObject
Dim intervallo_riferimento As Range
Dim temp_top As Double
Dim temp_left As Double
Set intervallo_riferimento = Sheet33.Range("B2:G13")
pd = "//best-collab.st.com/ws/PC_R2/images1/kp"
For Each ob In Sheet33.ChartObjects
temp_top = ob.Top
temp_left = ob.Left
ob.Top = intervallo_riferimento.Top
ob.Left = intervallo_riferimento.Left
ob.Chart.Export pd & ob.Index & ".jpg", "jpg"
ob.Top = temp_top
ob.Left = temp_left
Next ob
ExportImage Sheet33.Range("B27:G38"), pd & "0.jpg"
End Sub
答案 3 :(得分:0)
使用C#中的Office 2016和Office 365,函数“ Activate()”也解决了相同的问题:
Excel.ChartObjects xlCharts = Excel.ChartObjects)worksheet.ChartObjects(Missing.Value);
Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Item(1);
myChart.Activate();
Excel.Chart chart = myChart.Chart;
chart.Export(outputFile, "PNG", false);