画像の連結オブジェクトフレームにacOLECopyを実行して画像データをクリップボードに入れる流れを作ったのですが
VBAでこの画像クリップボードデータを直にBMPとして指定のパスで保存する方法が分かりません
ネットで探してみてもExcel版ばかりでAccess単体でできる方法が見つかりませんでした
どうすればAccessでも直にBMP出力できるでしょうか?
画像の連結オブジェクトフレームにacOLECopyを実行して画像データをクリップボードに入れる流れを作ったのですが
VBAでこの画像クリップボードデータを直にBMPとして指定のパスで保存する方法が分かりません
ネットで探してみてもExcel版ばかりでAccess単体でできる方法が見つかりませんでした
どうすればAccessでも直にBMP出力できるでしょうか?
連結オブジェクトフレームということは、画像データはOLEオブジェクト型のフィールドに保存されているということですね。
OLEオブジェクト型というのは、古い技術ですので、重い、サイズが大きくなる、扱いにくい、などデメリットが多いので、
Access2007以降なら、添付ファイル型に格納するのがデフォです。
添付ファイル型なら下記が参考になるでしょう。
■T'sWare Access Tips #492 ~添付ファイルをディスクに保存するには?~
すみません、前提が抜けていました
既にOLEオブジェクト型埋め込みで作られているDBがあり、
それを作り変えるための前提としてファイルを保存して取り出しをしたかったのです
なので取り出しの段階ではDB構造は変更できません
私もいろいろ検索してみましたが見つかりませんでした。
手作業で一つずつ保存するか、その手順をRPAツールなどで自動化するぐらいでしょうか。
一筋縄ではいかないようですね
ただ、Web検索でACCESSでの情報がないというわけでもないようです
Yahoo Japan
画像を読み込む(GetChunkメソッド)(モーグ)
”OLEオブジェクトフィールドのイメージをBMPファイルに書き出す”の覚え書き (Access2003)(とくさんブログさん)
ありがとうございます
実際acOLECopy後にペイント起動して貼り付けをした後に名前つけて保存すれば手動でファイル保存すればできているのですが
これが1万件あるのであとちょっとの部分(クリップボード内をパス指定ファイル保存)さえ自動化できれば…と思い何とかもがいていたところです
ExcelだとVBAで空シートに貼り付け→グラフ化→グラフのイメージ化という手段が取れてるので
Accessでも何かできればとは思ったのですがどうしてもクリップボード経由でなく直にOLEを変換する方向しか見つからず
それもこのDBだとヘッダが違うらしく八方塞がりになっていました…
保存の仕方が一定ならヘッダも同じ内容になるはずなのでサンプルを取って調整してあげれば上の回答の内容でいけるんですが
ちなみにhirotonが試してみたらこうなってました
なので、たとえば
bytImage() = objRecordSet.Fields("IMAGE").GetChunk(87, nSize)
としてあげれば保存したbmpファイルがそのまま開けました
変動するなら、「バイナリ読んでBMの文字が出るまで」とかになるんでしょうか。バイナリの読み方はわかりませんが
クリップボード経由するならPowerShellにはクリップボードの画像を保存する方法があるようなので、コマンド(スクリプトファイル)を用意しておいて叩くとか、クリップボードに画像が保存されたら自動でファイルに保存するアプリを使うとかですかねぇ
ありがとうございます
結局Sendkeys(Wscript.Shellの方)を使ってペイントに張り付けて名前を付けて保存の処理を一括自動でやる形を取りました
実際バイナリを取ってみたところ元がbmpなのに「イメージ」や「DIB」とは書かれていたのですが
「BM」と書かれていた所が見つからなかったので断念しました