VBAによる写真の貼り付け

このQ&Aのポイント
  • VBAを使用して、EXCEL2010上の特定のセルに名前を選択すると、対応する写真を表示したいと考えています。しかし、コードの一部でエラーが発生してしまいます。
  • 問題のコードは他の方のものを参考にしており、該当の写真を削除してから指定のセルに貼り付ける処理を行っています。
  • 原因はわかりませんが、エラーの箇所に問題がある可能性があります。他の部分も教えていただけると助かります。
回答を見る
  • ベストアンサー

VBAにて写真貼り付け

EXCEL2010を使用しています。 D3に於いて名前を選択できるようにしています。D3に入力する名前と同一の写真(JPG)がDISK TOP上フォルダー内に複数あります。 D3で名前選択時,該当する写真をA5:M29に表示したい。 以下のコードは他の方が使われてるコードを参考にしたもので、※印の場所でエラーとなります何が 原因なのか?他の部分も合わせ教えて下さい。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$3" Then myPath = "C:\Users\Users\DeskTop\PHOT" myFile = myPath & Range("D3").Text & ".jpg" For Each sh In ActiveSheet.Shapes If Left(sh.Name, 7) = "Picture" Then sh.Delete End If Next Range("A5:M29").Select myTop = Selection.Top myLeft = Selection.Left myWidth = Selection.Width myHeight = Selection.Height ※ActiveSheet.Pictures.Insert(myFile).Select With Selection .Top = myTop .Left = myLeft .Width = myWidth '画像の幅 .Height = myHeight '画像の高さ End With Range("D3").Select End If End Sub

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

この手の質問ではエラー内容を記述するようにしましょう。 >myPath = "C:\Users\Users\DeskTop\PHOT" >myFile = myPath & Range("D3").Text & ".jpg" 原因は上記箇所にあります。 例えば、このmyPath(フォルダパス)で、D3に「TEST」と入力すれば myFileの中身は「C:\Users\Users\DeskTop\PHOTTEST.jpg」このようになります。 目的は「C:\Users\Users\DeskTop\PHOT\TEST.jpg」でしょうから以下の修正の何れかの方法で修正してください。 (注)(1)~(3)の全て行うのではなく3(+1)通りありますので、    何れかのお好きな方法で修正願います) (1)コードをそのままで使用する場合  D3セルのファイル名の先頭に「\」を付けて入力する。  上記例だと「\TEST」と入力してください。 (2)フォルダパスの最後に「\」を付けて設定する  >myPath = "C:\Users\Users\DeskTop\PHOT"         ↓  myPath = "C:\Users\Users\DeskTop\PHOT\" としてください。 (3)変数、セルの内容はそのままにコードで対応する(2通り)  >myPath = "C:\Users\Users\DeskTop\PHOT"  >myFile = myPath & Range("D3").Text & ".jpg"  上記コードの「間」に以下のコードを追加してください。  If Not myPath Like "*\" Then myPath = myPath & "\"  または、  >myFile = myPath & Range("D3").Text & ".jpg"          ↓  myFile = myPath & "\" & Range("D3").Text & ".jpg"

okamoto27
質問者

お礼

ありがとうございました。無地解決しました

okamoto27
質問者

補足

ご回答いただき有難うございます。ご指摘通り修正しましたが PicturesクラスのInsertプロパティを取得出来ません(実行時エラー1004) ※ActiveSheet.Pictures.Insert(myFile).Selectにて停止してしまいます。 フォルダパス&ファイル名を確認しても間違い無いのですが

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

>D3に於いて名前を選択できるようにしています どういうこと?選択はコンボやリストボックスを使うのではないか? たとえば、複数ファイルを候補として表示し、すなわちファイル名で先頭から「Picture」のものを表示して、1つを選ばせるとか?その際ある1のフオルダを決めること(簡単にするため、手作業ででも、集めること)。 ほかに拡張子が「.Jpg」のものらしいが。 >D3で名前選択時,該当する写真をA5:M29に表示したい。 写真は同時複数選択をありに、考えるのか? こんな、質問者に取って、適当かどうか判らんコードを載せるより、VBSCRIPTのフォルダ内のファイルを限定して探すプログラムをWEBで探せばよい。検索語は「VBSCRIPT フォルダ ファイル (を列挙)」でどうかな。「For Each Next」で探すのがコード的にやさしかろう。たくさんWEBにコード例があるよ。過去質問もたくさんあった。別方法としてDir関数でもできる。 この質問の例示コードを捨てて考えた方がよい。 セル1個に写真を1枚なら、一つのセルのLEFT,TOP、WIDTH、HEIGHTを、シートに写真挿入後変えたら(設定したら)よい。 ーー 読みなおすと、セルのChangeイベントでTargetでファイルを選択させているようだが、小手先にすぎると思う。Changeイベントの使い方はむつかしいと思う(初心者には範囲や取り消しなど手当てがむつかしい)。 自分だけが趣味で使うなら、どうしようが勝手だが。

