Excel VBA質問箱 IV

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

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


12219 / 13644 ツリー ←次へ | 前へ→

【11481】オートシェイプの操作について Datacom 04/3/9(火) 17:46 質問
【11482】Re:オートシェイプの操作について Jカーター 04/3/9(火) 18:04 回答
【11488】Re:オートシェイプの操作について Kein 04/3/9(火) 20:08 回答
【11525】Re:オートシェイプの操作について Datacom 04/3/10(水) 23:01 お礼
【11575】Re:オートシェイプの操作について Datacom 04/3/11(木) 17:27 質問
【11661】Re:オートシェイプの操作について カド 04/3/13(土) 18:47 質問
【11663】Re:オートシェイプの操作について りん 04/3/13(土) 18:55 回答
【11664】Re:オートシェイプの操作について カド 04/3/13(土) 20:33 質問
【11665】Re:オートシェイプの操作について りん 04/3/13(土) 20:52 発言
【11666】Re:オートシェイプの操作について カド 04/3/13(土) 20:58 お礼

【11481】オートシェイプの操作について
質問  Datacom  - 04/3/9(火) 17:46 -

引用なし
パスワード
   Execlのシート上に複数の図形(オートシェイプ)を配置しています。
マクロのそれぞれの図形がクリックされた場合の処理を記述したい
のですが、以下のように明示的にそれぞれのシェイプを指定せずに
、INDEXを用いた指定方法は出来ないのでしょうか?

現在の記述方法だとオートシェイプの数が増えれば、それだけ記述
しなければなりません。


「現在の記述」
Sub オートシェイプ1_Click()

  ActiveSheet.Shapes("AutoShape 1").Select
  
  オートシェイプ1の処理

End Sub
Sub オートシェイプ2_Click()

  ActiveSheet.Shapes("AutoShape 2").Select
  
  オートシェイプ2の処理
      ・
      ・
      ・


「望む記述」
Sub オートシェイプ_Click()

  選択されたオートシェイプのINDEXを取得
  ActiveSheet.Shapes(INDEX番号).Select
  
  オートシェイプINDEX番号毎の処理


よい方法をお願い致します。

【11482】Re:オートシェイプの操作について
回答  Jカーター  - 04/3/9(火) 18:04 -

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

このように一個マクロを作っておいて
それぞれの図形に登録して使い回してはどうでしょう?
Application.Callerが自分自身の名前です。

それから
処理するために「Select」する必要は無いですよ。
-----------------------------------------------------------
Sub オートシェイプALL_Click()
  With ActiveSheet.Shapes(Application.Caller)
    ここに処理(Selectは不要です!)
  End With
End Sub

【11488】Re:オートシェイプの操作について
回答  Kein  - 04/3/9(火) 20:08 -

引用なし
パスワード
   ActiveSheet.DrawingObjects.OnAction = "Test1"

というコードを実行すれば、全ての図形にいっぺんに同じマクロを割り当てられます。
そして

Sub Test1()
  Dim x As Variant

  x = Application.Caller
  If VarType(x) <> 8 Then Exit Sub
  ActiveSheet.Shapes(x) ・・・
  'ActiveSheet.DrawingObjects(x) ・・・

End Sub

というように、クリックした図形を特定して処理をします。VarType(x) = 8 と
判定された後は、x に文字列(図形の名前) が入っていることが確認されているので、
文字列の一部を Left関数等で切り出してどんな図形かを取得し、Select Case で
処理を分岐できます。標準モジュールに入れて使います。

【11525】Re:オートシェイプの操作について
お礼  Datacom  - 04/3/10(水) 23:01 -

引用なし
パスワード
   Jカーターさん,Keinさん、早々のお返事ありがとうございます。
急な出張で、皆さんからの返信を見るのがやっとで、教えて頂いた
マクロをまだ理解し、実際にテストできていません。
来週にはテストできると思います。

また、ご質問をさせて頂くと思いますがよろしくお願い致します。
まずは、お礼まで。ありがとうございました。

【11575】Re:オートシェイプの操作について
質問  Datacom  - 04/3/11(木) 17:27 -

引用なし
パスワード
   ▼Kein さん:
>ActiveSheet.DrawingObjects.OnAction = "Test1"
>
>というコードを実行すれば、全ての図形にいっぺんに同じマクロを割り当てられます。

