Excel VBA質問箱 IV

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

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


10720 / 13646 ツリー ←次へ | 前へ→

【20232】ShapeのZOderについて つん 04/12/2(木) 16:08 質問[未読]
【20236】Re:ShapeのZOderについて Jaka 04/12/2(木) 16:46 発言[未読]
【20238】Re:ShapeのZOderについて つん 04/12/2(木) 16:52 発言[未読]
【20241】Re:ShapeのZOderについて BOTTA 04/12/2(木) 20:24 発言[未読]
【20242】Re:ShapeのZOderについて つん 04/12/2(木) 22:08 お礼[未読]

【20232】ShapeのZOderについて
質問  つん E-MAIL  - 04/12/2(木) 16:08 -

引用なし
パスワード
   皆様、こんにちは^^
いつもお世話になっております。

さて、質問なんですが、
シートに、同じサイズの画像を5枚ほど重ねて配置しています。
画像には、1〜5の連番で名前がついています。
その名前で指定して、ZOderプロパティで最前面にもってくることによって
画像の切り替えをしたいと思っています。

こんな感じです。

Sub test()

  Dim i As Long
  
  i = Application.InputBox("数字", "1〜5までの数字", , , , , , 1)
  
  With Worksheets("イラスト")
    .Shapes(CStr(i)).ZOrder msoBringToFront
  End With
  
End Sub

テスト的に作ってるのでエラー処理はさぼってます(^^;

しかし、これを実行すると、何故か3〜4回に1回は正常に動かないようなんです。
画像の切り替えがなされません。
もう一度繰り返すと、切り替わります。
これを、確実に動くようにするにはどうしたらいいんでしょうか?

よろしくお願いします。

ちなみに、Windows98se + Excel2002 です。

【20236】Re:ShapeのZOderについて
発言  Jaka  - 04/12/2(木) 16:46 -

引用なし
パスワード
   こんにちは。

こんな感じにしてやってみました。
私のいかれた環境だと名前定義を数値でつけられなかったから...。
一応うまく動いているようでしたが、VBエディタ上から直に動かすと動きが鈍かったです。
この辺も関係してませんか?

  i = Application.InputBox("数字", "1〜5までの数字", , , , , , 1)
  'For ii = 1 To 3
  'For i = 1 To 5
  With Worksheets("イラスト")
    .Shapes("四角形 " & CStr(i)).ZOrder msoBringToFront
    Doevents  'これ入れてみるとどうでしょうか?
    Application.Wait Now + TimeValue("00:00:01")
  End With
  'Next
  'Next

【20238】Re:ShapeのZOderについて
発言  つん E-MAIL  - 04/12/2(木) 16:52 -

引用なし
パスワード
   Jaka さん、こんにちは〜^^

>こんな感じにしてやってみました。
>私のいかれた環境だと名前定義を数値でつけられなかったから...。
>一応うまく動いているようでしたが、VBエディタ上から直に動かすと動きが鈍かったです。
>この辺も関係してませんか?
>
>  i = Application.InputBox("数字", "1〜5までの数字", , , , , , 1)
>  'For ii = 1 To 3
>  'For i = 1 To 5
>  With Worksheets("イラスト")
>    .Shapes("四角形 " & CStr(i)).ZOrder msoBringToFront
>    Doevents  'これ入れてみるとどうでしょうか?
>    Application.Wait Now + TimeValue("00:00:01")
>  End With
>  'Next
>  'Next

あー、DoEventsかあ。どうかな?やってみます。
今、仕事きちゃって試せないので、家に帰ってチャレンジしてみますね。
取り急ぎお礼まで〜

【20241】Re:ShapeのZOderについて
発言  BOTTA  - 04/12/2(木) 20:24 -

引用なし
パスワード
   つんさん、Jakaさん、こんばんは。
おひさです。

想像ですが、
>画像には、1〜5の連番で名前がついています。
↑これがよろしくないんじゃぁないかしら?
VBAでは時々、自動で型変換してくれるという大きなお世話機能があります。
だから、
    .Shapes(CStr(i))
を勝手に
    .Shapes(i)
と変換してしまっているとか???

だから、引数Indexに図形の名前を指定したい場合はJakaさんの様に
    .Shapes("四角形 " & CStr(i))
ちゃんとした文字列にした方がいいかも。

ちなみに私の環境でも名前定義を数値でつけられない場合もありました。

ついでに
    .Shapes(i).ZOrder msoBringToFront
とやってしまった場合、ZOrderが入れ替わるたびにIndex番号が更新され
てしまうため、どのShapesが現れるかは動かすまでわからなかったみたい。

【20242】Re:ShapeのZOderについて
お礼  つん  - 04/12/2(木) 22:08 -

引用なし
パスワード
   Jakaさん、BOTTA さん!

どうもありがとー!
解決したみたいです。


>>画像には、1〜5の連番で名前がついています。
>↑これがよろしくないんじゃぁないかしら?
>VBAでは時々、自動で型変換してくれるという大きなお世話機能があります。
>だから、
>    .Shapes(CStr(i))
>を勝手に
>    .Shapes(i)
>と変換してしまっているとか???
>
>だから、引数Indexに図形の名前を指定したい場合はJakaさんの様に
>    .Shapes("四角形 " & CStr(i))
>ちゃんとした文字列にした方がいいかも。
>
>ちなみに私の環境でも名前定義を数値でつけられない場合もありました。
>
>ついでに
>    .Shapes(i).ZOrder msoBringToFront
>とやってしまった場合、ZOrderが入れ替わるたびにIndex番号が更新され
>てしまうため、どのShapesが現れるかは動かすまでわからなかったみたい。

そのとおりのようでした。
お二人のアドバイスの通り、完全に文字列にしてしまったら、毎回ちゃんと動きました。
「CStr」だけではだめだったんですね・・・

どうもありがとうございました(^o^)ノ

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