tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルエクセルに画像を転送
記事No15549
投稿日: 2012/07/31(Tue) 12:08
投稿者yarihotaka
お世話になります。
 本サイトの例題を元にエクセル(EXCEL2003)にデジカメ画像を自動転送するプログラムを作りました。元にしたサンプルは、エクセルのシートに画像を表示の「下記はExcel上に表示したPictureにVBから指定の画像を表示する方法です。(230) Form には CommandButton を1個貼り付けておいて下さい。別途、Excel上にimageコントロールとLabelコントロールを貼り付けておいて下さい。又、下記マクロをTest1.xlsに作成しておいて下さい。」に記載のコードです。
 問題なく動くプログラムが出来たのですが、何故かエクセルのファイルサイズが異常に大きくなってしまいます。例えば340KBサイズの画像ファイルをシートのイメージコントロールに14枚ほど転送し保存したエクセルのファイルがなんと300MB近くになってしまいます。
 何故こんなに大きくなってしまうのか原因が分かりません。何か解決のためのヒントを教えてもらえれば幸いです。宜しくお願いします。

環境
OS WindowsXP SP3
VB6
Excel2003

[ツリー表示へ]
タイトルRe: エクセルに画像を転送
記事No15550
投稿日: 2012/07/31(Tue) 12:53
投稿者魔界の仮面弁士
> 下記はExcel上に表示したPictureにVBから指定の画像を表示する方法です。(230)
下記の後半部分のコードでしょうか?
http://hanatyan.sakura.ne.jp/vbhlp/Excel12.htm

# このサンプル、Test1.xls と Test.xls とを typo っているような…。


> 例えば340KBサイズの画像ファイルをシートのイメージコントロールに14枚ほど転送し保存したエクセルのファイルがなんと300MB近くになってしまいます。

ということは、平均して一枚あたり20〜21MBということですよね。
画像がビットマップとして転送されたのだと仮定しても、ちょっと大きすぎる気がしますね。


たとえば VGA 解像度のデジカメ写真(640x480 ピクセル)の場合、無圧縮ビットマップだと
単純換算で 24bit×640ドット×480ドット=921,600 バイトになります。

実際にはこれにヘッダー情報が追加されますが、VGA サイズでも 900KB。
QXGA サイズ(2048×1536)だとしても 9MB 程度の筈です。

参考までに、手元の Windows7 付属の 灯台.jpg 画像は 1024×768 で
("C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg")
548 KB (561,276 バイト)ですが、ビットマップ換算でも 2.25 MB です。

仮に、340KB が 1.5〜2.5MB 程度に増加したとしても、14 枚ならせいぜい 21〜35MB 程度。
300MB に到達するなら、その十倍の 140 枚ぐらいは必要そうなのですけれどね。
(手元に Excel 2003 が無いので、実測検証したわけでは無いのですが)


>  何故こんなに大きくなってしまうのか原因が分かりません。
どこかでループ処理などを誤っていて、予定より多い枚数の画像が貼られていたとか、
あるいは、Excel ファイルに削除し忘れた縦横サイズ0 のイメージが残っているとか、
画像を貼ったシートが非表示にされていて、それが容量を圧迫していたとか、もしくは
同じ座標に同じ画像が複数回重ねて貼られていた…なんてことはないでしょうか。


新規に xls ファイルを用意しなおしてみて、そこに
・画像 1 枚だけ処理した場合
・画像 5 枚だけ処理した場合
をそれぞれ試した場合、サイズは如何ほどになりますか?

また、JPG ファイルの代わりに、ペイント等で作成した 640x480 のビットマップを
貼りこんでいった場合、Excel のサイズ増加はどの程度でしょうか?


また、「下記はExcel上に表示したPictureにVBから指定の画像を表示する方法です。(230)」を
「Excelのシートに画像を表示(3方法)及びサイズ変更(339)」にした場合はどうでしょう?

[ツリー表示へ]
タイトルRe^2: エクセルに画像を転送
記事No15551
投稿日: 2012/07/31(Tue) 19:42
投稿者yarihotaka
 魔界の仮面弁士様

 早速の助言有り難うございます。

> > 下記はExcel上に表示したPictureにVBから指定の画像を表示する方法です。(230)
> 下記の後半部分のコードでしょうか?

はい、そうです。一番最後の部分のサンプルを利用させてもらいました。

> > 例えば340KBサイズの画像ファイルをシートのイメージコントロールに14枚ほど転送し保存したエクセルのファイルがなんと300MB近くになってしまいます。

 この記述は少し間違っていました。記憶が少しあいまいなのですが正しくは900KBぐらいの画像ファイルでした。