上記コードはどういったタイミングで実行すればよいのでしょうか?
1.Excelを開いたときに毎回
2.このマクロを作成したときに1回きり
3.シートがアクティブになったときに常に

よろしくお願い致します。

【11661】Re:オートシェイプの操作について
質問  カド E-MAIL  - 04/3/13(土) 18:47 -

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

過去ログを見て勉強していたのですが、
どのような時に、文字列が入り(VarType(x) = 8) 、
どのような時に文字列以外が入るのですか?

>Sub Test1()
>  Dim x As Variant
>
>  x = Application.Caller
>  If VarType(x) <> 8 Then Exit Sub
>  ActiveSheet.Shapes(x) ・・・
>  'ActiveSheet.DrawingObjects(x) ・・・
>
>End Sub
>
>というように、クリックした図形を特定して処理をします。VarType(x) = 8 と
>判定された後は、x に文字列(図形の名前) が入っていることが確認されているので、
>文字列の一部を Left関数等で切り出してどんな図形かを取得し、Select Case で
>処理を分岐できます。標準モジュールに入れて使います。

【11663】Re:オートシェイプの操作について
回答  りん E-MAIL  - 04/3/13(土) 18:55 -

引用なし
パスワード
   カド さん、こんばんわ。

>過去ログを見て勉強していたのですが、
>どのような時に、文字列が入り(VarType(x) = 8) 、
>どのような時に文字列以外が入るのですか?
>>Sub Test1()
>>  Dim x As Variant
>>
>>  x = Application.Caller
>>  If VarType(x) <> 8 Then Exit Sub
>>  ActiveSheet.Shapes(x) ・・・
>>  'ActiveSheet.DrawingObjects(x) ・・・

ヘルプより引用
引用開始========
Caller プロパティ
Visual Basic を呼び出した方法についての情報を返します。

次にプロパティの各値で表される、Visual Basic を呼び出した方法についての情報を示します。
●そのセルを示す Range オブジェクト
 単一セルに入力されたユーザー定義関数
●そのセル範囲を示す Range オブジェクト
 セル範囲内の配列数式の一部として入力されたユーザー定義関数
●ドキュメント名を示す文字列 
 Auto_Open、Auto_Close、Auto_Activate、または Auto_Deactivate マクロ
●マクロの対象となるグラフ オブジェクトの識別名またはセル参照 (ただし該当する場合のみ)    
 OnDoubleClick プロパティまたは OnEntry プロパティのどちらかによって設定されたマクロ
●#REF! エラー値
 [マクロ] ダイアログ ボックス ([ツール] - [マクロ] - [マクロ])、または上記以外の呼び出し
引用終了========

です。

【11664】Re:オートシェイプの操作について
質問  カド E-MAIL  - 04/3/13(土) 20:33 -

引用なし
パスワード
   ▼りん さん 回答ありがとうございます。

残念ながらヘルプの内容が理解できませんでした。

今回の場合は、
”全ての図形にいっぺんに同じマクロを割り当てられる。コード”
ということで、シート上に複数のテキストボックスや楕円等を
描いて実行しましたがVarType(x) <> 8 となることは
有りませんでした。

具体的にどのような場合にVarType(x) = 8となるのでしょうか?

【11665】Re:オートシェイプの操作について
発言  りん E-MAIL  - 04/3/13(土) 20:52 -

引用なし
パスワード
   カド さん、こんばんわ。

>”全ての図形にいっぺんに同じマクロを割り当てられる。コード”
>ということで、シート上に複数のテキストボックスや楕円等を
>描いて実行しましたがVarType(x) <> 8 となることは
>有りませんでした。
 確かに図形をクリックしても常にVarType(x) = 8(vbString)になります。それはヘルプに書いてあるとおりです。
 しかし、マクロの実行やVBEの画面から、Test1を直接実行したらエラーになります。ほかのSubからCallする場合も。
 Test1を直接実行しないと必ずしも言い切れない時は、エラーを防ぐためにも分岐をつけておく方がよいと思いますけど。

【11666】Re:オートシェイプの操作について
お礼  カド E-MAIL  - 04/3/13(土) 20:58 -

引用なし
パスワード
   ▼りん さん 何度も回答ありがとうございます。

ちょっと難しくて有用性がピンと来ませんでした。
もう少しレベルが上がってから、再考したいと思います。

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