• ベストアンサー

オートシェイプをJPG保存

お世話になります。 オートシェープがいくつかシートに貼りついており それをすべて選択してJPGとして別名保存がしたいのですが 可能でしょうか? お分かりの方、ぜひ教えてください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

こちらにあります。事前にグループ化する必要がある様です。 標準モジュールに貼り付けて、出力先のファイルパスだけいじってやると動きました。圧縮率の指定方法は分かりません。ご参考まで。 http://vbatips.blog37.fc2.com/blog-entry-26.html#more

yukiko125
質問者

お礼

本当に、ファイルパスだけ変更すると出来ました! ありがとうございました!!

その他の回答 (4)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

こんにちは。 #3 ご紹介の方法はオフィスのグラフィックフィルタを利用したものですね。 現在は大抵の環境でインストールされているでしょうし、ソースも簡易で いいですね^^ 以前 VB6 向けに作った画像処理クラスから抜粋してみました。 GdiPlus.dll というライブラリを利用した方法です。 GdiPlus.dll は WinXP 以降の OS で標準搭載されています。他の古い OS では Microsoft の Web ページからダウンロードする必要があるかもしれ ませんが、現在の PC ならば問題なく動くと思います。 BMP, JPG, GIF, TIF, PNG などの各種フォーマットが選択でき、JPG の場合は、 圧縮品質を指定できるようにしてあります。 SaveImageToFile 関数の連続呼び出しを考慮して GDI+ の初期化と終了を 別プロシージャにしましたが、最後に必ず GDI+ の終了プロシージャを呼び 出す必要がありますので、デバッグ時やエラー時にご注意を。 Option Explicit ' // クリップボード関係 Private Declare Function OpenClipboard Lib "user32.dll" ( _     ByVal hWnd As Long) As Long Private Declare Function GetClipboardData Lib "user32.dll" ( _     ByVal wFormat As Long) As Long Private Declare Function CloseClipboard Lib "user32.dll" () As Long Private Const CF_BITMAP  As Long = 2 ' // GDI+関係 Private Declare Function GdiplusStartup Lib "gdiplus" ( _     ByRef token As Long, _     ByRef inputBuf As GdiplusStartupInput, _     ByVal outputBuf As Long) As Long Private Declare Sub GdiplusShutdown Lib "gdiplus" ( _     ByVal token As Long) Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" ( _     ByVal hbm As Long, _     ByVal hpal As Long, _     ByRef bitmap As Long) As Long Private Declare Function GdipDisposeImage Lib "gdiplus" ( _     ByVal image As Long) As Long Private Declare Function GdipSaveImageToFile Lib "gdiplus" ( _     ByVal image As Long, _     ByVal filename As Long, _     ByRef clsidEncoder As GUID, _     ByVal encoderParams As Any) As Long Private Declare Function CLSIDFromString Lib "ole32.dll" ( _     ByVal lpszCLSID As Long, _     ByRef pCLSID As GUID) As Long Private Type GdiplusStartupInput     GdiplusVersion      As Long  ' UINT32 GdiplusVersion     DebugEventCallback    As Long  ' DebugEventProc DebugEventCallback     SuppressBackgroundThread As Long  ' BOOL SuppressBackgroundThread     SuppressExternalCodecs  As Long  ' BOOL SuppressExternalCodecs End Type Private Type GUID     Data1          As Long  ' unsigned long Data1     Data2          As Integer ' unsigned short Data2     Data3          As Integer ' unsigned short Data3     Data4(7)         As Byte  ' unsigned char Data4[8] End Type Private Type EncoderParameter     GUID           As GUID  ' GUID Encoder Guid     NumberOfValues      As Long  ' ULONG NumberOfValues     TypeAPI         As Long  ' ULONG Type     Value          As Long  ' VOID* Value End Type Private Type EncoderParameters     count     As Long       ' UINT Count     Parameter(15) As EncoderParameter ' EncoderParameter Parameter[l] End Type Private Const QUALITY_PARAMS As String = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}" Private Const ENCODER_BMP  As String = "{557CF400-1A04-11D3-9A73-0000F81EF32E}" Private Const ENCODER_JPG  As String = "{557CF401-1A04-11D3-9A73-0000F81EF32E}" Private Const ENCODER_GIF  As String = "{557CF402-1A04-11D3-9A73-0000F81EF32E}" Private Const ENCODER_TIF  As String = "{557CF405-1A04-11D3-9A73-0000F81EF32E}" Private Const ENCODER_PNG  As String = "{557CF406-1A04-11D3-9A73-0000F81EF32E}" Private m_GDIplusToken As Long ' // GDI+ 初期化 Private Function GDIplus_Initialize() As Boolean      Dim uGdiStartupInput As GdiplusStartupInput   Dim nStatus     As Long      If m_GDIplusToken Then Call Gdiplus_Shutdown   With uGdiStartupInput     .GdiplusVersion = 1     .DebugEventCallback = 0     .SuppressBackgroundThread = 0     .SuppressExternalCodecs = 0   End With   nStatus = GdiplusStartup(m_GDIplusToken, uGdiStartupInput, 0&)   GDIplus_Initialize = CBool(nStatus = 0) End Function ' // GDI+ 終了 Private Function Gdiplus_Shutdown() As Long   If m_GDIplusToken Then     Call GdiplusShutdown(m_GDIplusToken)     m_GDIplusToken = 0   End If End Function ' // GDI+ hBitmap からファイルへ書き出し Public Function SaveImageToFile( _   ByVal hBmp As OLE_HANDLE, _   ByVal sFilename As String, _   Optional ByVal sFormat As String = "JPG", _   Optional ByVal nQuarity As Long = 60 _ ) As Boolean   '@ sFormat : BMP, JPG, GIF, TIF, PNG   '@ nQuality: 0-100(0:高圧縮低画質, 100:低圧縮高画質, Jpg のみ有効)   If hBmp = 0 Then Exit Function      Dim sEncoderStr As String   Select Case UCase$(sFormat)     Case "JPG": sEncoderStr = ENCODER_JPG     Case "GIF": sEncoderStr = ENCODER_GIF     Case "TIF": sEncoderStr = ENCODER_TIF     Case "PNG": sEncoderStr = ENCODER_PNG     Case Else: sEncoderStr = ENCODER_BMP   End Select   Dim uEncoderParams  As EncoderParameters   ' Jpeg のクオリティー設定   If UCase$(sFormat) = "JPG" Then     nQuarity = Abs(nQuarity)     If nQuarity > 100 Then nQuarity = 100     uEncoderParams.count = 1     With uEncoderParams.Parameter(0)       .GUID = pvToCLSID(QUALITY_PARAMS)       .TypeAPI = 4 ' Type Long       .Value = VarPtr(nQuarity)       .NumberOfValues = 1     End With   End If      ' 保存処理   Dim nStatus  As Long   Dim pNewImage As Long   nStatus = GdipCreateBitmapFromHBITMAP(hBmp, 0&, pNewImage)   If nStatus = 0 Then     If UCase$(sFormat) = "JPG" Then       nStatus = GdipSaveImageToFile(pNewImage, _                      StrPtr(sFilename), _                      pvToCLSID(sEncoderStr), _                      VarPtr(uEncoderParams))     Else       nStatus = GdipSaveImageToFile(pNewImage, _                      StrPtr(sFilename), _                      pvToCLSID(sEncoderStr), _                      ByVal 0&)     End If     SaveImageToFile = CBool(nStatus = 0)     Call GdipDisposeImage(pNewImage)   End If   End Function ' // クリップボード hBitmap を取得する Private Function pvGetHBitmapFromClipboard() As OLE_HANDLE   If OpenClipboard(0&) <> 0 Then     pvGetHBitmapFromClipboard = GetClipboardData(CF_BITMAP)     Call CloseClipboard   End If End Function ' // 文字列から CLSID を取得する Private Function pvToCLSID(ByVal S As String) As GUID   CLSIDFromString StrPtr(S), pvToCLSID End Function ' // サンプル: Active シート内のシェープを Jpeg で保存する Sub Sample()      Dim shp  As Shape   Dim hBmp  As OLE_HANDLE   Dim nCount As Long      ' シート内のシェープを選択する   nCount = 0   For Each shp In ActiveSheet.Shapes     ' shp.Type プロパティーの値で選択するか決める     Select Case shp.Type       Case msoFormControl, msoOLEControlObject       Case Else         shp.Select Replace:=False         nCount = nCount + 1     End Select   Next      If nCount > 0 Then     ' GDI+ を初期化する     If GDIplus_Initialize() = False Then       MsgBox "GDI+ を初期化できません", vbCritical       Exit Sub     End If     ' クリップボードにコピーする     Selection.CopyPicture xlScreen, xlBitmap     ' Bitmap のハンドル(メモリ上のアドレスみたいなもの)を取得     hBmp = pvGetHBitmapFromClipboard()     ' 保存(JPEG でクオリティー30の場合)     If SaveImageToFile(hBmp, "C:\sample.jpg", "jpg", 30) = False Then       MsgBox "保存に失敗", vbCritical     Else       MsgBox "保存に成功", vbInformation     End If     ' GDI+ を終了させる(必ず呼び出すこと)     Call Gdiplus_Shutdown   Else     MsgBox "保存すべきものがない", vbCritical   End If End Sub

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

