C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ピクチャーボックスの画像をExcelに出力する処理


(過去ログ 123 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■73415 / inTopicNo.1)  ピクチャーボックスの画像をExcelに出力する処理
  
□投稿者/ てくてく (4回)-(2014/09/24(Wed) 11:45:23)

分類:[VB.NET/VB2005 以降] 

分類:[VB.NET/VB2005 以降] 

OS:Windows XP
言語:Visual Basic
DB: SQL Server 2008R2 
開発環境:Visual Studio 2008 

てくてくと申します。よろしくお願いします。

アプリ上のピクチャーボックスの画像をExcelに出力する処理を作成しているのですが、
エラーが出て上手くいきません。

処理としては以下の様になっています。

-----------------------------------------------------

DimxlSheetsAsExcel.Sheets=xlBook.Worksheets
DimxlSheetAsExcel.Worksheet=Nothing
DimxlRangeAsExcel.Range=Nothing
DimxlRangeBAsExcel.Range=Nothing

'シート選択
xlSheet=DirectCast(xlSheets(1),Excel.Worksheet)

'ピクチャーボックスの画像をクリップボードにコピー
Clipboard.SetImage(PictureBox.Image)

'1シート目を操作対象に設定
xlSheet=DirectCast(xlSheets(1),Excel.Worksheet)
xlRangeB=xlSheet.Cells

'セルA1を貼り付け対象に設定
xlRange=DirectCast(xlRangeB(1,1),Excel.Range)

'クリップボードのデータを貼り付け
xlRange.PasteSpecial()

-----------------------------------------------------

エラーは最後の行の「xlRange.PasteSpecial()」で出ていて、
「Range クラスの _PasteSpecial メソッドが失敗しました。」というエラー内容です。

クリップボードに何もコピーされていないのかと思ったのですが、クリップボードにはしっかりコピーされていました。

ちょっと腑に落ちないのは、プログラム側でクリップボードにコピーをするとエラーになるのですが、
「Clipboard.SetImage(PictureBox.Image)」をコメントアウトし、
手動でビットマップをクリップボードにコピー後にプログラムで処理をすると「xlRange.PasteSpecial()」でエラーとならず、正常にExcelに出力されました。


クリップボードにコピーする処理がいけないのでしょうか?



引用返信 編集キー/
■73416 / inTopicNo.2)  Re[1]: ピクチャーボックスの画像をExcelに出力する処理
□投稿者/ Hongliang (235回)-(2014/09/24(Wed) 12:31:15)
> ちょっと腑に落ちないのは、プログラム側でクリップボードにコピーをするとエラーになるのですが、
> 「Clipboard.SetImage(PictureBox.Image)」をコメントアウトし、
> 手動でビットマップをクリップボードにコピー後にプログラムで処理をすると「xlRange.PasteSpecial()」でエラーとならず、正常にExcelに出力されました。

比較対象にすべきは、Clipboard.SetImageでコピーした後に手動でExcelシートにペーストしたケースではないでしょうか。
このときマクロを記録しておくことで、どういう処理が行われたかが分かります。

「手動でビットマップをクリップボードにコピー」というのが具体的にどういう操作か分かりませんが、
たとえばMS Paintで全選択してコピーした場合とClipboard.SetImageした場合を比較するのであれば、
それぞれの場合でClipboard.GetDataObject()が返すIDataObjectのGetFormats()でどういう形式で画像がクリップボードに格納されているか確認できます。
引用返信 編集キー/
■73417 / inTopicNo.3)  Re[1]: ピクチャーボックスの画像をExcelに出力する処理
□投稿者/ 魔界の仮面弁士 (125回)-(2014/09/24(Wed) 12:55:35)
No73415 (てくてく さん) に返信
> エラーは最後の行の「xlRange.PasteSpecial()」で出ていて、
> 「Range クラスの _PasteSpecial メソッドが失敗しました。」というエラー内容です。

最初にアンダーバーの付いた、「_PasteSpecial」メソッドのエラーなのですね。

PasteSpecial を呼び出したのに、_PasteSpecial が実行されているようなので、
念のため、環境に問題が無いかどうかを確認させて下さい。

