2017-08-15 3 views
0

私の職場のビジュアルマネジメントボードは、テレビにVMBを取り込むためのスプレッドシートを多数使用しています。これらのシートには多くのチャートがあります。私はVBで一生懸命働いているわけではないので、私に同行してください。VBObjectのExcelシートからChartObjectをエクスポートするときに空のbmpファイル

私の問題は、プログラムがアクセスしようとしているチャートが文字通りポップアップするExcelシートに表示されないためです。私は私が何を言っているのか分からないかもしれませんが、これはデータを取得して表示するためのひどい方法のようです。しかし、私はそれを修正する必要があります。 enter image description here

ここでは、Excelで表示されないグラフをエクスポートしようとしたときに作成されるbmpの例を示します(プライバシー上の理由からいくつかの情報が消去されています)ウィンドウ: enter image description here 私の研究から、多くの人がグラフオブジェクトをエクスポートする前に、この問題を解決したことがわかりました。ここでやろうとしましたが、例外がスローされます。ここではドキュメントフォルダに存在することになっているチャートやBMPのを作るために輸出を扱うコードのセクション全体です:

Dim xlApp As Excel.Application 
    Dim xlWorkBooks As Excel.Workbooks 
    Dim xlWorkBook As Excel.Workbook 
    Dim xlWorkSheets As Excel.Sheets 
    Dim xlWorkSheet As Excel.Worksheet 

    xlApp = New Excel.Application 
    xlApp.Visible = True 
    xlWorkBooks = xlApp.Workbooks 
    xlWorkBook = xlWorkBooks.Open(ScoreCard) 
    xlWorkSheets = xlWorkBook.Sheets 




    For x As Integer = 1 To xlWorkSheets.Count 
     xlWorkSheet = CType(xlWorkSheets(x), Excel.Worksheet) 


     If xlWorkSheet.Name = My.Settings.Org Then 


      xlWorkSheet.ChartObjects(2).chart.Export(Filename:=path + "\Documents\OnTimeDelivery.bmp", FilterName:="BMP") 
      picOnTimeDelivery.Image = New System.Drawing.Bitmap(path + "\Documents\OnTimeDelivery.bmp") 
      xlWorkSheet.ChartObjects(3).chart.Export(Filename:=path + "\Documents\Quality.bmp", FilterName:="BMP") 
      picQuality.Image = New System.Drawing.Bitmap(path + "\Documents\Quality.bmp") 
      xlWorkSheet.ChartObjects(1).chart.Export(Filename:=path + "\Documents\NoDemandInventory.bmp", FilterName:="BMP") 
      picNoDemandInventory.Image = New System.Drawing.Bitmap(path + "\Documents\NoDemandInventory.bmp") 
      xlWorkSheet.ChartObjects(7).chart.Export(Filename:=path + "\Documents\ExcessInventory.bmp", FilterName:="BMP") 
      picExcessInventory.Image = New System.Drawing.Bitmap(path + "\Documents\ExcessInventory.bmp") 
      xlWorkSheet.ChartObjects(4).chart.Export(Filename:=path + "\Documents\Freight.bmp", FilterName:="BMP") 
      picFreight.Image = New System.Drawing.Bitmap(path + "\Documents\Freight.bmp") 
      xlWorkSheet.ChartObjects(5).chart.Export(Filename:=path + "\Documents\ShortagesByStart.bmp", FilterName:="BMP") 
      picShortagesByStart.Image = New System.Drawing.Bitmap(path + "\Documents\ShortagesByStart.bmp") 
      xlWorkSheet.ChartObjects(6).chart.Export(Filename:=path + "\Documents\ShortagesRootCause.bmp", FilterName:="BMP") 
      picShortagesRootCause.Image = New System.Drawing.Bitmap(path + "\Documents\ShortagesRootCause.bmp") 


     End If 

     Runtime.InteropServices.Marshal.FinalReleaseComObject(xlWorkSheet) 

    Next 
    xlWorkBook.Close() 
    xlApp.UserControl = True 
    xlApp.Quit() 

    'Close connection to excel sheet 
    MyConnection.Close() 

プログラムがクラッシュは、

picFreight.Image = New System.Drawing.Bitmap(path + "\Documents\Freight.bmp") 
を設定しようとすると、無効なパラメータ例外を投げます

マイドキュメントフォルダ内のFreight.bmpが0kbファイルであるためです。次の画像がロードされている画像を変更すると(コメントアウトしてShortagesByStart.bmpをロードしようとすると)、同じ理由でクラッシュします。この点を過ぎたチャートはすべて共通のものが1つあり、画面には表示されません。それでも私は愚かな理由のようです。確かにそれは問題を引き起こさないようなもの!

まず私はxlWorkSheet

xlWorkSheet.Activate() 

をアクティブ化しようとしたが、これは何も変わっていません。

だから私は、エクスポート文の前に

  xlWorkSheet.ChartObjects(2).chart.Activate() 
      xlWorkSheet.ChartObjects(3).chart.Activate() 
      xlWorkSheet.ChartObjects(1).chart.Activate() 
      xlWorkSheet.ChartObjects(7).chart.Activate() 
      xlWorkSheet.ChartObjects(4).chart.Activate() 

を追加することで、個々のChartObjectsをアクティブにしようとしました。これは実際に例外を投げた:enter image description here

だから、私は立ち往生している。ワークシート内のチャートオブジェクトを適切にアクティブ化するにはどうすればよいですか?おそらく、これを引き起こす別の問題があります。

+1

chartobjectsをアクティブ化しようとすると、ワークシートがアクティブでない可能性がありますか?そうすればVBAでもエラーが発生します。管理しているコードでは、まるであなたが得ているものと同じように 'COMException'です。 –

+0

私はスレッドを5秒間スリープさせてから、chartobjectsのアクティベーションを試みましたが、例外はスローしました。それがあなたがアクティブであることを意味するなら、Excelウィンドウがアップしてロードを完了しました。スレッドをスリープする前にxlWorkSheet.Activate()を呼び出した後でも。コメントありがとう! –

+1

スレッドをスリープする必要はありません。*何も変更されません。あなたがそのワークシートオブジェクトの何かを '.Activate()'しようとする前に 'xlWorkSheet.Activate()' *を呼び出す必要があることを意味します( 'ChartObject'または' Range ' - 通常は' Range'を有効にしたくないかもしれませんが)。 –

答えて

0

解決策は、VMBを実行したいPCでMicrosoft Officeを更新することでした。コーポレートは、このプログラムが表示しようとしていたデータを含むこのExcelスプレッドシートを作成します。最終的に、このExcelシートを作成した者は、Excelの新しいバージョンを取得し、.xlxsファイルが作成されます。

スプレッドシートがReadOnlyモードで正常に開かれた理由はわかりませんが、Office 2007と2010の完全なサポートはないと思います。PC上のオフィスのコピーをアップグレードすると、 bmps。奇妙なことに、これは他の人の答えの多くではない場合は申し訳ありませんが、これは私の問題を解決しました!

関連する問題