#3です。 セレクトしないと動かないコードなので、 For Each shp In Sheets("Sheet1").Shapes →ActiveSheet.Shapes に変更願います。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2です。 参考URLのコードを改造させていただいて、コントロールツールボックスのアイテム以外を選択して、クリップボードにコピーし、JPEGで保存する様にしてみました。当該ブログのオーナー様ご容赦下さい。 '参考URLのSaveClipToJpgの代わりに使う Sub SaveShapesToJpg() Dim tFltImg As FLTIMAGE Dim tFltFile As FLTFILE Dim hemf As Long Dim hMem As Long Dim shp As Shape Dim myArray() As Variant Dim lcnt As Long Const sSavePath As String = "c:\testshape.jpg" For Each shp In Sheets("Sheet1").Shapes If Not shp.Type = msoOLEControlObject Then ReDim Preserve myArray(lcnt) myArray(UBound(myArray)) = shp.Name lcnt = lcnt + 1 End If Next shp 'クリップボードにコピー ActiveSheet.Shapes.Range(myArray).Select Selection.Copy If OpenClipboard(0) Then hemf = CopyEnhMetaFile( _ GetClipboardData(CF_ENHMETAFILE), _ vbNullString) CloseClipboard End If If hemf = 0 Then Exit Sub ' パラメータ設定 tFltFile.Path = sSavePath & vbNullChar With tFltImg .StructSize = LenB(tFltImg) .Type = 1 .hImage = hemf End With ' フィルタ呼び出し If GetFilterInfo(3, 0, hMem, &H10000) And &H10 Then If ExportGr(tFltFile, tFltImg, hMem) <> 0 Then MsgBox "失敗しました" End If End If If hMem Then GlobalFree hMem DeleteEnhMetaFile hemf End Sub

