エクセルのマクロで複数の写真をセルの中央に移動する方法

このQ&Aのポイント
  • エクセルのマクロを使用して、複数の写真を指定したセルの中央に移動する方法を紹介します。
  • まず、指定したセルに写真を貼り付けます。その後、マクロを実行することで、写真をセルの中央に移動させることができます。
  • 具体的なコードとして、指定したセルの左上のアドレスを変更することで、異なるセルに対しても同様の操作を行うことができます。
回答を見る
  • ベストアンサー

エクセルのマクロで、複数の写真をセルの中央に

エクセルのマクロにて下記のようなことをしたいと思っています。 ご教授お願いします。 なお、以前に出ていた回答をベースにしたいと考えています。そのコードも下記に載せておきます。 やりたいこと (1).複数の写真がある (2).1枚目の写真はB1に貼り付けている (3).同様にn枚目の写真はBnに貼り付けている(今現在300枚、今後増える予定) ここまではもうやっています。この後が問題なのですが (4).Bnのセルの中で、写真をセルの中央に移動させたい この(4)ができず困っています。既出で参考にした回答は下記です。 下記に手を加えていただき、(4)ができるようにしていただければ助かるのですが。 よろしくお願いいたします。 http://okwave.jp/qa/q3875596.html 参考にしたコード Sub picCenter() Dim p As Object Dim rng, trg As Range Const adr As String = "A26" '処理対象セルの左上のアドレス   If Range(adr).MergeCells Then     Set rng = Range(adr).MergeArea   Else     Set rng = Range(adr)   End If   For Each p In ActiveSheet.Pictures     Set trg = Intersect(rng, p.TopLeftCell)     If Not trg Is Nothing Then       If p.Width < rng.Width Then         p.Left = rng.Left + (rng.Width - p.Width) / 2       End If       If p.Height < rng.Height Then         p.Top = rng.Top + (rng.Height - p.Height) / 2       End If     End If   Next p End Sub この中の Const adr As String = "A26" '処理対象セルの左上のアドレス という箇所を、for-next関数でたとえばi=1からi=500とし セル番地Biで実行したらいいと思うのですが。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

>この中の > Const adr As String = "A26" '処理対象セルの左上のアドレス > という箇所を、for-next関数でたとえばi=1からi=500とし > セル番地Biで実行したらいいと思うのですが。 それでも問題ないです。 あとは実践ですね、がんばりましょう。 とりあえず、Constを消して、     For i = 1 To ActiveSheet.Pictures.Count         Set rng = Cells(i, 2)         ~処理~     Next で良いんじゃないかなと思います(未検証ですが)。 無駄を省きたいなら考え方をちょっとだけ変えて 「全ての写真において、写真があるセル番地の中心に」とします。 ご提示のコードを活かすなら Sub sample() Dim p As Object Dim trg As Range     For Each p In ActiveSheet.Pictures         Set trg = Range(p.TopLeftCell.Address)         If Not trg Is Nothing Then             If p.Width < trg.Width Then                 p.Left = trg.Left + (trg.Width - p.Width) / 2             End If             If p.Height < trg.Height Then                 p.Top = trg.Top + (trg.Height - p.Height) / 2             End If         End If     Next p End Sub こんな感じ。 ただしこれは 「全ての写真が目的のセル番地(Bnセルでしたっけ)内に正しく収まっている場合」 に限ります。 これが 「シート内にバラバラに配置されている複数の写真を  B列各行に1枚ずつ整然と配置したい」 のであれば Sub sample2() Dim p As Object Dim rng, trg As Range     For i = 1 To ActiveSheet.Pictures.Count         Set p = ActiveSheet.Pictures(i)         Set trg = Cells(i, 2)         If Not trg Is Nothing Then             If p.Width < trg.Width Then                 p.Left = trg.Left + (trg.Width - p.Width) / 2             Else                 p.Left = trg.Left             End If             If p.Height < trg.Height Then                 p.Top = trg.Top + (trg.Height - p.Height) / 2             Else                 p.Top = trg.Top             End If         End If     Next End Sub まだ贅肉が多いですが、動くと思いますよ。 写真の幅・高さがセルより大きい場合はセルの左・上に合うように加筆しています。

bub56170
質問者

お礼

tsubuyukiさま ありがとうございました。最終的には2つ目の方法で処理を進めています。3つ目も私には目からうろこのコードであり、 土日にゆっくりと研究させていただきます。 実践を積んで、少しでもスキル向上していきたいと思います。 ありがとうございました。