> 新規に xls ファイルを用意しなおしてみて、そこに
> ・画像 1 枚だけ処理した場合
> ・画像 5 枚だけ処理した場合
> をそれぞれ試した場合、サイズは如何ほどになりますか?
>
> また、JPG ファイルの代わりに、ペイント等で作成した 640x480 のビットマップを
> 貼りこんでいった場合、Excel のサイズ増加はどの程度でしょうか?
>

魔界の仮面弁士様の助言を受けていろいろ試してみました。

 416KBのJPG画像ファイルを用意し、プログラムからエクセルに1枚を転送すると16.7MB、2枚で24.6MB、3枚で32.5MBとなります。そして10枚を転送すると87.9MBとなります。普通にエクセルを起動し新規ブックに挿入で同じJPG画像ファイルを10枚貼り付けると433KBにしかなりません。

 次に425KBのBMP画像ファイルを用意し、プログラムからエクセルに10枚を転送すると5.2MB、普通にエクセルを起動し新規ブックに挿入で同じBMP画像ファイルを10枚貼り付けると258KBになります。

 ちなみに自動転送プログラムで使用する、マクロを組み込み空のイメージコントロールを各シートに14個配置した(シート総数は9ページです)エクセルファイルのサイズは320KBです。
 
 念のために1個のみ空のイメージコントロールを配置したエクセルファイル(シート総数も1ページ、ファイルサイズは54KB)にプログラムから416KBのJPG画像ファイル1枚を転送すると16.4MBになりました。

 プログラム中に変なループは無いと思っているのですが良く分かりません。

[ツリー表示へ]
タイトルRe^3: エクセルに画像を転送
記事No15552
投稿日: 2012/08/01(Wed) 06:41
投稿者yarihotaka
魔界の仮面弁士様

 サンプルのみで確認致しました。

 本サイトの「下記はExcel上に表示したPictureにVBから指定の画像を表示する方法です。(230)
Form には CommandButton を1個貼り付けておいて下さい。別途、Excel上にimageコントロールとLabelコントロールを貼り付けておいて下さい。又、下記マクロをTest1.xlsに作成しておいて下さい。」部分に記載のサンプルコードのみでプログラムを作り動かしてみました。用意した画像は416KBです。その結果、画像(1枚)を貼り付けた後のエクセルは16.4MBになってしまいました。

[ツリー表示へ]
タイトルRe^4: エクセルに画像を転送
記事No15553
投稿日: 2012/08/02(Thu) 14:59
投稿者VBレスキュー(花ちゃん)
横から割り込み、失礼します。

マナーとして、回答者を名指しで指名するような事はされない方がいいかと。

元々 jpg 形式で保存されているファイルは、圧縮処理がされているので、ファイルサイズは
小さくなっており、それを読み込んで解凍して表示しており、それを jpg 形式 で圧縮して
保存しているのなら兎も角そのままの状態で保存すれば当然元のサイズより大きくなるのは
当然の事かと思います。(JPG の圧縮率にもよるし)
その場合の Excel の保存処理がどのように行われているのかは知りませんが、JPG ファイルを
imageコントロール 上に表示した状態のまま保存すると通常の画像を保存する場合と違った
処理が付け加えられているのではないでしょうか(Excel の仕様)
jpg 形式 のファイルではなく、BMP 形式のファイルを使って同様に保存された場合は、元の
ファイルサイズ分位だけが増えるはずです。

そもそも、何の為にどのように表示したいのか? 貴方の目的に合った表示の仕方をされるべきかと
思います。(画像はリンク情報だけにするとか? 1. の方法で表示するとか?)

Private Sub Command1_Click()
   Dim xlApp    As Excel.Application
   Dim xlBook   As Excel.Workbook
   Dim xlSheet  As Excel.Worksheet
   Set xlApp = New Excel.Application
   Set xlBook = xlApp.Workbooks.Add
   Set xlSheet = xlBook.Worksheets(1)
   xlApp.Visible = True
  
   xlSheet.Range("B2").Select
   xlSheet.Pictures.Insert "c:\test.jpg"
  
   xlApp.DisplayAlerts = False
   xlSheet.SaveAs "c:\test.xls"
   Set xlSheet = Nothing
   xlBook.Close
   Set xlBook = Nothing
   xlApp.Quit
   Set xlApp = Nothing
End Sub

[ツリー表示へ]
タイトルRe^5: エクセルに画像を転送
記事No15559
投稿日: 2012/08/04(Sat) 13:09
投稿者yarihotaka
> (画像はリンク情報だけにするとか? 1. の方法で表示するとか?)

 皆さん有り難うございます。その後いろいろ調べたり試してみたりした結果、ファイルサイズが巨大化しない方法はいわゆる「挿入」しかないとの結論に達しプログラムを作り替えました。引用のVBレスキュー(花ちゃん)様ご指摘の通りの1.の方法です。重ねてお礼申し上げます。

[ツリー表示へ]