[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロの修正について』(666)
A1セルに数字を入力すると、画像ファイルが表示されるマクロをネットを参考に
してみましたが、A1 の入力規則のリスト表示が消えてしまいます。入力規則
自体は残っているので、このマクロのせいかと思いますが、私の力ではどうする
ことも出来ませんでした。また、A1セルを消しても、前の画像が残ってしまい
ます。以上2点の修正の仕方を教えてください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim mypic As Shape
Dim fpath As String, fname As String
Dim i As Long
If Target.Address = "$A$1" And IsNumeric(Target) = True And Target.Value = 0 Then
MsgBox "数字を入れて下さい。"
ElseIf Target.Address = "$A$1" And IsNumeric(Target) = True And Target.Value <> 0 Then
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each mypic In ActiveSheet.Shapes
mypic.Delete
Next
i = -6
fpath = ThisWorkbook.Path & "\写真台帳\"
fname = Dir(fpath & Target.Value & "*.jpg", vbNormal)
Do Until fname = ""
i = i + 7
With Range("C" & i)
Set objShape = ActiveSheet.Shapes.AddPicture(Filename:=fpath & fname, _
LinkToFile:=False, SaveWithDocument:=True, Left:=.Left, Top:=.Top, Width:=240, Height:=160)
End With
fname = Dir()
Loop
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End If
End Sub
< 使用 Excel:Excel2010、使用 OS:Windows7 >
再現しました。不思議ですねぇ。
http://tegetege.air-nifty.com/blog/2011/12/post-4831.html
原因はわかりませんが、保存しなおすと▼が表示されます。 (でも、また処理を行えば消えます)
回答にはなっていませんが情報提供として。
(β) 2015/08/25(火) 19:24
コードを読んでわかりましたよ。
For Each mypic In ActiveSheet.Shapes
mypic.Delete
Next
入力規則の▼もシェープです。ですから、それも削除されますから、表示されなくなるわけです。
ActiveSheet.Pictures.Delete
これにかえて試してみてください。
(β) 2015/08/25(火) 19:31
横から失礼します。
コメントもシェイプです。
コメントを示す赤い三角は残りますが、コメント自体は削除されます。 (カリーニン) 2015/08/25(火) 20:32
こういう記述がありました。
徒然なるままに MS Excel(たまにOffice) シェイプを削除
http://d.hatena.ne.jp/belie_kondo/20070220/1207584779
>コメントが Macro1 で消された場合、そのコメントがあったセルにマウスカーソルを持っていくと、、、 >Excel が落ちるというおまけがもれなく付いてきます。 >このおまけがなくなるのは、Excel2007 からです。 (カリーニン) 2015/08/25(火) 20:37
▼についてはコメントした通りなんですが、コードに関して。
1.まず、90%は問題が出ないと思いますがA1を含んで複数セルに変更があった時に。このコードでは実行時エラーになります。
・条件式は、途中で True になろうが False になろうが、最後まで判定実行されます。 そうすると If Target.Address = "$A$1" And IsNumeric(Target) = True And Target.Value = 0 Then この Target.Value = 0 という部分、Targetが複数セルなので、ここでエラーになります。 (たとえば A1 を含み、複数セルを選択して Deleteキーが押されたようなケース)
2.さらに↑のとおり、最後まで判定します。なので、And連結で、ずらずら書くより、1つずつの判定で If のネストをしたほうが処理効率はよくなります。 (False になっているのに、おかまいなしに、最後まで判定するのはもったいないですよね)
3.If 文の構成そのものもちょっと煩雑な感があります。
4.i = -6 にしておいて i = i+7 。気持ちはわかりますが、ここも、素直ではない印象です。
5.Application.DisplayAlerts = False/True の必要性がわかりません。
6.変数はすべて定義しましょう。
たとえばの例です。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fpath As String, fname As String Dim i As Long Dim objshape As Object
If Target.Address <> "$A$1" Then Exit Sub If Not IsNumeric(Target) Then Exit Sub
If Target.Value = 0 Then
MsgBox "数字を入れて下さい。"
Else
Application.ScreenUpdating = False
ActiveSheet.Pictures.Delete
i = 1
fpath = ThisWorkbook.Path & "\写真台帳\" fname = Dir(fpath & Target.Value & "*.jpg")
Do Until fname = ""
With Range("C" & i)
Set objshape = ActiveSheet.Shapes.AddPicture(Filename:=fpath & fname, _ LinkToFile:=False, SaveWithDocument:=True, Left:=.Left, Top:=.Top, Width:=240, Height:=160)
End With
fname = Dir() i = i + 7
Loop
Application.ScreenUpdating = True
End If
End Sub
(β) 2015/08/25(火) 22:17
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.