Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3422 / 13645 ツリー ←次へ | 前へ→

【62344】クリックだけでその画像を最背面に チューリップ 09/7/12(日) 15:56 質問[未読]
【62345】Re:クリックだけでその画像を最背面に ichinose 09/7/12(日) 17:24 発言[未読]
【62346】Re:クリックだけでその画像を最背面に チューリップ 09/7/12(日) 22:03 お礼[未読]
【62347】シートを開いたときに特定の画像を最前面に チューリップ 09/7/12(日) 22:46 質問[未読]
【62348】Re:シートを開いたときに特定の画像を最前... ichinose 09/7/13(月) 7:38 発言[未読]
【62349】Re:シートを開いたときに特定の画像を最前... チューリップ 09/7/13(月) 11:10 お礼[未読]

【62344】クリックだけでその画像を最背面に
質問  チューリップ  - 09/7/12(日) 15:56 -

引用なし
パスワード
   こんにちは、またわからないことが出てきたのでお願いします。
画像を置いて説明文を書く、アルバムのようなものを作っています。
(EXCELでの作成は適さないかもしれませんが、VBAの練習を兼ねて作っています)

たとえばHPなんかで、街並みの写真があり、クリックすると同じ場所の昔の写真が表示され、再度クリックすると元の写真が出てくる新旧比較みたいなのがありますが、自分の写真を使ってそういうのを作成しています。

画像を二枚重ねにして上をクリックすると下に隠れてる画像が前面に出てくるように、下記のようなコードで作りました。

上にある画像に書いたコード----------------------------
Sub 写真の順番を変える()
ActiveSheet.Shapes("写真1").Select
Selection.ShapeRange.ZOrder msoSendToBack
End Sub
------------------------------------------------------
下になっている写真に書いたコード----------------------
Sub 写真の順番を変える()
ActiveSheet.Shapes("写真2").Select
Selection.ShapeRange.ZOrder msoSendToBack
End Sub
------------------------------------------------------
二枚ひと組なわけですが、こうするとたくさんの写真を使う場合
ひと組ずつコードを作成しなければいけません。(100組だったらコードが100)
ですが、

Selection.ShapeRange.ZOrder msoSendToBack
End Sub

だけにすると、プログラムを実行する前にいちいち写真をアクティブにしなければいけません。(マクロ登録してるからCtrl押しながら)

そんなこといちいちやってられないので、クリックだけでクリックした写真を最背面に移動するにはどうすればいいでしょうか?
あと、画面を開いたときには絶対に写真1が最前面に表示されるようにする方法も知りたいです。

【62345】Re:クリックだけでその画像を最背面に
発言  ichinose  - 09/7/12(日) 17:24 -

引用なし
パスワード
   ▼チューリップ さん:
こんにちは。

Application.Callerを使うと可能です。

Sub test()
  If TypeName(Application.Caller) = "String" Then
    ActiveSheet.Shapes(Application.Caller).ZOrder msoSendToBack
  End If
End Sub

【62346】Re:クリックだけでその画像を最背面に
お礼  チューリップ  - 09/7/12(日) 22:03 -

引用なし
パスワード
   ichinoseさま

できました!ありがとうございます。

【62347】シートを開いたときに特定の画像を最前面...
質問  チューリップ  - 09/7/12(日) 22:46 -

引用なし
パスワード
   何度もすみません

>画面を開いたときには絶対に写真1が最前面に表示されるようにする方法も知りたいです。
の部分を補足いたします。

シートに写真1、写真2、写真3、写真4があり、
このうち写真1と写真2をクリックで入れ替え、写真3と写真4をクリックで入れ替えています。

シートを開いたら、写真1と写真3が最前面に来ている状態にしたくて、
シートモジュールに下記のコードを書きました。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Shapes.Range(Array("写真1", "写真3")) _
  .ZOrder msoBringToFront
End Sub

これを、今後写真がどんどん増えていってもArrey以下の部分を書き変えないですむ方法はないでしょうか?

【62348】Re:シートを開いたときに特定の画像を最...
発言  ichinose  - 09/7/13(月) 7:38 -

引用なし
パスワード
   ▼チューリップ さん:
おはようございます。

まず、
>シートを開いたら、写真1と写真3が最前面に来ている状態にしたくて、
を処理するイベントプロシジャーとして、Worksheet_SelectionChangeで良いのですか?
これだと、選択セル範囲に変化がないとコードは、実行されませんよ!!
Worksheet_Activate()に処理コードを記述するのではないですか?
(実際には、Workbook_Open()でも必要になるかもしれませんが、とりあえず
ここでは、Worksheet_Activateだけ記述します)


中のコードですが、

>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>ActiveSheet.Shapes.Range(Array("写真1", "写真3")) _
>  .ZOrder msoBringToFront
>End Sub
>
>これを、今後写真がどんどん増えていってもArrey以下の部分を書き変えないですむ方法はないでしょうか?

図の名前が 写真n(nは、数字)という形式で命名されていて、この中でnが奇数の図を

「最前面に来ている状態にしたくて」というなら・・、

Private Sub Worksheet_Activate()
  Dim n As Long
  On Error Resume Next
  n = 1
  Do
    If n Mod 2 = 1 Then
     Shapes("写真" & n).ZOrder msoBringToFront
     If Err.Number <> 0 Then Exit Do
    End If
    n = n + 1
  Loop
  On Error GoTo 0
End Sub


「最前面に来ている状態にしたい図」と図の名前に規則がないなら、
どこかに(別のシート等)最前面に来ている状態にしたい図の名前を記述しておかなければなりませんね!!

【62349】Re:シートを開いたときに特定の画像を最...
お礼  チューリップ  - 09/7/13(月) 11:10 -

引用なし
パスワード
   お教えいただいたとおり、図の名前に規則性を持たせて、上に出したい画像のnの部分には奇数が入るようにするとうまくいきました。
いろいろ本当にありがとうございます。

また何かありましたらお邪魔いたします、よろしくお願いします。

3422 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free