回答No.1

2種類の方法を ●方法1 画面のハードコピー(PrintScreenキー)を取り、ペイントに貼り付ける。 必要な部分のみ切り出して、jpegで保存する。 ●方法2 エクセルをHTML形式で保存する。 オートシェープはgifとして保存される。 ペイントでgifを読込み、jpegで保存する。

yukiko125
質問者

補足

申し訳ありません。 説明が足りませんでした。 エクセルのマクロで行いたいのですが可能でしょうか? オートシェープは、楕円とテキストボックスがあり、コマンドボタンもありますが、これは省きたいです。

関連するQ&A

  • Word2000 オートシェイプの設定を保存したい。

    お世話になっております。 Word2000です。 オートシェイプの設定を保存したいのです。 例:例えば、オートシェイプで、「吹き出し」を選択。 オートシェイプの書式設定ダイヤログ→「テキストボックス」タブのテキストボックスと文字列の間隔をすべて0にする。 上記のようなことを設定してから、オートシェイプの上で右クリック→オートシェイプの規定値に設定ボタンをおしても、その画面しか、規定値になりません。編集しているファイルを閉じて、もう一度立ち上げても、上記で規定値に設定したのも保存されてないんですね。。 Wordすべてにおいて規定値にする方法はないんでしょうか?

  • ExcelVBA オートシェイプについて

    セルの選択した場所のとなりにオートシェイプを移動させるマクロを組みたいと思っています 見かけがまったく同じシートが4枚あり、そのシート全てに同じマクロを指定したいのですが、オートシェイプの名前の指定の仕方が分からなく困っています SelectionChangeイベントでオートシェイプ移動のマクロを動かしているので、同じ名前のボタンならよいのですが・・・ なにかよい方法はないでしょうか?

  • オートシェイプが消えたり出たりする

    Windows 7+ Excel 2013を利用しています。 オートシェイプを200個位(四角、丸)入れています、重ね合わせはありません。 エクセルで職場のレイアウトを作成・更新しているのですが、 突然、全てのオートシェイプが表示されなくなり、オートシェイプがあるあたりの セルをクリックしたら、幾つかのオートシェイプが表示され、マウスを動かすと オートシェイプが消えてしまいます。 また、別のセルをクリックしたら、先とは、違うパターンで幾つかオートシェイプが 表示され、マウスを動かすと、何個かオートシェイプが表示されたまま、他のが消えます。 オブジェクトの選択と表示では、全て表示になっていますが、一旦、全て非表示にして、全て表示にしても、全く、オートシェイプが表示されません。 慌てて、保存せずに、終了して、パソコンを再起動、変になったエクセルブックを開いても直っていません。 仕方なく、先月のブックをコピーして、修正しています。 変になったエクセルブックですが、他のパソコン何台かで開いても同じようになります。 マクロでもあるのかと思い、Alt + F10を押してみましたが、コードは書かれていません。 諦めかけていたら、調べていないPCから開いたら、表示されています。 そこで、そのPCで上書き保存してから、変になったPCで開いたら、表示されています。 何故なんでしょうか? エクセルブックは、壊れてなかったんでしょうか?

  • エクセル:シート上の「オートシェイプ」のみの一括削除について

    お世話になります。過去に同じ質問があればお許しください。 『シート上のオートシェイプ(図形)だけの削除』について、 普通の消去等では残ってしまいます。 シート上のすべてのオートシェイプのみの一括削除の仕方を教えてください。よろしくお願いいたします。

  • エクセル オートシェイプ

    ご教授下さい。 エクセルでオートシェイプを使用しようとしたところ、 左下の 「オートシェイプ」をクリック、線や基本図形など すべて使用できなくなっていました。 通常は、選択すると黒線が出てますが、線が真っ白です。 このエクセルの書類は、知人を介して送られてきたものです。 シートやブックの保護などはしておりませんし、特別な保護 もしてないと言われました。 他のエクセル書類や新規にエクセルを立ち上げた場合は、ちゃ んとオートシェイプは使用できます。 解除の仕方、設定方法がございましたら教えて下さい。 何卒宜しくお願い申し上げます。

  • Excel2003 オートシェイプにハイパーリンクは?

    いつもお世話になっております。 またまたどなたかお知恵をお貸し下さい。 今Excel2003で資料作成中なのですが、Sheet1のオートシェイプからSheet2のオートシェイプでジャンプするようなハイパーリンクを貼りたいと思っているのですが、ハイパーリンクの設定画面だとリンク先がセルしかできないようで・・オートシェイプ同士のリンクはできないのでしょうか? よろしくお願いします。

  • オートシェイプが解除できない

    Word2003で文字の上にオートシェイプで「丸」を描いて保存した後、間違った場所に「丸」を描いたのに気付き、 そのファイルを開いて「丸」を削除しようとしたのですが、その「丸」が選択できません。 どうしたらオートシェイプで描いた「丸」を消すことができるのでしょうか?

  • Excel、VBAでのオートシェイプの選択方法

    Excelのワークシート上にある、オートシェイプの選択方法を教えてください。 オートシェイプは挿入タブの、図から挿入した正方形、矢印、円です。 それぞれすべてを選択した状態にするにはどのようにすればよいのでしょうか。 宜しくお願いします。

  • もともとあったオートシェイプと同じ大きさで図を挿入

    Excelで、 あらかじめ描かれているオートシェイプの四角形を選択し、[挿入]-[図]-[ファイルから]で図(写真)を選択すると、あらかじめ描かれてあった四角形と同じサイズで図が挿入される(例えば、高さ5cm幅6cmで描いたオートシェイプを選択した状態でJPGの写真挿入を試みると、その写真は自動的に高さ5cm幅6cmの大きさになり、オートシェイプの上に挿入される) ・・・というような事は出来ますでしょうか? 説明が上手くできなくて申し訳ないのですが、よろしくお願いいたします。

  • オートシェイプについて

    すいませんが、オートシェイプについて教えてください。 同じオートシェイプを複数描くにはどうすればよいのでしょうか?たとえば、基本図形から円を選択して引きます。つづけて、円を再度引きたい場合、また基本図形から円を選択して引くしか方法はないのでしょうか? 一度選択した図形を連続して描く方法を教えてください。

専門家に質問してみよう