我有一个正在运行的excel vba宏,可以从here执行我想要的操作,并且我正在尝试将其转换为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中运作良好的事情,所以我认为这是一个很好的起点。
一如既往地谢谢!
答案 0 :(得分:5)
我只需要更加努力地到达MSDN。事实证明你必须将chartobject放在图表中,我工作的代码看起来像:
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电子邮件的正文中,因为这就是我正在做的事情),这应该适合您。
答案 1 :(得分: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();