VBAで結合セルに貼付けた図だけを変更する方法

このQ&Aのポイント
  • VBAについて質問です。結合セルに画像を貼り付けると、すべての画像が変更されてしまいます。図の貼り付けを行う際に、特定の結合セルだけを対象に図を変更する方法を教えてください。
  • 質問内容は、VBAを使用して結合セルに貼り付けた図のうち、特定の結合セルだけを変更したいというものです。現在の問題点としては、図の貼り付けによってすべての画像が変更されてしまうことです。対処方法を教えていただけると助かります。
  • VBAを用いて結合セルに画像を貼り付ける場合、すべての画像が変更されてしまう問題に遭遇しました。図の貼り付けにおいて特定の結合セルだけを対象に図を変更する方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

VBA 図の選択

VBAについて質問です。 結合セルに画像を貼付けるとすべての画像が変更してしまいます。 ご教示をお願いいたします。 目的:結合セルに貼付る図だけを変更したい。 症状:下記のプログラムを実行すると、シート上のすべての図が変更してしまいます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$D$5:$U$18" Then Call 図の挿入 '#1   '省略 If Target.Address = "$X$5:$AO$18" Then Call 図の挿入 '#12 End Sub Sub 図の挿入() Application.Dialogs(xlDialogInsertPicture).Show Call 図の貼付 End Sub Sub 図の貼付() Dim sp As Shape For Each sp In ActiveSheet.Shapes If sp.Type = msoPicture Then sp.LockAspectRatio = msoTrue sp.Top = sp.TopLeftCell.Top sp.Left = sp.TopLeftCell.Left If sp.Width * ActiveCell.MergeArea.Height / sp.Height < ActiveCell.MergeArea.Width Then sp.Height = ActiveCell.MergeArea.Height '--高さ基準 Else sp.Width = ActiveCell.MergeArea.Width '--幅基準 End If End If Next End Sub

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

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

#1,2です。 全列幅を18pixelに変更したシートに、7200×5200の画像を読みこんでみると現象が再現されました。 安直な対策案ですが、列幅を狭くしてない作業用シートに一旦読みこんで、サイズを縮小した後、 目的のシートにカット&ペーストし、更に目的のサイズに変更します。ペーストの際に、JPEG形式で貼り付けると、元に戻せない代わりにファイルサイズが小さくなります。 Private Sub insertPic(myRange As Range) Dim myPic As Picture Dim myRatio As Double Application.ScreenUpdating = False '列幅を狭くしてない作業用シートを指定 Sheets(2).Activate If Application.Dialogs(xlDialogInsertPicture).Show = False Then Exit Sub Set myPic = Selection myPic.Width = myPic.Width / 10 '適当なサイズに縮小 myPic.Height = myPic.Height / 10 myPic.Cut Me.Activate myRange.Activate Me.Paste 'ファイルサイズを小さくしたければ代わりに下記を採用してください ' Me.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False Set myPic = Selection myRatio = myPic.Width / myPic.Height If myPic.Width * myRange.Height / myPic.Height < myRange.Width Then myPic.Height = myRange.Height myPic.Width = myRange.Height * myRatio Else myPic.Width = myRange.Width myPic.Height = myRange.Width / myRatio End If Application.ScreenUpdating = True End Sub なお、ご質問の追加の件ですが、一応動くようになって判明した問題点なので許容範囲内かと思いますが、当方夜しか対応できませんので、質問を別立てにしていれば他の方からの回答も期待できるかもしれません。

その他の回答 (2)

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

#1です。 とりあえず何もしないで抜けるなら、 Application.Dialogs(xlDialogInsertPicture).Show に代えて If Application.Dialogs(xlDialogInsertPicture).Show = False Then Exit Sub として下さい。

blue_lace
質問者

お礼

mitarasiさん、回答ありがとうございます。 if =false にはこういう使い方ができるのですね。 VBA初心者の私には新しい発見です、本当にありがとうございます。

blue_lace
質問者

補足

回答ありがとうございます。 問題の「エラー処理」は解決いたしました。 しかし、新たな問題がありますので質問いたします。 大きすぎる図(シートより大きな写真)を貼り付けた場合、 図の縦横比が、原型のサイズの縦横比と違ってしまいます。 目的:指定したセルのサイズの中に、図の原型の縦横比で貼り付ける。 症状:図をシートに挿入した段階で、図の縦横比が変更している。それは、行の数はIVまでしかないので、図の幅がシートの行の幅まで小さくなってしまいます。  ※例 図の高さ100%幅80% 新たに質問すべきか迷いましたが、この場で質問いたしました。 今回が初めての質問となります、今回の質問のマナーについても、ご意見を伺えればうれしいです。

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

VBA歴はそこそこ長いつもりですが、もっぱらPictures.Insertを使っていて、Application.Dialogs(xlDialogInsertPicture).Showは使った事がありませんでした。 試しにやってみました。なお当方xl2000です。 元のコードは沢山の画像のなかから該当するものを見つけて処理しようとして苦労しているので、貼り付けた画像をObject変数で受けてから操作すると自由が利くと考えたのですが、 画像貼付後にSelectionをShape型にsetしようとすると型違いのエラーになってしまうので、やむを得ずPicture型で受けたところ、元々のコードとはかけ離れてしまいましたが、ご参考まで。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$D$5:$U$18" Then Call insertPic(Target) End Sub Private Sub insertPic(myRange As Range) Dim myPic As Picture Application.Dialogs(xlDialogInsertPicture).Show Set myPic = Selection Call pastePic(myPic, myRange) End Sub Sub pastePic(sp As Picture, myRange As Range) Dim myRatio As Double sp.Top = myRange.Top sp.Left = myRange.Left myRatio = sp.Width / sp.Height If sp.Width * myRange.Height / sp.Height < myRange.Width Then sp.Height = myRange.Height '--高さ基準 sp.Width = myRange.Height * myRatio Else sp.Width = myRange.Width '--幅基準 sp.Height = myRange.Width / myRatio End If End Sub

blue_lace
質問者

補足

回答ありがとうございます。 問題の「すべての図が変更してしまう」は解決しました。 しかし、「図の挿入」ダイアログを開き、図を選択せずに閉じると、 「実行時エラー '13': 型が一致しません。」 「Set myPic = Selection」が黄色に塗りつぶし が出て、デバッグになってしまいます。 どのようなエラー処理の方法があるのか、ご教示いただけると助かります。

