
Excel2007のVBAで、セル範囲を指定して画像として保存したいです。
たとえば、
Worksheets("Sheet1").Range("A1:B10").CopyPicture xlScreen, xlBitmap
Worksheets("Sheet2").Paste
とすれば、別のシートに指定した範囲を画像にすることはでき、
さらにこれを、
With ActiveWorkbook.PublishObjects.Add(xlSourceSheet, "C:\test.html", _
"Sheet2", "", xlHtmlStatic, "image", "")
.Publish (True)
.AutoRepublish = False
End With
とすれば、画像を指定した場所に保存することはできると思います。
ただ、これだと無駄な処理をしているような気がしますし、実際時間も数秒必要です。
これが、グラフだと
Worksheets("Sheet1").ChartObjects("グラフ1").Chart.Export Filename:="C:\graph.gif", FilterName:="gif"
のように簡単に、しかも短時間で出来ます。
できれば、上記グラフのように、指定したSheetの指定したセル範囲を画像として指定した場所にPNGにて保存したいです。
どなたかご教授いただければ幸いです。
No.4ベストアンサー
- 回答日時:
苦肉の策の中抜き版です。
ConvCLSIDに言及してありませんでしたが、コピーされましたでしょうか。当方では、下記により、Sub testを実行して、選択セルをpngで保存できました。
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" ( _
Private Declare Function OpenClipboard Lib "user32.dll" ( _
Private Declare Function GetClipboardData Lib "user32.dll" ( _
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _
Private Declare Function GdiplusStartup Lib "gdiplus.dll" _
Private Declare Sub GdiplusShutdown Lib "gdiplus.dll" (ByVal token As Long)
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus.dll" _
Private Declare Function GdipDisposeImage Lib "gdiplus.dll" _
Private Declare Function GdipSaveImageToFile Lib "gdiplus.dll" _
Private Declare Function CLSIDFromString Lib "ole32" _
' // Types ----------------------------------------------------------
Private Type PictDesc
'略
End Type
Private Type Guid
'略
End Type
Public Enum GDIPlusStatusConstants
'略
End Enum
Private Type UUID
'略
End Type
Private Type GdiplusStartupInput
'略
End Type
Private Type EncoderParameter
'略
End Type
Private Type EncoderParameters
'略
End Type
' // Constants ------------------------------------------------------
Private Const CF_BITMAP As Long = 2
Private Const CF_PALETTE As Long = 9
Const CLSID_PNG = "{557CF406-1A04-11D3-9A73-0000F81EF32E}"
Sub test()
Dim myPicture As StdPicture
Selection.Copy
Set myPicture = CreatePictureFromClipboard
Call SavePicturePng(myPicture, "c:\cells.png")
End Sub
' // クリップボードのビットマップデータから Picture オブジェクトを作成
Public Function CreatePictureFromClipboard() As StdPicture
'略
End Function
Public Function SavePicturePng(ByVal PicObj As IPictureDisp, ByVal FName As String) As GDIPlusStatusConstants
'略
End Function
Private Function ConvCLSID(ByVal sGuid As String) As UUID
'略
End Function
大変ご足労おかけしました。
なんの問題もなく出来上がりました。
これからの作業効率を考えると、感謝感謝です。
本当にありがとうございました。
No.3
- 回答日時:
#1,2です。
まず、
http://oshiete.goo.ne.jp/qa/2885043.html
の、#2の、' // 標準モジュールから、
Public Function CreatePictureFromClipboard() As StdPictureの最後の、
End Functionまでを、コピーして、標準モジュールに貼り付けます。
次いで、
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi? …
の「ここからコード」というところの次から、
名称 :SavePicturePngの最後の、End Functionまでを貼り付ける訳ですが、
最初に貼り付けたコードの下記の部分に、相当する部分は、それぞれ分類して貼り付けてください。
最初に貼り付けたコードの下に全部貼り付けてしまうと、エラーになってしまうと思います。
' // Declareations --------------------------------------------------
' // Types ----------------------------------------------------------
' // Constants ------------------------------------------------------
丸ごとコードを載せると、字数制限にとうてい収まりませんし、著作権上の問題も分からないので、控えておきます。
APIというのを用いて、Windowsの機能を使っています。関心を持たれたら、参考URLなどをご覧下さい。
参考URL:http://www.excellenceweb.net/vba/api/what_window …
ご丁寧にありがとうございます。
書かれていることは、理解しているつもりですが上手く動きません。
私自身のスキルに問題があると感じております。
ありがとうございました。
No.2
- 回答日時:
#1です。
xl2010、WindowsXPsp3環境で動作確認しましたので、報告しておきます。
実行スピードはあっと言う間です。
(xl2007環境は無いものであしからず)
参考URLから、必要なパーツを、標準モジュールにコピペしてから、実行して下さい。
Sub test()
Dim myPicture As StdPicture
Selection.Copy
Set myPicture = CreatePictureFromClipboard
Call SavePicturePng(myPicture, "c:\cells.png")
End Sub
この回答への補足
試してみましたが、私には無理でした。
もしよろしければ、簡単なサンプルを作っていただけませんでしょうか。
厚かましいお願いですみません。
ご回答ありがとうございます。
>必要なパーツを、標準モジュールにコピペしてから
の意味が良くわからず、、、戸惑っていますが
がんばってみます。
後ほど、ご報告いたします。
No.1
- 回答日時:
エクセルでセルをコピーすると、クリップボードには多数の種類のフォーマットでコピーされています。
拡張メタファイル、Picture、ビットマップ、テキスト等々。
ここから、簡単にPNGに変換する方法は存じません。
下記を組み合わせれば出来ると思います。
クリップボードのbitmapからPictureObject生成
http://oshiete.goo.ne.jp/qa/2885043.html
下記の様な使い方で、BMP形式では保存できます。
Sub test()
Selection.Copy
Call SavePicture(CreatePictureFromClipboard, "c:\cell.bmp")
End Sub
残念ながら、SavePictureではBMP(またはEMF)形式でしか保存できないそうなので、
PictureObjectからPNG形式で保存
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi? …
なお、拡張メタファイルEMF形式での保存なら下記で出来てしまいます。
Vix等のフリーソフトで読み込んでPNGに変換という事もできますが、多量に処理するので無ければご要望には添いませんね。
Const CF_ENHMETAFILE = 14
Private Declare Function OpenClipboard Lib "user32" (ByVal hWndNewOwner As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal uFormat As Long) As Long
Private Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
Private Declare Function DeleteEnhMetaFile Lib "gdi32" (ByVal hEmf As Long) As Long
Sub clip2emf()
Dim hSrcMetaFile As Long
Dim hFileMetaFile As Long
Selection.Copy
If OpenClipboard(0) Then
hSrcMetaFile = GetClipboardData(CF_ENHMETAFILE)
hSrcMetaFile = CopyEnhMetaFile(hSrcMetaFile, vbNullString)
CloseClipboard
End If
If hSrcMetaFile = 0 Then
MsgBox "emf取得に失敗"
Exit Sub
End If
hFileMetaFile = CopyEnhMetaFile(hSrcMetaFile, "c:\test.emf")
DeleteEnhMetaFile hFileMetaFile
DeleteEnhMetaFile hSrcMetaFile
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
M365にアップデートしてからコ...
-
VC++6.0 でのライブラリ参照方法
-
ファイルをvbaで圧縮したいので...
-
VB2003で レジストリを格納する
-
C# DLL エントリ ポイントが...
-
vb6で作成した画面が処理に時間...
-
VBAエディタのコード画面で、カ...
-
python エラー
-
DLLファイルの逆コンパイラにつ...
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
-
VBAを何回も作り直して、容量が...
-
アプリケーションのDLLファイル...
-
” OS ビルド ” の意味が分か...
-
外部依存関係について
-
Excelのエラーで困ってます。
-
eclipseでプログラムが実行でき...
-
Eclipseのブレークポイントが○...
-
HEWを使用しているのですが、こ...
-
ビルド失敗 指定されたファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
user32.dllがないためアプリが...
-
visual studioの不要なDll削除方法
-
ASP.NETのDLL入れ替えについて
-
VB6.0(SP6)にて開発を行なって...
-
VBAエディタのコード画面で、カ...
-
VBにてIMEの入力モードを変える...
-
res://ieframe.dll/について
-
C# DLL エントリ ポイントが...
-
ファイルをvbaで圧縮したいので...
-
M365にアップデートしてからコ...
-
自作のDLLがみつからない
-
VBからIMEパッドを呼び出す方法...
-
vb6で作成した画面が処理に時間...
-
*.exeと異なるフォルダのDLLを...
-
MSFlexGridコントロールのエラ...
-
スタートメニューの「ファイル...
-
指定された引数が有効範囲にな...
-
プロシージャエントリポイント ...
-
VC++6.0 でのライブラリ参照方法
-
WIN10で常にフォームを手前に
おすすめ情報