・一つの OS 上に、複数バージョンの Excel を同居させていませんか?
・開発環境の Excel バージョンと、実行環境の Excel バージョンは同一ですか?



なお、Excel のタイプライブラリを調べたところ、以下のように定義されていました。
動作の違いまでは調査していませんが、引数定義は同じなんですね…。


Excel 2000
 0x403:PasteSpecial…戻り値 VARIANT、引数4つ

Excel 2002/2003/2007/2010/2013
 0x403:_PasteSpecial…隠し属性、戻り値 VARIANT、引数4つ
 0x788:PasteSpecial…戻り値 VARIANT、引数4つ

※先頭の16進数は DispId です。


> 手動でビットマップをクリップボードにコピー後にプログラムで処理をすると「xlRange.PasteSpecial()」でエラーとならず、正常にExcelに出力されました。

恐らくは、手動でコピー操作をした場合と、プログラムから画像データを
クリップボード転送した場合とで、転送フォーマットのリストに差があるのだと思います。

「クリップボードビューア」等を用いて、クリップボードデータの形式を列挙してみて下さい。

仮にフォーマットの問題だとしたら、
 ・SetImage を呼ぶ前に、Clipboard.Clear() を呼び出してみる。
 ・SetImage を使わず、DataObject.SetData(string, object) を使い、Bitmap ではなくバイナリを送り込む。
などの対処をしてみては如何でしょうか。(未確認)
引用返信 編集キー/
■73420 / inTopicNo.4)  Re[2]: ピクチャーボックスの画像をExcelに出力する処理
□投稿者/ てくてく (5回)-(2014/09/24(Wed) 16:56:07)
No73416 (Hongliang さん) に返信

>>ちょっと腑に落ちないのは、プログラム側でクリップボードにコピーをするとエラーになるのですが、
>>「Clipboard.SetImage(PictureBox.Image)」をコメントアウトし、
>>手動でビットマップをクリップボードにコピー後にプログラムで処理をすると「xlRange.PasteSpecial()」でエラーとならず、正常にExcelに出力されました。
>
> 比較対象にすべきは、Clipboard.SetImageでコピーした後に手動でExcelシートにペーストしたケースではないでしょうか。
> このときマクロを記録しておくことで、どういう処理が行われたかが分かります。
>
> 「手動でビットマップをクリップボードにコピー」というのが具体的にどういう操作か分かりませんが、
> たとえばMS Paintで全選択してコピーした場合とClipboard.SetImageした場合を比較するのであれば、
> それぞれの場合でClipboard.GetDataObject()が返すIDataObjectのGetFormats()でどういう形式で画像がクリップボードに格納されているか確認できます。


Hongliangさん 回答有難うございます。

> 「手動でビットマップをクリップボードにコピー」というのが具体的にどういう操作か分かりませんが、

ビットマップを編集画面で開いて、選択→コピーする事でクリップボードにコピーという操作になります。


> それぞれの場合でClipboard.GetDataObject()が返すIDataObjectのGetFormats()でどういう形式で画像がクリップボードに格納されているか確認できます。

GetFormatsで形式を比較してみたところ、以下の様になりました。


■プログラム処理時(エラー時)
・System.Drawing.Bitmap
・Bitmap

■手動コピー後プログラム処理(正常時)
・Embed Source
・Object Descriptor
・MetaFilePict
・DeviceIndipendentBitmap

「手動コピー後プログラム処理(正常時)」に合わせてフォーマットを追加する事になるのでしょうか?



