2

私はここからやりたいことを実行する優れた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 に答える