関連するQ&A

  • エクセルのマクロで画像を貼り付け 

    画像をエクセルに貼り付ける作業を行っています。 マクロを使いファイル内の画像(約30枚程度)を1列づつスペースを空け 右方向に4枚 1行スペースを空け 3行目の左に戻り その位置よりまた1列づつスペースを空け右方向に4枚・・・・・ これを繰り返しファイル内の画像をすべて 貼り付けたいのですがうまく動作が出来ません。 何卒ご教授の程よろしくお願いします。 ※マクロ Sub EggFunc_pasteDirImage() ' 変数定義 Dim fileName As String Dim targetCol As Integer Dim targetRow As Integer Dim targetCell As Range Dim shell, myPath Dim pos As Integer Dim extention As String Dim isImage As Boolean ' 選択セルを取得 targetCol = ActiveCell.Column targetRow = ActiveCell.Row ' フォルダ選択画面を表示 Set shell = CreateObject("Shell.Application") Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\Users\0602116.MS\Desktop\") Set shell = Nothing ' フォルダを選択したら... If Not myPath Is Nothing Then fileName = Dir(myPath.Items.Item.Path + "\") Do While fileName <> "" ' ファイル拡張子の判別 isImage = True pos = InStrRev(fileName, ".") If pos > 0 Then Select Case LCase(Mid(fileName, pos + 1)) Case "jpeg" Case "jpg" Case "gif" Case Else isImage = False End Select Else isImage = False End If ' 拡張子が画像であれば If isImage = True Then ' 貼り付け先を選択 Cells(targetRow, targetCol).Select Set targetCell = ActiveCell ' 画像読込み ActiveSheet.Pictures.Insert(myPath.Items.Item.Path + "\" + fileName).Select ' 画像が大きい場合、画像サイズをセル幅に合わせる If Selection.Width > targetCell.Width Or Selection.Height > targetCell.Height Then If Selection.Width / targetCell.Width > Selection.Height / targetCell.Height Then Selection.Height = Selection.Height * (targetCell.Width / Selection.Width) Selection.Width = targetCell.Width Else Selection.Width = Selection.Width * (targetCell.Height / Selection.Height) Selection.Height = targetCell.Height End If End If ' 表示位置をセル中央に移動 Selection.Top = targetCell.Top + (targetCell.Height - Selection.Height) / 2 Selection.Left = targetCell.Left + (targetCell.Width - Selection.Width) / 2 ' 貼り付け先行を+1 targetCol = targetCol + 2 End If fileName = Dir() Loop MsgBox "画像の読込みが終了しました" End If End Sub

  • VBAで画像を自動で切り替える方法

    Excelで棚割表を作っています。商品コードを打つとその商品の画像を自動で表示させたいのですが、雑誌を見ながらコードをアレンジしてほぼ完成したのですが、「プロシージャーが大きい」とエラーが出てマクロを実行出来ません。 画像は100個程度あり、先に別のマクロで貼り付けてあります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ファイル As String If Intersect(Target, Range("A4")) Is Nothing Then ActiveSheet.Shapes("画像").Delete ファイル = "C:\保存場所\" & Range("A4").Value & ".jpg" Range("B5").Select ActiveSheet.Pictures.Insert(ファイル).Select Selection.ShapeRange.LockAspectRatio = msoTrue Selection.ShapeRange.Top = ActiveCell.Top Selection.ShapeRange.Left = ActiveCell.Left Selection.ShapeRange.Height = 97 Selection.ShapeRange.Width = 52.5 Selection.ShapeRange.Rotation = 0# Selection.ShapeRange.IncrementLeft 1.5 Selection.ShapeRange.IncrementTop 1.5 Selection.Name = "画像" End If (中略) Dim ファイル98 As String If Intersect(Target, Range("U60")) Is Nothing Then Exit Sub ActiveSheet.Shapes("画像98").Delete ファイル98 = "C:\保存場所\" & Range("U60").Value & ".jpg" Range("V61").Select ActiveSheet.Pictures.Insert(ファイル98).Select Selection.ShapeRange.LockAspectRatio = msoTrue Selection.ShapeRange.Top = ActiveCell.Top Selection.ShapeRange.Left = ActiveCell.Left Selection.ShapeRange.Height = 97 Selection.ShapeRange.Width = 52.5 Selection.ShapeRange.Rotation = 0# Selection.ShapeRange.IncrementLeft 1.5 Selection.ShapeRange.IncrementTop 1.5 Selection.Name = "画像98" End Sub 省ける箇所や分割する方法などありましたら教えてください。

  • Excelの写真貼り付け(90度回転)について

    xcelに写真のサイズを自動的に変更するマクロ、(セルの大きさに合わせて)を利用しています。 このマクロに対して写真を90度角度を変更して、写真を表示させたいのですが、どのようにすればよいのでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) ActiveSheet.Unprotect Dim C As Range, cm As Range Application.ScreenUpdating = False For Each C In Selection Set cm = C.MergeArea If C.Address = cm.Item(1).Address Then If Application.Dialogs(xlDialogInsertPicture).Show = False Then Exit Sub With Selection .Left = cm.Left .Top = cm.Top .Height = cm.Height .Width = cm.Width End With End If Next Set cm = Nothing Application.ScreenUpdating = True Range("a1").Select End Sub

  • EXCELのVBAによる写真貼り付け時に重なる。

    VBAの初心者です。 エクセルに写真データを貼り付けるVBAで、以下のマクロを実行するとシートの同じセル位置B5に、写真が2枚重なった状態となります。 セルのB5とH5の位置に写真をそれぞれ貼りつけるために、どのように修正すればよいのでしょうか?ご教授ください。 OS:Vista ソフト:Excel2007 Sub 写真ファイル呼び出し() ' Sheets("風景1").Select Range("B5").Select ActiveSheet.Pictures.Insert(Worksheets("風景写真").Range("o4").Value).Select With Selection Selection.ShapeRange.LockAspectRatio = msoTrue '縦横比を固定するコマンド Selection.ShapeRange.Width = 245 '縦横比固定、幅のみを指定する End With 'Sheets("風景2").Select Range("H5").Select ActiveSheet.Pictures.Insert(Worksheets("風景写真").Range("o5").Value).Select With Selection Selection.ShapeRange.LockAspectRatio = msoTrue '縦横比を固定するコマンド Selection.ShapeRange.Width = 245 '縦横比固定、幅のみを指定する End With End Sub

  • 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 ------------------------------------------------------------------------- お願いいたします。

  • Excel VBA マクロ 画像(図)貼り付け

    Excel2010にて、 VBA マクロ 画像(図)貼り付けを行いたいと思っています。 しかし、マクロを自動登録すると、ActiveSheet.Pictures.Paste.Selectになり、AddPicture ができません。 下記のマクロをAddPictureへ変換したいのですが、そのまま、InsertをAddpictureに変更してもエラーになってしまいます。 いい方法を教えてください(ToT)/~~~。 どうぞよろしくお願いします。 Sub Test() ' ' Test Macro ' Rows("4:4").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Selection.RowHeight = 150# Range("C4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileC.gif"").Select ActiveSheet.Pictures.Paste.Select Range("D4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileD.gif"").Select Selection.Cut Range("D4").Select ActiveSheet.Pictures.Paste.Select Range("E4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileE.gif"").Select Range("E4").Select ActiveSheet.Pictures.Paste.Select Range("F4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileE.gif"").Select ActiveSheet.Pictures.Paste.Select Range("G4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileG.gif"").Select Selection.Cut ActiveSheet.Pictures.Paste.Select Range("H4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileH.gif"").Select Selection.Cut ActiveSheet.Pictures.Paste.Select Range("I3").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileI.gif"").Select Selection.Cut ActiveSheet.Pictures.Paste.Select Range("J4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileJ.gif"").Select Selection.Cut ActiveSheet.Pictures.Paste.Select Range("K3").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileK.gif"").Select Selection.Cut ActiveSheet.Pictures.Paste.Select Range("L3").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileL.gif"").Select ActiveSheet.Pictures.Paste.Select Range("M4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileM.gif"").Select Selection.Cut ActiveSheet.Pictures.Paste.Select Range("N4").Select ActiveSheet.Pictures.Insert( _ "E:\FolderA\fileN.gif").Select Selection.Cut ActiveSheet.Pictures.Paste.Select End Sub

  • VBAでオートシェイプの制御?

    エクセルマクロでセルにオートシェイプを張る方法を調べていて、ここで丁度いいのを見つけました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=808898 見つけた下記のマクロを実際にやってみました。 A1に1を入れるとB2にハートマークが出ます。 しかし、さらに2を入力してもB2のハートは削除されてくれません。 さらに1をいれると、ハートの上にハートが重なってしまいます。 1ならハート、それ以外の入力ならハートが消えるようにするにはどうすればいいのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Target <> Range("A1") Then Exit Sub If Target.Value = 1 Then With ActiveSheet.Range("B2") ActiveSheet.Shapes.AddShape(Type:=msoShapeHeart, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height).Select End With End If End Sub

  • エクセルVBA オートシェイプを操作したいです

    エクセルでセルの入力内容によって楕円をオートシェイプで出現させたいと思います。 http://oshiete1.goo.ne.jp/qa809742.htmlで見つかったものを参考にし、 Private Sub worksheet_Activate() Dim Shp As Shape Set P11 = Range("P11") If P11 Is Nothing Then Exit Sub If P11.Value = 1 Then For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N14:N15")) Is Nothing Then Shp.Delete End If Next Shp With ActiveSheet.Range("N14:N15") ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _ Left:=.Left,TOP:=.TOP,Width:=.Width,Height:=.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse End With Range("N14").Select Else For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N14:N15")) Is Nothing Then Shp.Delete End If Next Shp End If If P11.Value = 2 Then For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N16")) Is Nothing Then Shp.Delete End If Next Shp With ActiveSheet.Range("N16") ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _ Left:=.Left, TOP:=.TOP, Width:=.Width, Height:=.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse End With Range("N16").Select Else For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N16")) Is Nothing Then Shp.Delete End If Next Shp End If End Sub とつなげて見ました。 動くには動くのですが、データ元のセルがP11からT30と100セルあり、さらにP11に入力されるデータが1,2,3,4の4種類、AQ11に5,6,7,8,9の5種類などと、ばらばらです。 P11に1が入力されるとN14:N15(結合されています)に円が入り、2が入力されるとN16に円が入る。 Q11に5が入力されるとR13に円が入り、6が入力されるとR14:R15に円が入る・・・・のようにしたいのです。 一生懸命、セルNo.を打ち込んでいたら、 「コンパイルエラー:プロシージャが大きすぎます」とエラーが出てしまいました。 ループさせればよいのだろうと試してみたのですが、元のセルの指定方法や、オートシェイプの出現させるせるの指定方法がわかりません。 どのようにすれば、データー元の範囲を指定して、それに対応したセルにオートシェイプを出現させる事が出来るようになるでしょうか。 お知恵を貸していただけないでしょうか。よろしくお願い致します。

  • VBA Do Until内で値の貼り付けができない

    Excel2003を使用しております。 コピー&値のペースト作業をやってくれるマクロを作成しております。 具体的には、名簿に公がついていれば、その3つ左の名前をD27へ値のみコピペし、 D27がすでに値があれば、D28に書くことを、D37までループするようにしております。 しかし困ったことに、Do Untilコードを使用しておりますが、このコードではなぜか値の貼り付けが出来なくなります。 Sub Ns公() Dim work As Range Set work = Selection If Selection.Value = "公" Then ActiveCell.Offset(0, -3).Select Selection.Copy Do Until Range("D37").Select Range("D27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop If Range("D36").Value <> "" Then Do Until Range("I37").Select Range("I27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop work.Select End If work.Select End If work.Select ActiveCell.Offset(1).Select End Sub 原因や対策をご教授いただけるとうれしいです。よろしくお願いします。

  • Excelでセル上の画像を別のセルにコピーするには

    いつも楽しく勉強させていただいております。 つぎのような処理をしたいのですが、うまくいきません。 1.セル1の上にある画像をセル2の上にコピーする。 2.コピーした画像をセル2の高さと幅にフィットさせる。 まず、このようなマクロを考えてみました。 Range("A1").CopyPicture Range("C1").Select ActiveSheet.Paste ActiveSheet.Shapes(Selection.Name).LockAspectRatio = msoFalse ActiveSheet.Shapes(Selection.Name).Top = Range("C1").Top ActiveSheet.Shapes(Selection.Name).Left = Range("C1").Left ActiveSheet.Shapes(Selection.Name).Height = Range("C1").Height ActiveSheet.Shapes(Selection.Name).Width = Range("C1").Width これですと元の画像がA1のセルより小さい場合、周囲に余白がある形でコピーされてしまいます。 C1にコピーしたら余白はなしでC1の大きさいっぱいに画像を引き延ばしたい(あるいは縮小したい)のです。 そこで次のように変更してみました。 (上のプログラムと一番上の行のみが違います)。 ActiveSheet.Shapes("図 6").Copy Range("C1").Select ActiveSheet.Paste ActiveSheet.Shapes(Selection.Name).LockAspectRatio = msoFalse ActiveSheet.Shapes(Selection.Name).Top = Range("C1").Top ActiveSheet.Shapes(Selection.Name).Left = Range("C1").Left ActiveSheet.Shapes(Selection.Name).Height = Range("C1").Height ActiveSheet.Shapes(Selection.Name).Width = Range("C1").Width これもうまくいきません。 A1にある元の"図 6"は動かしたくないのに、勝手にB1の位置に移動してしまいます。 というのは、"図 6"という画像をコピーすると、同じ名前で画像ができちゃうんですね。 コピー元とコピー先の両方の画像に対して位置や高さを設定することになるようです。 ということで、 1.セル1の上にある画像をセル2の上にコピーする。 2.コピーした画像をセル2の高さと幅にフィットさせる。 これを実現させるにはどうしたらいいでしょう。

専門家に質問してみよう