関連するQ&A

  • VBAの写真貼り付けコードについて教えてください。

    写真をダブルクリックで簡単に貼り付けられるVBAのプログラムを友人に貰ったのですが、 追加で図の外枠に黒の2.5ptくらいの線を縁取る文を追加しようと、マクロで記録したプログラムを 入れてみたのですが上手く動作しません。 コードが --------------------------------------------------------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Cancel = True If Target.MergeCells = False Then Exit Sub '===============画像選択 myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then Exit Sub End If '===============画像の掃除 For Each mySP In ActiveSheet.Shapes myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete Next '===============画像の貼り付け Set mySP = ActiveSheet.Pictures.Insert(myF) '===============タテヨコの縮尺を保持 myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If '===============中央へ調整 myHH2 = (Target.Height / 2) - (mySP.Height / 2) myWW2 = (Target.Width / 2) - (mySP.Width / 2) mySP.Top = Target.Top + myHH2 mySP.Left = Target.Left + myWW2 Set mySP = Nothing End Sub ------------------------------------------------------------------------- お願いいたします。

  • VBAの修正コードを教えてください(初心者)

    いつもお世話になっております。 下記のVBAコードを使わせて頂き、自分で作成したエクセルにセルに合わせて自動で画像データを添付するようにしたいのですが。 (1)タテヨコの縮尺を保持⇒セルに合わせて縦横の変倍を行う (2)又は、貼付部のセルのサイズは決まっているのでサイズを指定して貼り付ける となるように修正したいのですが、なにぶんVBAは初心者なもので、全くわかりません。 どなたかご指導を宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Cancel = True '===============画像選択 myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then MsgBox "画像を選択してください(終了)" Exit Sub End If '===============画像の掃除 For Each mySP In ActiveSheet.Shapes myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete Next '===============画像の貼り付け Set mySP = ActiveSheet.Pictures.Insert(myF) '===============タテヨコの縮尺を保持 myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If '===============中央へ調整 myHH2 = (Target.Height / 2) - (mySP.Height / 2) myWW2 = (Target.Width / 2) - (mySP.Width / 2) mySP.Top = Target.Top + myHH2 mySP.Left = Target.Left + myWW2 Set mySP = Nothing End Sub

  • VBAの操作方法について教えてください(初心者)

    いつもお世話になっております。 以下のような操作をエクセルにおいて行いたいのですが。 (1)エクセルのセルをクリック! (2)エクスプローラー起動!画像データを選択! (3)セルに合わせて縦横変倍をかけてデータ(JPGデータ)を貼付! 同様の操作が可能な以下のVBAが公開されていたので使わせて頂こうと考えているのですが、操作方法が分かりません。 VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END Attribute VB_Name = "Sheet1" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = True Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Cancel = True '===============画像選択 myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then MsgBox "画像を選択してください(終了)" Exit Sub End If '===============画像の掃除 For Each mySP In ActiveSheet.Shapes myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete Next '===============画像の貼り付け Set mySP = ActiveSheet.Pictures.Insert(myF) '===============タテヨコの縮尺を保持 myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If '===============中央へ調整 myHH2 = (Target.Height / 2) - (mySP.Height / 2) myWW2 = (Target.Width / 2) - (mySP.Width / 2) mySP.Top = Target.Top + myHH2 mySP.Left = Target.Left + myWW2 Set mySP = Nothing End Sub 作成したエクセルのVBエディタを開く⇒標準モジュールの作成⇒上記VBAをコピペ・・・ 正直わかりません。昨日一晩かけて調べたのですがわかりません。 どなたか宜しくお願い致します。

  • VBA/Worksheet_Changeがうまくいかない

    エクセル2000です。 以下のワークシートチェンジイベントがうまくいきません。 Targetに値が入る場合は問題ないのですが、TargetをクリアしてもRange("F5").MergeAreaがクリアされません。 Targetをクリアした後、TargetをダブルクリックしてからEnterキーを押せばRange("F5").MergeAreaがクリアされるのですが、いちいちそうさせるわけにもいきません。 どうしたらよいのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$C$5" Then Exit Sub If Target.Value <> "" Then Range("F5").Value = Range("D42").Value Else Range("F5").MergeArea.ClearContents End If End Sub

  • エクセルの画像リンク解除

    Pictures.Insert で書かれた内容を Shapes.AddPicture の構文に変更したいのですが、 VBAの知識が乏しいので、なかなかうまくいきません。 どなたかわかる方はいらっしゃいますでしょうか? 宜しくお願いします。 Sub Test() Range("B3").Select Dim fName, pict As Picture fName = Application.GetOpenFilename("JPG, *.jpg", MultiSelect:=True) If IsArray(fName) Then For i = 1 To UBound(fName) Set pict = ActiveSheet.Pictures.Insert(fName(i)) pict.TopLeftCell = ActiveCell pict.Width = ActiveCell.Width * 2 pict.Height = ActiveCell.Height * 6 ActiveCell.Offset(7, 0).Activate Next i End If End Sub

  • エクセルに写真を挿入するVBA

    エクセルで写真集を作るためのVBAですが、以下のVBAでは画像がリンク貼り付けになってしまいます。どうしたらエクセルファイルに画像を貼りこみで保存できるのでしょうか? よろしくお願いいたします。 やりたいことは、まずダブルクリックでダイアログボックスを表示させ、挿入したい写真を選択、写真がセルに合わせた大きさに縮小、セルの中央に写真を配置。以上です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _                     Cancel As Boolean)   Dim PicFile As Variant   Dim rX As Double, rY As Double   '[ファイルを開く]ダイアログボックスを表示   PicFile = Application.GetOpenFilename( _             "画像ファイル,*.jpg;*.jpeg;*.gif;*.tif;*.png;*.bmp")   If VarType(PicFile) = vbBoolean Then Cancel = True: Exit Sub   Application.ScreenUpdating = False      '画像を挿入   With ActiveSheet.Pictures.Insert(PicFile)     rX = Target.Width / .Width     rY = Target.Height / .Height     If rX > rY Then       .Height = .Height * rY     Else       .Width = .Width * rX     End If     'セルの中央(横方向/縦方向の中央)に配置     .Left = Target.Left + (Target.Width - .Width) / 2     .Top = Target.Top + (Target.Height - .Height) / 2   End With      Application.ScreenUpdating = True   Cancel = True End Sub

  • 教えてください。

    教えてください。 初めての投稿になります、書き込みなど不慣れ点あるかも知れませんが宜しくお願いいたします。 エクセル2007のマクロ、VBA書き込みについて 指定された結合セルのみに画像挿入したいのです下記のVBAではすべてのセルに たいして画像挿入されてしまいます、結合セル三か所のみ反映したいのですが。 rivate Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Cancel = True '===============画像選択 myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then MsgBox "画像を選択してください(終了)" Exit Sub End If '===============画像の掃除 For Each mySP In ActiveSheet.Shapes Debug.Print mySP.Name If InStr(mySP.Name, "Drop Down") = 0 Then myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete End If Next '===============画像の貼り付け Set mySP = ActiveSheet.Pictures.Insert(myF) '===============タテヨコの縮尺を保持 myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If '===============中央へ調整 myHH2 = (Target.Height / 2) - (mySP.Height / 2) myWW2 = (Target.Width / 2) - (mySP.Width / 2) mySP.Top = Target.Top + myHH2 mySP.Left = Target.Left + myWW2 Set mySP = Nothing End Sub セル指定 縦B9からB21(195(260ピクセル) 横BからE(40.02(340ピクセル) その他2つの結合セルがあります、サイズはすべて同じです 縦B24からB36  縦B39からB51 横BからE       横BからE  何分素人ですので、どのランに書き込めばいいのかもわかりません いろんなVBAをコピーして貼り付けましたがうまくいきませんでした 宜しくご享受お願いいたします。   

  • VBA Offsetで選択セルを移動させる

    よろしくお願いします。 H8から一行づつ下げてH10まで来たらH15まで飛ばして また一行づつ下げていく。 H20まで来たらH27まで飛ばしてまた一行づつ下げていく。 このようにしたいのですが、構文が解りません。 Private Sub CommandButton1_Click() If ActiveSheet.Range("H8").Activate Then ActiveCell.offset(1, 0).Activate Else ActiveCell.offset(1, 0).Activate End If If ActiveSheet.Range("H10").Activate Then ActiveCell.offset(5, 0).Activate Else ActiveCell.offset(1, 0).Activate End If If ActiveSheet.Range("H20").Activate Then ActiveCell.offset(7, 0).Activate Else ActiveCell.offset(1, 0).Activate End If End Sub

  • エクセル 写真貼り付け マクロ

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Cancel = True '===============画像選択 myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then MsgBox "画像を選択してください(終了)" Exit Sub End If '===============画像の掃除 For Each mySP In ActiveSheet.Shapes myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete Next '===============画像の貼り付け Set mySP = ActiveSheet.Pictures.Insert(myF) '===============タテヨコの縮尺を保持 myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If '===============中央へ調整 myHH2 = (Target.Height / 2) - (mySP.Height / 2) myWW2 = (Target.Width / 2) - (mySP.Width / 2) mySP.Top = Target.Top + myHH2 mySP.Left = Target.Left + myWW2 Set mySP = Nothing End Sub ネットでこのマクロを見つけて応用したいのですが 教えてください セルをダブルクリックすると画像が選べて貼り付けできるのですが 全部のセルに反応してしまいます セルの範囲指定したいのですがどうすればいいでしょうか? (1)セル結合でA1:D7範囲だけにこのマクロを入れておきたい場合 (2)セル結合でA1:D7とX1:AA4までとか複数選択したい場合 宜しくお願いします

  • マクロで画像挿入の質問です

    マクロ 初心者です。 ワークシート指定して、ダブルクリック等を使っての画像選択、貼り付け&セルの大きさに合わせる)ことはできるのですが、 ダブルクリック等ではなく、手動でマクロを実行して指定のセル(B37)に貼り付けることはできるでしょうか?(セルの大きさに画像が変換するのは生かしたまま) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)を sub マクロ名()にして、Moduleに貼り付けて実行したら myAD2 = Target.Address 上記場所でエラーになってしまいます。 どのように変更したら、できるでしょうか?または、できる手段はないのでしょうか? ご教授お願いします。 使用ベースマクロは以下です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True '===============画像選択 myF = Application.GetOpenFilename _ ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False) If myF = False Then MsgBox "画像を選択してください(終了)" Exit Sub End If '===============画像の掃除 For Each mySP In ActiveSheet.Shapes myAD1 = mySP.TopLeftCell.MergeArea.Address myAD2 = Target.Address If myAD1 = myAD2 Then mySP.Delete Next '===============画像の貼り付け Set mySP = ActiveSheet.Pictures.Insert(myF) '===============タテヨコの縮尺を保持 myHH = Target.Height / mySP.Height myWW = Target.Width / mySP.Width If myHH > myWW Then mySP.Height = mySP.Height * myWW mySP.Width = Target.Width Else mySP.Height = Target.Height mySP.Width = mySP.Width * myHH End If '===============中央へ調整 myHH2 = (Target.Height / 2) - (mySP.Height / 2) myWW2 = (Target.Width / 2) - (mySP.Width / 2) mySP.Top = Target.Top + myHH2 mySP.Left = Target.Left + myWW2 Set mySP = Nothing End Sub

専門家に質問してみよう