[[20151119162349]] 『直前まで選択していた図形の名称』(ひろとし) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『直前まで選択していた図形の名称』(ひろとし)

よろしくお願いします。

ある場所のセルをダブルクリックしたときに直前まで選択していた画像をそのセルの左上に移動させたいのですが、可能でしょうか。
宜しくお願い致します。

< 使用 Excel:Excel2010、使用 OS:unknown >


画像を選択することもマクロで実行。どの画像を選択したかをグローバル変数に記憶しておけば可能かと思います。
(???) 2015/11/19(木) 17:02

 ダブルクリックしたとたんに(というか、ダブルクリックのためにセルを選択したとたんに)画像の選択がはずれますから
 VBA処理を考えると、(???)さんご指摘の通りです。

 一方、素朴な疑問です。

 1.画像を選択
 2.移動させたい右下のセルを選択してダブルクリック

 という操作になるんだと思いますが

 1.画像を選択
 2.移動させたいセルにドラッグ

 これと、操作数はかわらないのでは?

(β) 2015/11/19(木) 17:38


'シートモジュール
Dim SelectedPicture As Shape
Sub 画像選択() '事前準備:シート上の全画像にこのマクロを登録しておく
    Shapes(Application.Caller).Select
    Set SelectedPicture = Shapes(Application.Caller)
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    SelectedPicture.Top = Target.Offset.Top - SelectedPicture.Height
    SelectedPicture.Left = Target.Offset.Left - SelectedPicture.Width
End Sub
(mm) 2015/11/19(木) 17:43

(???)さん(β)さん。有難うございます。
 
現実的には写真を報告書に張り付けるものです。
ダブルクリックするセルには数字を入れておき、その数字で結合されたセルサイズに
合致させて張り付けたり、縦横比をそのまま縦サイズのみ結合されたセルサイズに
合致させて張り付けたりするように作成しています。
 
それを事務所の人が使用しているのですが、その画像を移動させてしまったり、
場所を変えたいという希望があり、直前の画像の名称が取得できればと相談しました。
 
以前にユーザーフォームでメニューを作っていた時は移動ボタンを作っていましたから、
余計にほしいらしいのです。

長くなりすみません。
(ひろとし) 2015/11/19(木) 18:35


(mm)さんありがとうございます。
 
上に現状を記載したのですが、画像ごとに登録すると取込みの時に登録することはできますが、
エクセルの図の取込みから取り込まれると登録ができないことになります。
 
また、人にそのシートだけをデータで渡すこともあるのでその場合には図形に登録された
マクロを消去しないといけなくなります。
 
面倒な内容で申し訳ないです。 

(ひろとし) 2015/11/19(木) 18:43


 >>エクセルの図の取込みから取り込まれると登録ができないことになります。 

 取り込んだ後、マクロ登録をして、それを選択してダブルクリックすればできないことはないですね。

 >>人にそのシートだけをデータで渡すこともあるのでその場合には図形に登録された 
 マクロを消去しないといけなくなります

 それは、渡す前に当該シートの図に登録されているマクロを一括削除するマクロを流して
 きれいにして渡すという方法で、なんとでもなると思います。

 ということなんですが、(ひろとし) 2015/11/19(木) 18:35 で説明されたことを、もう少し具体例で
 説明されると、皆さんから別案も寄せられるかもです。
 たとえば、そのダブルクリックしようとしているセル内に画像の左上隅が、ちょっとかかる状態でドラッグしておいてから
 ダブルクリックし、配置条件をそのセルから取得して、移動させるとか。

(β) 2015/11/19(木) 19:07


 全く別案ですが。

 1.画像を選択
 2.目的のセルをダブルクリック

 という操作と比較すると1手間多いのですが

 標準モジュールに

 Sub Test()
    Dim c As Range
    If TypeName(Selection) <> "Picture" Then
        MsgBox "画像が選ばれていません"
        Exit Sub
    End If

    On Error Resume Next
    Set c = Application.InputBox("セルを選択してください", Type:=8)
    On Error GoTo 0

    If c Is Nothing Then Exit Sub

    'ここで c(1) を相手に処理

    MsgBox c(1).Address & vbLf & Selection.Name

 End Sub

 このマクロにマクロショートカットキー(たとえば a) を割り当て。

 操作は

 1.画像を選択
 2.Ctrl/a
 3.目的のセルを選択

 になります。

(β) 2015/11/19(木) 19:21


(β)さんありがとうございます。
 
画像の選択時に何かのアクションをすれば、どこかには最後の処理として記録が残っていれば、
そこから抽出できるかと思いましたが…

やはりその時だけユーザーホームを出すことにしました。
簡単に書くと ThisWarkbookシートに(これで各シートをそのままコピーや移動されて他人に渡ってもマクロは含まれない)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

処理判断 = ActiveCell.Value
場所 = ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
幅 = Selection.Width
高さ = Selection.Height

If 処理判断 = 移動 Then UserForm1.Show (vbModeless): Exit Sub

If Application.Dialogs(xlDialogInsertPicture).Show = False Then Exit Sub
名前 = Selection.Name

Select Case 処理判断

Case 1
With ActiveSheet.Shapes(名前)
.LockAspectRatio = msoTrue
.Left = Range(場所).Left
.Top = Range(場所).Top
.Height = 高さ
End With

Case 2
With ActiveSheet.Shapes(名前)
.LockAspectRatio = msoFalse
.Left = Range(場所).Left
.Top = Range(場所).Top
.Width = 幅
.Height = 高さ
End With
End Sub

ユーザーホームボタンに下

Private Sub CommandButton1_Click()

If TypeName(Selection) <> "Range" Then 名前 = Selection.Name Else: MsgBox "表示したい図形を選択してから実行してください。": Unload UserForm1: Exit Sub
セル場所 = ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
幅 = セル場所.Width
高さ = セル場所.Height

With ActiveSheet.Shapes(名前)
.LockAspectRatio = msoFalse
.Left = Range(セル場所).Left
.Top = Range(セル場所).Top
.Width = 幅
.Height = 高さ
End With
Unload UserForm1
End Sub

上のイメージで処理なら可能でした。

皆様本当にありがとうございました。
(ひろとし) 2015/11/20(金) 09:33


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.