2

我有一个工作的 excel vba 宏,它可以从这里做我想要的,我正在尝试将它转换为 VB.NET。

来自 VBA 的代码:

Sub bah()
''' Set Range you want to export to file
    Dim rgExp As Range: Set rgExp = Range("B2:C6")
    ''' Copy range as picture onto Clipboard
    rgExp.CopyPicture Appearance:=xlScreen, format:=xlBitmap
    ''' Create an empty chart with exact size of range copied
    With ActiveSheet.ChartObjects.Add(Left:=rgExp.Left, Top:=rgExp.Top, _
    Width:=rgExp.Width, Height:=rgExp.Height)
    .Name = "ChartVolumeMetricsDevEXPORT"
    .Activate
    End With
    ''' Paste into chart area, export to file, delete chart.
    ActiveChart.Paste
   ActiveSheet.ChartObjects("ChartVolumeMetricsDevEXPORT").Chart.Export "C:\Users\ajohnson\Desktop\workdamnit.jpg"
ActiveSheet.ChartObjects("ChartVolumeMetricsDevEXPORT").Delete
End Sub

这样做是获取一个 excel 范围,然后将其放入作为该范围副本的图表中,并将其保存为 JPG。

这是我最近尝试使它成为 VB.NET:

Dim xlApp As New Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
Dim xlRange As Excel.Range
xlWorkBook = xlApp.Workbooks.Open("C:\test.xlsx")
xlWorkSheet = xlWorkBook.Sheets("Sheet1")


 xlRange = xlWorkSheet.Range("B2:C6")
        With xlWorkSheet.ChartObjects.add(xlRange.Left, xlRange.Top, xlRange.Width, xlRange.Height)
            .name = "Chart1"
            .activate()
        End With
xlWorkSheet.ChartObjects("Chart1").Paste()
        xlWorkSheet.ChartObjects("Chart1").chart.export(Filename:="C:\Users\ajohnson\Desktop\saveit.jpg")
        xlWorkSheet.ChartObjects("Chart1").delete()

我在转换ActiveChart.Paste方法时遇到了麻烦。我无法让它在 VB.NET 中工作。当我在 VB.NET 中执行此操作时,它要么抛出错误,要么只留下一个空框(如果我.chart在粘贴它运行之前添加,但不粘贴任何值),但在 VBA 中它会填充感兴趣的值。我曾尝试创建一个图表对象,但这似乎也不起作用。

我觉得我快要解决它了,但我不能完全理解它。我想我可以将它保留为 VBA 宏并从 VB.NET 调用它,但这在某种程度上似乎很荒谬。任何帮助将不胜感激。我也对不同的方法持开放态度,这正是我遇到的在 VBA 中运行良好的东西,所以我认为这是一个很好的起点。

一如既往的感谢!

4

2 回答 2

5

我只需要更加努力地访问 MSDN 就可以到达那里。原来你必须将图表对象放在图表中,我得到的代码如下所示:

  xlRange = xlWorkSheet.Range("B2:C6")
    xlRange.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlPicture)
    Dim oChtobj As Excel.ChartObject = xlWorkSheet.ChartObjects.add(xlRange.Left, xlRange.Top, xlRange.Width, xlRange.Height)
    Dim oCht As Excel.Chart
    oCht = oChtobj.Chart
    oCht.Paste()
    oCht.Export(Filename:="C:\saveit.jpg")
    oChtobj.Delete()

我打算删除这个问题,因为它很快就被我解决了(这忽略了我在这里发布之前花费的大量时间),但是当我搜索像我这样的问题时,它会来到这个页面,所以也许这将在未来帮助某人。如果您出于某种原因希望将范围从 excel 复制到 jpg(可能将其附加到 Outlook 电子邮件的正文,因为这就是我正在做的事情),这应该适合您。

于 2012-05-23T16:50:32.363 回答
2

并且 C# 等效项需要调用 Activate() 否则将抛出 COMException

Excel.Range xlRange = xlWorkSheet.Range("B2:C6");

range.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlPicture);
Excel.ChartObject chartObj = myWorksheet.ChartObjects().Add(range.Left, range.Top, range.Width, range.Height);

chartObj.Activate();  // Don't Forget!

Excel.Chart chart = chartObj.Chart;
chart.Paste();
chart.Export(@"C:\image.png");

chartObj.Delete();
于 2012-11-14T23:12:50.017 回答