- ベストアンサー
エクセルで、図を削除した時にセルの内容を変更するには
Excel97, Windows98SEを使用しています。 下記のようなマクロで、シートに写真を挿入しています。 例えば選択した写真が間違っていた時に、その写真を選択して 右クリック → 切り取り という操作をしますが、その時に、写真を挿入した際にセルに入力した文字列も自動的に消えるようにしたいのです。 Private Sub Worksheet_Activate() で、選択した写真の入っているセル番地を取得するのかな? と考えたのですがその先がわかりません。 ご存知の方、どうぞよろしくお願いいたします。 Sub 写真挿入() On Error GoTo エラー処理 写真パス = Application.GetOpenFilename '「ファイルを開く」ダイアログ表示・ファイル名取得 ActiveSheet.Pictures.Insert(写真パス).Select '図を挿入 With Selection .ShapeRange.LockAspectRatio = msoTrue '縦横比を固定する .ShapeRange.Height = 250 '写真の高さ .Name = "写真" '名前を付ける End With If Selection.Width < Selection.Height Then '縦長の写真だった場合 Selection.ShapeRange.IncrementLeft 72# '枠の中央に配置する End If ActiveCell.Offset(0, 1).Value = 写真パス '取得したフルパスを隣のセルへ入力 エラー処理: End Sub
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 次のようにされるとよいでしょう。 NM = Selection.Name 位置 = ActiveSheet.DrawingObjects(NM).TopLeftCell.Address
その他の回答 (2)
- misatoanna
- ベストアンサー率58% (528/896)
> 縦長の写真だった場合、枠の中央に配置する マクロを実行する前に選択するセルの形やサイズがわかりませんし、「枠」という ものが何なのかもわかりません。 位置 = ActiveSheet.DrawingObjects(1).TopLeftCell.Address で写真の左上端が位置するセルのアドレスを取得することはできますが、提示され たマクロですと、縦長の画像の場合に画像位置が右にずれてしまいますので、フル パスの入ったセルを特定できません。 次のようにして対処することはできないのでしょうか。 図を表示すると同時に、その右上端を基点としたテキストボックスを自動的に作成 しフルパスを表示して画像とグループ化する処理です。 ActiveCell.Offset(0, 1).Value = 写真パス の一行を、次の内容に入れ換えます。 TP = Selection.Top LF = Selection.Left WD = Selection.Width ActiveSheet.Shapes.AddTextbox(msoShapeRectangle, LF + WD, TP, 1#, 1#). _ Select With Selection .Characters.Text = 写真パス .ShapeRange.Fill.Visible = msoFalse .ShapeRange.Line.Visible = msoFalse .AutoSize = True .Name = "パス" 'フルパスを名前にする End With ActiveSheet.Shapes.Range(Array("写真", "パス")).Select Selection.ShapeRange.Group.Select
お礼
ご回答どうもありがとうございます。 説明不足でしたようですみません。 作っているものは工事用の写真アルバムで、 写真を入れる「枠」は、9R×21Cのセルを結合したもので、大きさは縦が250(写真の縦の長さ)で、横が一般的な横向きのデジカメ写真の比率とほぼ同じ幅になっています。 横長の写真ならほぼそのセル内に収まり、縦長の写真も選択したセル内からははみ出ないようになっています。 > 位置 = ActiveSheet.DrawingObjects(1).TopLeftCell.Address 教えていただきましたコードですと、どうしてもシートの一番上にある図形のアドレスしか取得できませんでした…。 ハンドルの付いた画像、もしくは削除される画像のアドレスを取得する方法はありませんでしょうか? どうぞよろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
多分私には回答する力がないのですが 「シートに挿入した画像を削除したとき、それをイベントとして捉える」方法と言うことになるのではと思いました。 もしそうであれば、自分のコーディングを上げておられますが、それが妨げ(読むのが煩わしく、焦点がぼやけて)となって、回答出来るひとが、振り向いてくれない惧れがあります。 エクセルVBAレベルでは、イベントの主体として認めてくれているのは、シートやコントロールなど極く限定的で シート上に見えるもの色々を対象にしてイベントを捉えるには、APIレベル(ウインドウ・メッセージレベル)の研究が必要なのではと想像しています。コントロールの集合のイベント(ボタンが沢山あって、どれかクリックすると何かしたい)などで、クラス化などの説明も見たことがありました(大村あつしさんの本)。
補足
ご回答どうもありがとうございます。 > 「シートに挿入した画像を削除したとき、それをイベントとして捉える」方法 仰る通りです。でも手持ちのVBAの本を読みましたところ、シートやブック、コントロールのイベントはありますが、オートシェイプにはなさそうでしたので、シートのイベントでどうにかする方法があればいいなと思って質問いたしました。 質問内容は、できるだけ回答して頂ける方が補足を必要としないように心掛けて書いたつもりでしたが、蛇足だったようですね。反省しております。 お手数をおかけしまして申し訳ありませんでした。
お礼
ご回答どうもありがとうございます。 お陰様でうまくできました。 右クリック → 切り取り で同時に文字列を削除するのは難しそうですので、削除用ボタンを作って対応することになりました。 またわからない事がありましたらよろしくお願いいたします。