関連するQ&A

  • エクセル マクロ

    エクセルのある特定のセルをダブルクリックすると 画像ファイルを参照しにいき 貼りつけたい画像ファイル選ぶと そのセルの大きさに合わせて 画像ファイルがそのセルに 貼りつくというマクロが以下の通りなんですが 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

  • エクセルのマクロについて教えてください

    お世話になっております。 エクセルのマクロについて教えていただきたいのですが、 サンプルのファイルをこちらにアップしたのでよろしければご覧になってください。 http://kie.nu/yPV 質問したいことは、列Iに、各行の黄色いセルの数を表示させるマクロを作りたいのですが 途中まで何とかわかったのですがどうもうまくいきません。。 行11から各行にひとつずつ、黄色いセルが含まれていますが、その黄色いセルの中の数字を列Iに表示させたいです。行にデータがある限り、下までずっとです。 以下、途中までわかったマクロです。 Sub 黄セル値Copy() Const TgLeftUp = "A3" '<--対象範囲左上セル指定 Dim Rng As Range Dim Target As Range Set Target = Range(TgLeftUp, Cells(Rows.Count, _ Range(TgLeftUp).Column)) For Each Rng In Target.Resize(, 2) If Rng.Interior.ColorIndex = 6 Then If Rng.Column = Target.Column Then Rng.Offset(, 3).Value = Rng.Value Else Rng.Offset(, 2).Value = Rng.Value End If End If Next MsgBox "値 貼り付け完了。", vbInformation Set Target = Nothing End Sub でもこれを貼り付けてもうまくいきません。 正しいマクロを教えていただけないでしょうか?? 宜しくお願いいたします。 ※いつも、私の質問に対してまるで回答になってないような、ふざけた言葉を書き込んでは消してる方が一名だけいらっしゃいます。確か、鳥の写真をマイページに載せてる方です。 都度違反報告はしていますが、質問の趣旨に反する回答をされてる方一名、絶対にやめてください。

  • 社員名簿に写真を表示させるマクロを教えて下さい!

    社員名簿の作成で困っています。 セルC4、C9、C14、C19…とE4、E9、E14、E19…に社員コードを入力すると、所属・氏名・入社年月日・勤続年数がVLOOKUP関数で表示されるように作成しました。 写真も表示されるようにいろいろな所を検索して、マクロをコピーしてみました。 表示はされるのですが、うまく表示されません。 表示場所は、B4:B8、B9:B13…と社員コードの左側の結合セルです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim TgRng As Range Dim Rng As Range Dim Shp As Shape Const PathN = "画像フォルダの場所" Set TgRng = Intersect(Range("C4,C9,C14,C19,C24,C29,E4,E9,E14.E19,E24,E29"), Target) If TgRng Is Nothing Then Exit Sub For Each Rng In TgRng For Each Shp In ActiveSheet.Shapes If Not Intersect(Shp.TopLeftCell, Rng.Offset(0,-1).MergeArea) Is Nothing Then Shp.Delete End If Next If Not IsEmpty(Rng.Value) And Dir(PathN & Rng.Value & ".jpg") <> "" Then Set Shp = ActiveSheet.Shapes.AddPicture(PathN & Rng.Value & ".jpg", False, True, 50, 50, 50, 50) Shp.LockAspectRatio = msoFalse Shp.Top = Rng.Offset(0,-1).Top Shp.Left = Rng.Left Shp.Height = Rng.Offset(0,-1).Height Shp.Width = Rng.Offset(0,-1).MergeArea.Width Else If Not IsEmpty(Rng.Value) Then _ MsgBox "ファイルが見つかりません。", vbExclamation End If Next Set Shp = Nothing Set TgRng = Nothing End Sub マクロは初心者です。 どこを直したらよいか、どなたか教えて下さい。 よろしくお願いします。

  • エクセル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

  • エクセル マクロのいれ方

    エクセルを使って表を作っています。 自分のしたい事をするには、マクロを組まなくてはならないことが分かりました。 私はマクロは使ったことがないので、本来ならちゃんと勉強すべきなんですが、締め切りが迫ってるので、マクロのVBAを調べました。 したいのは、『ロックされているセル以外のデータをクリアにする』ということなんですが、その為には下記のVBA?を入れればいいらしいのです。 Sub UnlockCellClear() Dim Rng As Range For Each Rng In UsedRange   If Rng.Locked = False Then     Rng.Clear     Rng.Locked = False   End If Next End Sub ツール→マクロ→VBA→標準モジュール→Module1を開き、上記のVBAを入れてみましたが出来ませんでした。 そんな簡単なことじゃないんですかね? ど 質問の説明が下手でしたら申し訳ありません。

  • エクセル 2010 マクロ 検索

    http://okwave.jp/qa/q8562170.html 上記質問に追加です。 ※1 'D,E,F,G,H,I,K を検索してD,E,F,G,H,I に検索対象があった時 E,F,G,H,Iのいずれかだったら左横列の上に向かって (EならD 、FならE ・・・という具合に) 何か入力されているセルのM列の191000####をmsgboxで表示させたいです。 (画 F11セル(A-1)が検索ヒットした場合E9セル(R-01)を辿り、 その行のM列のセル(191000####)をmsgboxで表示 ※2 但し、検索結果がD列のデータだった時、その行のM列が191000####だった場合 M列の191000####をmsgboxで表示させたいです。 (画 D25セル(Y-1)対象の時) ※3 また、検索結果がD列のデータだった時、その行のM列が191000####以外だった場合 (空白だったり191000####以外の場合) M列の一番上の191000####をmsgboxで 191000####&「これは例外です」と表示させたいです。 (画 D24セル (X-1)対象の時) 現在のコードは下記のとおりです。 Sheet1に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "$A$3" Then Exit Sub Call 検索 Range("A1:A2").Clear Range("A1").Activate End Sub 標準モジュールに Sub 検索()  Dim Ws1 As Worksheet, Ws2 As Worksheet  Dim strKey As Variant  Dim s As String  Dim c As Range, bln As Boolean  Dim rng1 As Range  Dim cnt As Long    Set Ws1 = Sheet1  Set Ws2 = Sheet2    Ws1.Select    With Ws2   strKey = Application.Transpose(.Range("A1").Resize(2).Value)   strKey = Join(strKey, "")  End With    If Trim(strKey) = "" Then MsgBox "検索キーが空です", vbCritical: Exit Sub      With Ws1   Set rng1 = .Range("K2", .Cells(Rows.Count, "K").End(xlUp))   For Each c In rng1.Offset(, -10)     'D,E,F,G,H,I,Kを検索    s = c.Offset(0, 3).Value & c.Offset(0, 4).Value & c.Offset(0, 5).Value & c.Offset(0, 6).Value & c.Offset(0, 7).Value & c.Offset(0, 8).Value & c.Offset(0, 10).Value &        If StrComp(s, strKey, vbTextCompare) = 0 And c.Offset(0, 2).Value = "" Then     c.End(xlToRight).Activate c.Offset(0, 2).Value = Date          c.Resize(1, 14).Interior.ColorIndex = 6     bln = True     Exit For    End If   Next c      If Not bln Then    Ws2.Select    MsgBox "リストに存在しません", vbExclamation, "NotFound"   Else '加える    Call ReSearch(Ws1.Range("M2"), c.Row)    '再設定    Set rng1 = .Range("K6", .Cells(Rows.Count, "K").End(xlUp))    MsgBox "残り" & DoubleCountBlank(rng1.Offset(, -8), rng1) & "品目です。", vbInformation   End If  End With  Application.Goto Ws2.Range("A1"), True End Sub Sub ReSearch(Rng As Range, j As Long) '最初のセル, 終わりの行数 Dim i As Long Dim Ws As Worksheet With Rng.Parent For i = j To Rng.Row Step -1 If CStr(.Cells(i, Rng.Column).Value) Like "191000####" Then MsgBox "指図番号 " & vbCrLf & CStr(.Cells(i, Rng.Column).Value) & " の部品です" Exit For End If Next i End With End Sub Function DoubleCountBlank(rng1 As Range, rng2 As Range) '横並びのセルのブランクをカウントする (セル範囲1 , セル範囲2)  Dim i As Long  Dim cnt As Long  For i = 1 To rng1.Rows.Count   If VarType(rng2.Cells(i, 1)) = vbDouble Then    If rng1.Cells(i, 1).Value = "" And rng2.Cells(i, 1).Value <> 0 Then     cnt = cnt + 1    End If   End If  Next i  DoubleCountBlank = cnt End Function 宜しくお願い致します。

  • 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

  • 複数セル参照で塗りつぶしを変更する

    WIN:XP Off:2003 お願いします。 添付した図は入出金表です。 列Hに数値が入力されると列Eのセルが青く塗りつぶされます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim aCell As Range Set Rng = Intersect(Target, Range("H:H")) If Rng Is Nothing Then Exit Sub For Each aCell In Rng If aCell.Value > 0 Then aCell.Offset(0, -3).Interior.ColorIndex = 17 Else aCell.Offset(0, -3).Interior.ColorIndex = xlNone End If Next aCell Set Rng = Nothing End Sub ここまでは出来たのですが、列Iに入力された時に列Eが赤に塗りつぶされるにはどうしたらいいでしょうか? 同じ行のHとIに同時に数値が入る事はありません。 どうかお願い致します。

  • 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

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

    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までとか複数選択したい場合 宜しくお願いします

専門家に質問してみよう