• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:excelでオブジェクト(写真)を固定するには)

Excelでオブジェクトを固定し、商品の表に写真をつける方法は?

このQ&Aのポイント
  • Excelで商品の表を作成し、各行に写真を挿入する方法を教えてください。
  • 商品の表には番号、商品名、説明、備考の項目があり、右端に写真用のボタンがあります。
  • 写真はオブジェクトとして挿入し、各行の商品の写真の欄に固定されるようにしたいです。また、写真はクリックすると即座に表示され、閉じることができるようにしたいです。

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

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

#1です。誰も期待していないと思いますが、グラフを介する方法がうまくいかなかった理由が判明しました。一旦ワークシートに貼付、縮小し、切り取り、JPEGで再度貼り付ける事でリサイズしようとしていたのですが、ワークシートに貼り付けているつもりが、グラフ上に貼り付けてしまっていたのでした。コードは次の通りですが、試行錯誤の名残で冗長かもしれません。 xl2010でも動作しましたが、xl2000では発生しなかった広い余白が発生したりします。また、画面更新を止めてあるつもりですが、一瞬画像の切り貼りが表示されたりします。 添付画像は少々わかりにくいかもしれませんが、xl2010での実行例です。 Sub pastePic2Comment() Dim myComment As Comment Dim myWidth As Double, myHeight As Double Dim myChart As Chart, myChartName As String Dim currentWS As Worksheet, currentCell As Range Dim myPicture As Picture Dim picPath As String Const lsLength As Double = 300 Set currentCell = ActiveCell Application.ScreenUpdating = False picPath = Application.GetOpenFilename("画像ファイル , *.*") If picPath = "False" Then Exit Sub Set currentWS = ActiveSheet Set myPicture = currentWS.Pictures.Insert(picPath) With myPicture If .Width > .Height Then myWidth = lsLength myHeight = lsLength * .Height / .Width Else myWidth = lsLength * .Width / .Height myHeight = lsLength End If .Width = myWidth .Height = myHeight End With Set myChart = Charts.Add Set myChart = myChart.Location(Where:=xlLocationAsObject, Name:=currentWS.Name) myChart.ChartArea.Border.LineStyle = 0 myChartName = Trim(Replace(myChart.Name, currentWS.Name, "")) currentWS.Shapes(myChartName).Width = myWidth + 6 currentWS.Shapes(myChartName).Height = myHeight + 6 myPicture.Cut currentCell.Activate currentWS.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False Set myPicture = Selection myPicture.Cut myChart.Paste myChart.Export "C:\temp.jpg" currentWS.Shapes(myChartName).Delete ActiveCell.ClearComments Set myComment = ActiveCell.AddComment With myComment.Shape .Line.Visible = msoTrue .Fill.Visible = msoTrue .Fill.ForeColor.RGB = RGB(255, 255, 255) .Fill.UserPicture "C:\temp.jpg" .Width = myWidth .Height = myHeight End With Application.ScreenUpdating = True End Sub

mrkw1204
質問者

お礼

重ねてのお返事本当にありがとうございました。 御礼が遅くなり、大変申しわけありません。 せっかく詳しくお教え下さったのですが、残念ながら私にはちょっと理解が及ばないです。 ご丁寧な回答をいただいたのに、本当に申しわけありません。 どなたかが、検索等でこの質問を見て役に立てて下さることを祈っています。 何度もご丁寧にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

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

お望みの物とは異なると思いますが、昔投稿した、コメントに縮小画像を貼り付けるコードの簡略化にトライしてみました。 コメントに貼り付けるにはリサイズした画像をファイル保存後、読みこむ必要があります。縮小画像の保存にChartのExport機能を使おうと試みましたが、Chartに貼り付ける際に画像が変形されてしまってうまくいっておりません。 やむを得ずOfficeのグラフィックフィルターを用いる方法を使用しておりますが、JPEGの画質はいまいちです。 xl2010(WinXP SP3)での動作も確認しましたが、xl2000より画像の変換が非常に遅いです(前者はCeleron2.4G、後者はPentiumM 1.3G)2000ではプログレスバーが殆ど視認できないのに対し、2010では一秒近く表示されています。 Private Type FLTIMAGE StructSize As Integer Type As Byte Reserved1(0 To 8) As Byte hImage As Long Reserved3(0 To 19) As Byte End Type Private Type FLTFILE Reserved1 As Integer Ext As String * 4 Reserved2 As Integer Path As String * 260 Reserved3 As Currency End Type Private Declare Function GetFilterInfo Lib _ "C:\Program Files\Common Files\Microsoft Shared\Grphflt\JPEGIM32.FLT" _ (ByVal Ver As Integer, ByVal Reserved As Long, _ phMem As Long, ByVal flags As Long) As Long Private Declare Function ExportGr Lib "JPEGIM32.FLT" _ (ff As FLTFILE, fi As FLTIMAGE, ByVal hMem As Long) As Long 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 Const CF_ENHMETAFILE = 14 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 Private Declare Function GlobalFree Lib "kernel32" _ (ByVal hMem As Long) As Long Sub pastePic2Comment() Dim myComment As Comment Dim myWidth As Double, myHeight As Double Dim myChart As Chart, myChartName As String Dim currentWS As Worksheet Dim myPicture As Picture Dim picPath As String Const lsLength As Double = 400 'ここで画像の長片サイズを指定 Application.ScreenUpdating = False picPath = Application.GetOpenFilename("画像ファイル , *.*") If picPath = "False" Then Exit Sub Set currentWS = ActiveSheet Set myPicture = currentWS.Pictures.Insert(picPath) With myPicture If .Width > .Height Then myWidth = lsLength myHeight = lsLength * .Height / .Width Else myWidth = lsLength * .Width / .Height myHeight = lsLength End If .Width = myWidth .Height = myHeight End With SaveClipToJpg myPicture, "c:\temp.jpg" myPicture.Delete ActiveCell.ClearComments Set myComment = ActiveCell.AddComment With myComment.Shape .Line.Visible = msoTrue .Fill.Visible = msoTrue .Fill.ForeColor.RGB = RGB(255, 255, 255) .Fill.UserPicture "C:\temp.jpg" .Width = myWidth .Height = myHeight End With Application.ScreenUpdating = True End Sub ' 出典 : http://vbatips.blog37.fc2.com/blog-entry-26.html#more 'imgの型のみ変更 Function SaveClipToJpg(img As Picture, Path As String) As Boolean Dim tFltImg As FLTIMAGE Dim tFltFile As FLTFILE Dim hemf As Long Dim hMem As Long SaveClipToJpg = False 'クリップボードにコピー img.CopyPicture 'Selection.CopyPicture If OpenClipboard(0) Then hemf = CopyEnhMetaFile( _ GetClipboardData(CF_ENHMETAFILE), _ vbNullString) CloseClipboard End If If hemf = 0 Then Exit Function ' パラメータ設定 tFltFile.Path = Path & 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 SaveClipToJpg = True End If End If If hMem Then GlobalFree hMem DeleteEnhMetaFile hemf End Function 画像を100個もブックに取り込むとファイルが大きくなり、メール送信できなくなりますので、画像サイズを調整して下さい。 長片サイズ400で、330KB/10画像、100の場合で50KB/10画像程度でした。ご参考まで。

参考URL:
http://vbatips.blog37.fc2.com/blog-entry-26.html#more
mrkw1204
質問者

お礼

次の回答とあわせ、幾度も詳しい回答をありがとうございました。 御礼が遅くなり、申しわけありませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A