将图表导出为图像有时会生成空文件 - Excel VBA

时间:2016-06-07 14:24:58

标签: excel vba excel-vba

我正在做一个导出工作表中所有图表的宏,然后打开Outlook并附加它们。但是,我注意到,有几次图表会导出但是为0KB(文件已创建,但图像无法看到) enter image description here

但并非所有图表都会发生。只是大部分时间,有时候,它们都会毫无问题地生成它们。 (当我逐步执行代码时,所有图表生成都没有问题,也是在执行一步一步后,然后我正常执行它并生成所有图表,但如果我关闭并重新打开工作簿,它会给出同样的问题,只生成两个,其余的都是空文件)

以下是代码:

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

我错过了什么?

4 个答案:

答案 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);