マクロでセルに入れたファイル名の画像を隣のセルに読み込む

このQ&Aのポイント
  • マクロを使用して、セル内のファイル名に対応する画像を隣のセルに読み込みたいという要望があります。しかし、実装がうまくいかずに困っています。
  • 順位に基づいてセルに入力されたファイル名と一致する画像を隣のセルに表示したいという要望があります。また、一致しない場合は「No Image」と表示したいとのことです。
  • 問題点として、実装時に「名」のセルの値を読み込むため、エラーが生じていると報告されています。また、画像のサイズもうまく調整できないという課題があります。
回答を見る
  • ベストアンサー

マクロでセルに入れたファイル名の画像を隣のセルに読み込む

こんにちは。宜しくお願いします。 マクロで「セルに入れたファイル名の画像を隣のセルに読み込む」作業を行いたいのですが・・・。うまくいきません。どなたかご助言いただけると助かります。 <内容> セル内には上から1位・2位と順位通りになっており、その順位に入っているセルのファイル名と一致している画像を隣のセルに読み込みたいと思っています。またファイル名と画像が一致しない場合は「No Image」として1枚の画像を貼り付けることもしたいです。    A(順位)  B(名)    C(画像) --------------------------------------------- 1   1位   test01   D:\画像\teet01.JPG 2   2位   test02   D:\画像\teet02.JPG 3   3位   test03   D:\画像\teet03.JPG . . . 10  10位   test10   D:\画像\teet10.JPG <問題点> ・B2の「test01」から順に読み込んでもらいたいのにB1の「名」を読み込んでしまうためエラーが生じる。 ・画像をセルの結合した分の大きさに合わせたいのだが、セル1個分のサイズに表示してしまうためうまく調節できない。 <マクロ文> Private Sub CommandButton1_Click() Dim i As Long Dim myPic As Object Dim myCell As Range For i = 1 To Range("C" & ActiveSheet.Rows.Count).End(xlUp).Row Set myCell = Range("C" & i) Set myPic = ActiveSheet.Pictures.Insert("D:\画像\" & myCell.Value & ".JPG") With myPic .Width = Range("D2").Width .Height = Range("D2").Height End With Set myPic = Nothing Next i End Sub 色々とネット等を見てはいるのですが・・・うまくいきませんでした。 どこをどのようにして代えればうまく動作するか分かる方いらっしゃいましたら教えていただきたいです。宜しくお願い致します。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

倍率の変更もですが、それより Top 位置の調整が必要です。 Sub try_2()   Const n As Long = 2 'margin   Dim r As Range   Dim i As Long   Dim x As Double   Dim s As String      With ActiveSheet     For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row Step 6       Set r = .Cells(i, 3).MergeArea       s = "D:\画像\" & .Cells(i, 2).Value & ".jpg"       If Dir(s) = "" Then         s = "D:\画像\noimage.jpg"       Else         Dir Application.Path       End If       'r.Item(1).Value = s       With .Pictures.Insert(s).ShapeRange         .LockAspectRatio = msoTrue         x = Application.Min(r.Width / .Width, (r.Height - n) / .Height)         .Width = .Width * x         .Left = r.Left         .Top = r.Top + n / 2       End With     Next   End With      Set r = Nothing End Sub こんな感じで n の数値を変更して調整してください。 必要であればWidthとLeftも同じように。 中央に配置したい場合は以下に変更。 .Left = r.Left + (r.Width - .Width) / 2 .Top = r.Top + (r.Height - .Height) / 2

hiro7th
質問者

お礼

end-uさん おぉ!まさにこれを求めていました。ありがとうございます。 欲を言うと・・・。No Imageの画像には非対応な感じでしたので No Image画像にも同様、枠内に収めたいのですが。マクロ文を追加 しないとダメでしょうか?それとももともとの画像サイズが大きいとか ですかね??

その他の回答 (2)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

>No Imageの画像には非対応な感じでしたので >No Image画像にも同様、枠内に収めたいのですが。 ...はて?解りません。 他のjpgファイルはokなのに『No Imageの画像』がNGなのですね。 ファイルの問題じゃないですか? 他のファイルで試したり、サイズ変更して作り直したりしてみれば良いんじゃないでしょうか。 後は、貴方の方で色々と工夫する事で対応できるのではないかと思います。 では、この辺で。がんばってください。

hiro7th
質問者

お礼

end-uさん 「No Image」の方の画像サイズを変更したら直りました。 ご指摘ありがとうございます。 これで理想としていたことが完成しました。本当にありがとうございました。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

とりあえず、最低限の修正なら Private Sub CommandButton1_Click()   Dim i   As Long   Dim myPic As Object   Dim myCell As Range   For i = 2 To Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row Step 6     Set myCell = Range("B" & i)     Set myPic = ActiveSheet.Pictures.Insert("D:\画像\" & myCell.Value & ".JPG")     With myPic       .Left = Range("C" & i).Left       .Top = Range("C" & i).Top       .Width = Range("C" & i).MergeArea.Width       .Height = Range("C" & i).MergeArea.Height     End With     Set myPic = Nothing   Next i End Sub 縦横比固定の場合 Sub try()   Dim r As Range   Dim i As Long   Dim x As Double   Dim s As String      With ActiveSheet     For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row Step 6       Set r = .Cells(i, 3).MergeArea       s = "D:\画像\" & .Cells(i, 2).Value & ".jpg"       If Dir(s) = "" Then         s = "D:\画像\noimage.jpg"       Else         Dir Application.Path       End If       'r.Item(1).Value = s       With .Pictures.Insert(s).ShapeRange         .LockAspectRatio = msoTrue         x = Application.Min(r.Width / .Width, r.Height / .Height)         If x < 1 Then .Width = .Width * x         .Left = r.Left         .Top = r.Top       End With     Next   End With      Set r = Nothing End Sub

hiro7th
質問者

お礼

end-uさん イメージ通りのものができました。ご回答ありがとうございます。 どこがどう反映されているか、なんとなく分かったような気がします。 ただ、C2に画像が入った場合に枠線の上に重なるように画像が貼り付けられてしまうので縦横比固定の箇所で倍率の変更が出きればと思うのですが・・・ そこだけ何か解決案があればお聞きしたいです。

関連するQ&A

  • マクロでセルに入れたファイル名の画像を隣のセルに読

    みこむ。 マクロで「セルに入れたファイル名の画像を隣のセルに読み込む」作業をVBA でつくりました。 そのファイル名がないときは、飛ばすようにできないでしょうか。 「 Set myPic = ActiveSheet.Pictures.Insert(sCurDir & myCell.Value & ".JPG")」 ここでとめられてしまいます。    A(No)  B(名)    C(画像) --------------------------------------------- 1   1   test01   D:\画像\teet01.JPG 2   2   test02   D:\画像\teet02.JPG 3   3   test03   D:\画像\teet03.JPG Private Sub CommandButton1_Click() Dim i As Long Dim myPic As Object Dim myCell As Range Dim sCurDir As String sCurDir = ThisWorkbook.Path & "\画像\" For i = 6 To Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row Step 6 Set myCell = Range("B" & i) Set myPic = ActiveSheet.Pictures.Insert(sCurDir & myCell.Value & ".JPG") With myPic .Left = Range("C" & i).Left .Top = Range("C" & i).Top .Width = Range("C" & i).MergeArea.Width .Height = Range("C" & i).MergeArea.Height End With Set myPic = Nothing Next i End Sub

  • VBA マクロ実行にてエラーが出ますが、原因を教えてください

    下記コードを実行すると、myCell.Selectのところで 実行時エラー’91’ オブジェクト変数またはWithブロック変数が設定されていません。 というエラーが出るのですが、どうすれば対策出来るのでしょうか? Sub test() Dim i As Long Dim myCell As Range With Range("A1").CurrentRegion For i = 2 To .Rows.Count Step 2 If i = 2 Then Set myCell = .Rows(i) Else Set myCell = Application.Union(myCell, .Rows(i)) End If Next i End With myCell.Select End Sub

  • エクセル マクロ

    エクセルのある特定のセルをダブルクリックすると 画像ファイルを参照しにいき 貼りつけたい画像ファイル選ぶと そのセルの大きさに合わせて 画像ファイルがそのセルに 貼りつくというマクロが以下の通りなんですが Excel2003からExcel2007へ変更すると 画像ファイルの貼りつく位置がダブルクリックしたセルではない所に 貼りつくようになりました 参照や大きさなどはちゃんと機能しているようです どこを変更すればよいでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range('特定のセル)) Is Nothing Then Exit Sub Cancel = True Dim myPic Dim myRange As Range Dim rX As Double, rY As Double myPic = Application.GetOpenFilename("画像ファイル,*.jpg;*.jpeg;*.gif;*.tif") If VarType(myPic) = vbBoolean Then Exit Sub Set myRange = Target Application.ScreenUpdating = False With ActiveSheet.Pictures.Insert(myPic).ShapeRange rX = myRange.Width / .Width rY = myRange.Height / .Height If rX > rY Then .Height = .Height * rY Else .Width = .Width * rX End If .Left = .Left + (myRange.Width - .Width) / 2 .Top = .Top + (myRange.Height - .Height) / 2 End With Application.ScreenUpdating = True Cancel = True End Sub

  • Excelセルのサイズに合わせて画像を表示させたい

    Excelのセルの中に、画像ファイル(撮影された写真)のサイズを挿入するときに、セルのサイズに合わせて画像を表示させたいと考え、インターネット上でVBの下記のマクロを探してみました。  セルをダブルクリックすると、画像ファイルの読み出しが行なわれるのですが、セルのサイズにピッタリと合わず、 「列」にわずかに隙間が空いてしまいます・・・。  セルのサイズに合わせる為にはどうすればよいでしょうか?  もう一つ質問させていただきたいのですが、一部の画像は読み出しだ際に、縦にして自動的に表示させたいです。 (これまではExcelの「図の書式設定」で-90度と手入力していました)  何卒宜しくお願い致します。    Excel2003  Visual Basic 6.5 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) Dim myPic Dim myRange As Range '画像を配置するセル範囲 Dim rX As Double, rY As Double myPic = Application.GetOpenFilename("画像ファイル,*.jpg;*.jpeg;*.gif;*.tif") If VarType(myPic) = vbBoolean Then Exit Sub Set myRange = Target 'このセル範囲に収まるように画像を縮小する Application.ScreenUpdating = False With ActiveSheet.Pictures.Insert(myPic).ShapeRange rX = myRange.Width / .Width rY = myRange.Height / .Height If rX > rY Then .Height = .Height * rY Else .Width = .Width * rX End If .Left = .Left + (myRange.Width - .Width) / 2 '写真を横方向の中央に配置 .Top = .Top + (myRange.Height - .Height) / 2 '写真を縦方向に中央に配置 End With Application.ScreenUpdating = True Cancel = True End Sub

  • Excel VBA オートフィルの範囲指定

    Excel VBA で関数を入れたセルを最下行までコピー させたいのですが、範囲の指定がうまくできません。ごちゃごちゃ書きすぎて、よくわからなくなってしまいました。 実行してみたら、オートフィルのところでデバッグが出ました。 VBAはまだまだ初心者レベルです・・・ どこをどう直せばきちんと処理されるのか、どなたかお知恵をお貸しください。 (それと初めの定義は、Rangeで合ってるのでしょうか?) Sub sample() Dim MyCell1 As Range Dim MyCell2 As Range Dim MyCell3 As Range Dim MyCell4 As Range Dim MyCell5 As Range Set MyCell1 = Cells(5, Range("4:4").Find(what:="○○", searchorder:=xlByColumns).Offset(1, 1).Column) Set MyCell2 = Cells(5, MyCell1.Offset(0, 2).Column) MyCell1.Select Selection.Formula = "=$A5-" & MyCell2.Address(False, True) Set MyCell3 = Cells(5, MyCell1.Offset(0, -1).Column) Set MyCell4 = Cells(5, Cells(5, Columns.Count).End(xlToLeft).Column) Set MyCell5 = MyCell1.Offset(0, 1) MyCell5.Select Selection.Formula = "=" & MyCell3.Address(False, True) & "-" & MyCell4.Address(False, True) Range(MyCell1, Cells(5, MyCell1.Offset(0, 1).Column)).Select Selection.AutoFill Destination:=Cells(Cells(5, MyCell1.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row, MyCell5.Column)), Type:=xlFillCopy End Sub ********************* 下のような表に関数を入力して最下行までコピーさせたいです。  | A | B | C | D | E | F | G | H | I | J | K | L | -------------------------------------------------------------------------- 4 | code | name | 7/1 | 7/2 | ○○ |    |    | code|name| 7/1 | 7/2| ○○ | 5 |10000|aaaaaa| 15  | 20 | 35  |     |    |10001|bbbbbb| 13 | 25 | 38 |                           ((                            )) F5に "=$A5-$H5" と数式を入れてcodeを比較し、G5に "=$E5-$I5"と入れて数量を比較する。 F列とG列の入力されている最下行まで数式をコピーする。 ※毎月日数が変わり、商品数も変わるので、A列・B列・4行目以外は全て可変。 WindowsXP Excel2003 です。 よろしくお願いいたします。

  • セルの値でフォルダやファイル名とファイルの内容を

    セルの値で フォルダやファイル名とファイルの内容を一気に保存したいのですが、 どうしても式がわかりません。。 やりたいことはここにまとめてます。 ↓ http://bsmile.sakura.ne.jp/phptest/cc1.jpg 1 A列のフォルダと作って、 2 B行のファイル名で、 3 C行の内容のファイルを作りたいのです。 1については、 http://hamachan4.exblog.jp/10612140/ にある通り、 Dim mydir As String Dim i As Integer For i = 1 To Range("A" & Rows.Count).End(xlUp).Row mydir = "C:\Users\user\Desktop\test\" & Cells(i, 1).Value If Dir(mydir, vbDirectory) = vbNullString Then MkDir mydir Next i MsgBox "完了しました" End Sub フォルダを作る事はできそうなのですが、 2のフォルダパスをどう指定したらいいのか? (3はなんとなくできそうなですが、) で、色々みたんですが、どうしてもわからずで、 どういったVBAを組めばこの動作ができるでしょうか? どうかよろしくお願いいたします。 m(_ _)m

  • 画像をエクセルに貼り付けるマクロ

    画像をエクセルに貼り付けるマクロ 複数の画像をエクセルに貼り付ける機会が多く、下記のマクロを利用しています。これは他人が作ったものでその人が今はいないため修正の仕方がわかりません。 これだとヨコに2個の画像で縦方向に画像が貼り付けられます。これをヨコに3個の画像で 縦方向に画像を貼り付けるようにしたいのですが、方法がわかりません。 お詳しい方どうかよろしくお願いします。 <現在> 1  2 3  4 5  6 <やりたいこと> 1  2  3 4  5  6 7  8  9 Sub Insertpic() Dim strFilter As String Dim Filenames As Variant Dim pic As picture Dim sc As Range Dim i As Long Dim j As Long Dim k As Long '「ファイルを開く」ダイアログでファイル名を取得 strFilter = "画像ファイル(*.jpg;*.jpeg;*.gif;*.bmp;*.png),*.jpg;*.jpeg;*.gif;*.bmp;*.png" Filenames = Application.GetOpenFilename( _ FileFilter:=strFilter, _ Title:="画像の挿入(複数画像が選択できます)", _ MultiSelect:=True) If Not IsArray(Filenames) Then Exit Sub ' 貼り付け開始セルを選択 'ActicveCellRange("C5").Select ' マクロ実行中の画面描写を停止 Application.ScreenUpdating = False ' 順番に画像を挿入 For i = LBound(Filenames) To UBound(Filenames) Set pic = ActiveSheet.Pictures.Insert(Filenames(i)) '画像の大きさ指定 With pic.ShapeRange .Height = 120# .Width = 175# .Rotation = 0# End With ' 次の貼り付け先を選択 Select Case i Mod 2 Case 1 '奇数回目 ActiveCell.Offset(, 4).Select Case 0 '偶数回目 ActiveCell.Offset(11, -4).Select End Select Set pic = Nothing Next i ' 終了 Application.ScreenUpdating = True MsgBox i - 1 & "枚の画像を挿入しました", vbInformation End Sub

  • おくと図が表示されるマクロはできたのですが、セルの値と図のファイル名を

    おくと図が表示されるマクロはできたのですが、セルの値と図のファイル名をリンクさせるまでにはいたっておらず、あきらめてしまいました。 どなたか、ご教示いただけると幸いです。 Sub setCommentToHyperLinks() Dim myRange As Range Dim item As Hyperlink For Each item In ActiveSheet.UsedRange.Hyperlinks If UCase(Right(item.Address, 3)) = "HTM" Then Set myRange = item.Parent With myRange .ClearComments .AddComment .Comment.Shape.Fill.UserPicture "C:(ここにセルのフォルダ名)\000002.gif" End With End If Next End Sub

  • マクロの変数のことで

    Sub test() Dim x As Range, y As Range Dim i As Integer i = 0 Set y = Application.InputBox("", "Paste", Type:=8)  For Each x In Selection   x.Cut y.Offset(i, 0)   i = i + 1  Next x End Sub 上記マクロは、選択されているセルを切り取って、指定したセルを基点として下方向に貼り付けるものです。 "i"の初期値を"1"にすると成功しますが、"0"だとエラーになります。"-3"などにすると、値がゼロになった時点でエラーになります。なぜ"i"がゼロになるとエラーになってしまうのでしょうか?  指定したセルを基点にして貼り付けられるようにするには、どうすればいいでしょうか?

  • エクセルVisualBasicマクロ詳しい方

    写真を特定のセルに貼り付けるのにダブルクリックでマイドキュメントがでるようにし、 写真を貼り付けるとサイズを枠に調節するようにマクロをつくりました。 問題なく出来るようになったのですが、 ダブルクリックでマイドキュメントではなく、 別の場所を指定するにはどこをどう変えればいいですか? 現状は以下の通りです。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Union(Range("A1:A21"))) Is Nothing Then Exit Sub Cancel = True Dim myPic Dim myRange As Range '画像を配置するセル範囲 Dim rX As Double, rY As Double myPic = Application.GetOpenFilename("画像ファイル,*.jpg;*.jpeg;*.gif;*.tif") If VarType(myPic) = vbBoolean Then Exit Sub Set myRange = Target 'このセル範囲に収まるように画像を縮小する Application.ScreenUpdating = False With ActiveSheet.Pictures.Insert(myPic).ShapeRange rX = myRange.Width / .Width rY = myRange.Height / .Height If rX > rY Then .Height = .Height * rY Else .Width = .Width * rX End If .Left = .Left + (myRange.Width - .Width) / 2 '写真を横方向の中央に配置 .Top = .Top + (myRange.Height - .Height) / 2 '写真を縦方向に中央に配置 End With Application.ScreenUpdating = True Cancel = True End Sub

専門家に質問してみよう