エクセル マクロ セルの値が変わった時、自動でマクロを実行させたいです。
以前、こちらで教えていただいたコードで下のような表を作りました。
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
■ボタンを押すと画像が配置される表
【Sheet1】…商品在庫一覧表(テキスト情報&商品画像のパス)
【Sheet2】…
1、Sheet1から必要なデータだけを関数で呼び出しておく
2、印刷用の体裁として6行目以下に並び替え(テキスト情報は‘=’で自動配置)、
「画像を配置」ボタンをトリガーにして画像を配置
(※D列の画像のパスを行7に(あ→い))
3、「リセット」ボタンで画像を削除
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
社内でとても便利に使っておりましたが
「毎回ボタンを押すのが面倒くさい」という意見があり、
自動で配置できないかと思っています。
やりたいこと
※A1~D3列が変わった時点で(ボタンを押さずに)6行目以下に画像を表示させたい
※「リセット」ボタンを押さなくても、次の更新があった時点で古い画像が削除され
新しい画像が配置されるようにしたい
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
■現在の構文(教えていただいたものをほぼそのまま貼り付けています。すみません)
Private Sub photo_1() '←「画像を表示」ボタン(★)
Const n As Long = 2 'margin
Dim r As Range 'Loop用
Dim tr As Range '読み込みセル用
Dim s As String 'セル文字列
Dim X As Double '縦横比固定での縮小率
Dim i As Long
With Sheets("【Sheet2】")
For Each r In .Range("D1", "D3")
s = r.Value
If Len(s) = 0 Then Exit For
i = i + 1
If Len(Dir(s)) > 0 Then
Set tr = .Cells(7, i)
With .Pictures.Insert(s).ShapeRange
.LockAspectRatio = msoTrue
X = Application.Min((tr.Width - n) / .Width, (tr.Height - n) / .Height)
.Width = .Width * X
.Left = tr.Left + (tr.Width - .Width) / 2
.Top = tr.Top + (tr.Height - .Height) / 2
End With
End If
Next
(-略-)
End With '念のためファイルを解放
Dir Application.Path
Set tr = Nothing
End Sub
Private Sub photo_2() '←「リセット」ボタン(★)
Sheets("【Sheet2】").Pictures.Delete
End Sub
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
(★)の部分をなくして自動化したいです。
「Worksheet_Calculate(Change?)」というのでできるらしい…
と知って色々やってみましたが、うまくいきません。
お時間がありましたら教えてください。
どうぞよろしくお願いいたします。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("希望セル範囲")) Is Nothing Then Exit Sub
Cancel = True
Call photo_1
Call photo_2
End If
End Sub
こういう事?
お礼
ご回答ありがとうございます。 >ループする範囲が明確に決まっていますので >無限にはなりません これだけでも教えていただけて本当に助かりました。 やみくもにループについて調べていたので…。 また、ご親切にお勧めの本まで教えていただき、大変うれしいです。 早速、3冊まとめて注文しました。 今まで何度か覚えようとしてその度に挫折していました。 ですが、今回はちょっとがんばってみます。 sumer45様、 色々と大事なことを教えていただき、とても助かりました。 どうもありがとうございました。