引用返信 編集キー/
■73421 / inTopicNo.5)  Re[2]: ピクチャーボックスの画像をExcelに出力する処理
□投稿者/ てくてく (6回)-(2014/09/24(Wed) 17:05:07)
No73417 (魔界の仮面弁士 さん) に返信
> ■No73415 (てくてく さん) に返信
>>エラーは最後の行の「xlRange.PasteSpecial()」で出ていて、
>>「Range クラスの _PasteSpecial メソッドが失敗しました。」というエラー内容です。
>
> 最初にアンダーバーの付いた、「_PasteSpecial」メソッドのエラーなのですね。
>
> PasteSpecial を呼び出したのに、_PasteSpecial が実行されているようなので、
> 念のため、環境に問題が無いかどうかを確認させて下さい。
>
> ・一つの OS 上に、複数バージョンの Excel を同居させていませんか?
> ・開発環境の Excel バージョンと、実行環境の Excel バージョンは同一ですか?
>
>
>
> なお、Excel のタイプライブラリを調べたところ、以下のように定義されていました。
> 動作の違いまでは調査していませんが、引数定義は同じなんですね…。
>
>
> Excel 2000
>  0x403:PasteSpecial…戻り値 VARIANT、引数4つ
>
> Excel 2002/2003/2007/2010/2013
>  0x403:_PasteSpecial…隠し属性、戻り値 VARIANT、引数4つ
>  0x788:PasteSpecial…戻り値 VARIANT、引数4つ
>
> ※先頭の16進数は DispId です。
>
>
>>手動でビットマップをクリップボードにコピー後にプログラムで処理をすると「xlRange.PasteSpecial()」でエラーとならず、正常にExcelに出力されました。
>
> 恐らくは、手動でコピー操作をした場合と、プログラムから画像データを
> クリップボード転送した場合とで、転送フォーマットのリストに差があるのだと思います。
>
> 「クリップボードビューア」等を用いて、クリップボードデータの形式を列挙してみて下さい。
>
> 仮にフォーマットの問題だとしたら、
>  ・SetImage を呼ぶ前に、Clipboard.Clear() を呼び出してみる。
>  ・SetImage を使わず、DataObject.SetData(string, object) を使い、Bitmap ではなくバイナリを送り込む。
> などの対処をしてみては如何でしょうか。(未確認)


魔界の仮面弁士さん 回答有難うございます。

> ・一つの OS 上に、複数バージョンの Excel を同居させていませんか?

1つのOSにExcelの2000と2010が同居していました。

> ・開発環境の Excel バージョンと、実行環境の Excel バージョンは同一ですか?

開発環境と実行環境は同じマシンで行っています。

> 「クリップボードビューア」等を用いて、クリップボードデータの形式を列挙してみて下さい。

クリップボードビューワー(FreeClipViewer.exe)では以下の通りとなりました。

■プログラム処理時(エラー時)
・Preview
・Bitmap
・Bitmap DIB
・Bitmap DIBV5
・Dataobject
・System.Drawing.Bitmap
・Ole Private Data

■手動コピー後プログラム処理(正常時)
・Preview
・Metafile Picture Format
・Bitmap DIB
・Enhanced Metafile
・Bitmap
・Bitmap DIBV5
・DataObject
・Embed Source
・Native
・OwnerLisk
・Object Descriptor
・Ole Private Data


> 仮にフォーマットの問題だとしたら、
>  ・SetImage を呼ぶ前に、Clipboard.Clear() を呼び出してみる。
>  ・SetImage を使わず、DataObject.SetData(string, object) を使い、Bitmap ではなくバイナリを送り込む。
> などの対処をしてみては如何でしょうか。(未確認)

バイナリでクリップボードへのコピー処理をやってみようと思います。
確かにこれだとフォーマット関係ないので行けそうな気がします。。。。
引用返信 編集キー/
■73447 / inTopicNo.6)  Re[3]: ピクチャーボックスの画像をExcelに出力する処理
□投稿者/ てくてく (7回)-(2014/09/26(Fri) 10:55:39)
自己レスです。

>> 仮にフォーマットの問題だとしたら、
>>  ・SetImage を呼ぶ前に、Clipboard.Clear() を呼び出してみる。
>>  ・SetImage を使わず、DataObject.SetData(string, object) を使い、Bitmap ではなくバイナリを送り込む。
>> などの対処をしてみては如何でしょうか。(未確認)

>バイナリでクリップボードへのコピー処理をやってみようと思います。
>確かにこれだとフォーマット関係ないので行けそうな気がします。。。。

上記の処理でExcel出力が出来ました。

Hongliang さん、魔界の仮面弁士 さん

的確なアドバイス有難うございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -