Excel VBA質問箱 IV

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

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


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

【22625】オートシェイプにマクロを追記したいのでが... はないきぴーぴー 05/2/24(木) 22:23 質問[未読]
【22627】Re:オートシェイプにマクロを追記したいのでが... ichinose 05/2/24(木) 22:40 発言[未読]
【22629】Re:オートシェイプにマクロを追記したいのでが... ponpon 05/2/24(木) 22:56 発言[未読]
【22631】Re:オートシェイプにマクロを追記したいのでが... ichinose 05/2/24(木) 23:11 発言[未読]
【22634】Re:オートシェイプにマクロを追記したいのでが... ponpon 05/2/24(木) 23:48 発言[未読]
【22635】Re:オートシェイプにマクロを追記したいのでが... はないきぴーぴー 05/2/25(金) 0:16 お礼[未読]
【22637】Re:オートシェイプにマクロを追記したいのでが... ichinose 05/2/25(金) 8:33 発言[未読]

【22625】オートシェイプにマクロを追記したいのでが...
質問  はないきぴーぴー  - 05/2/24(木) 22:23 -

引用なし
パスワード
   全くの素人で申し訳ありませんが何卒ご教授下さい

私のやりたいことは
例えば図形の円が5個あって、その内の1つをクリックすると
クリックされた円を取得し、その円だけを赤色に塗りつぶしたいのです
さらにクリックした円がすでに赤色ならば白色に戻すというような
ことも出来たらと思っています。
このやり方が、どうやっていいか全くわかりません。


図形をマクロに登録すると、マウスポインターが手の形になりますよね、
そのままクリックするとマクロを実行できるので
なんとかこの機能を利用して上記のことができるマクロを作りたいと
思っております

説明が下手で申し訳ありませんが
お願いします

【22627】Re:オートシェイプにマクロを追記したいのでが...
発言  ichinose  - 05/2/24(木) 22:40 -

引用なし
パスワード
   ▼はないきぴーぴー さん:
こんばんは。

>全くの素人で申し訳ありませんが何卒ご教授下さい
>
>私のやりたいことは
>例えば図形の円が5個あって、その内の1つをクリックすると
>クリックされた円を取得し、その円だけを赤色に塗りつぶしたいのです
>さらにクリックした円がすでに赤色ならば白色に戻すというような
>ことも出来たらと思っています。
>このやり方が、どうやっていいか全くわかりません。
>
>
>図形をマクロに登録すると、マウスポインターが手の形になりますよね、
>そのままクリックするとマクロを実行できるので
>なんとかこの機能を利用して上記のことができるマクロを作りたいと
>思っております
>
以下のコードを標準モジュールにコピーしてください。
'================================================
Sub sample()
  Dim shpnm As String
  shpnm = Application.Caller
  With ActiveSheet.Shapes(shpnm)
   If .Fill.ForeColor.SchemeColor = 10 Then
    .Fill.ForeColor.SchemeColor = 9
   Else
    .Fill.ForeColor.SchemeColor = 10
    End If
   End With
End Sub

それぞれの円を選択して、
「右クリック」----「マクロの登録」でマクロの登録ダイアログが表示されますから
上記のsampleを指定してください。

設定後、各円をクリックして試してみてください。

【22629】Re:オートシェイプにマクロを追記したいのでが...
発言  ponpon  - 05/2/24(木) 22:56 -

引用なし
パスワード
   ▼ichinose さん ▼はないきぴーぴー さん:
 ponponです。こんばんは。
私も作ったのですが、
一つならうまくいくのですが・・・
>  Dim shpnm As String
>  shpnm = Application.Caller

ここの意味を教えてください。ichinose さん お願いします。 

Sub test()

   With ActiveSheet.Shapes(1).Fill
   If .ForeColor.SchemeColor = 10 Then
     .ForeColor.SchemeColor = 9
   Else
     .ForeColor.SchemeColor = 10
   End If
  End With
End Sub

【22631】Re:オートシェイプにマクロを追記したいのでが...
発言  ichinose  - 05/2/24(木) 23:11 -

引用なし
パスワード
   ▼ponpon さん、こんばんは。

>私も作ったのですが、
>一つならうまくいくのですが・・・
>>  Dim shpnm As String
>>  shpnm = Application.Caller
>
>ここの意味を教えてください。ichinose さん お願いします。 
HelpのCallerプロパティに説明があると思いますが、
マクロの対象となるオブジェクトの識別名が取得できます。
これは、呼び出し元によって内容が変わりますから、最初によく確認してみて下さい。

この例だと
msgbox application.caller

なんてコードで確認するとわかると思います。
私は、ユーザー定義関数を作成する時に使用た経験があります。
但し、そのときは、Application.Callerで取得する内容も違っていますが・・・。

標準モジュールに
'===============================================
Function mysheet()
  dim rng as range
  Set rng = Application.Caller
  mysheet = rng.Parent.Name
End Function

として、
どこかのセルに

「=mysheet()」

と指定してみてください。
シート名が表示されます。
コードを見るとわかるかと思いますが、
application.callerでRangeオブジェクトを取得しています。

呼び出し方法によって返されるデータの種類も違うでしょう?
うまく使えばいままで出来なかった事が可能になるかもしれませんよ!!


>
>Sub test()
>
>   With ActiveSheet.Shapes(1).Fill
>   If .ForeColor.SchemeColor = 10 Then
>     .ForeColor.SchemeColor = 9
>   Else
>     .ForeColor.SchemeColor = 10
>   End If
>  End With
>End Sub

【22634】Re:オートシェイプにマクロを追記したいのでが...
発言  ponpon  - 05/2/24(木) 23:48 -

引用なし
パスワード
   ponponです。こんばんは。
ichinoseさんありがとうございます。

>私は、ユーザー定義関数を作成する時に使用た経験があります。
見たのを覚えているような気がします。

>マクロの対象となるオブジェクトの識別名が取得できます。
>呼び出し方法によって返されるデータの種類も違うでしょう?

わかったような、わからないような(^^;
マクロを何が呼び出しているかがわかるってことかな?
この場合は、マクロを登録したshape名前、他にはダブルクリックであるとか、
 Rangeであるとか・・・
宣言からすると文字列で返すってことですよね。この場合は。
今回の場合は、マクロを登録したshape名前が取得できるので、一々shape名を
指定せずに、呼び出したshape名を取得してマクロを走らせたって事はわかりましたが、・・・

はないきぴーぴー さん 横からすみませんでした。

【22635】Re:オートシェイプにマクロを追記したいのでが...
お礼  はないきぴーぴー  - 05/2/25(金) 0:16 -

引用なし
パスワード
   ichinoseさん 感動しました!!
全く思っていた動きますね。
ありがとうございます。本当に助かりました!

▼ponpon さん横やりとは思ってませんので気にしないで下さいね

【22637】Re:オートシェイプにマクロを追記したいのでが...
発言  ichinose  - 05/2/25(金) 8:33 -

引用なし
パスワード
   ▼ponpon さん:
おはようございます。

>>マクロの対象となるオブジェクトの識別名が取得できます。
>>呼び出し方法によって返されるデータの種類も違うでしょう?
>
>わかったような、わからないような(^^;
>マクロを何が呼び出しているかがわかるってことかな?

Helpには、「Visual Basic を呼び出した方法についての情報を返します」
とあるのでそういう認識でよいかと思います。

但し、呼び出し方によってApplication.Callerで返されるデータも違うと言う事です。
Typename関数を使って識別する方法を私は良く見ますし、
私もApplication.Callerのデータタイプを調べる場合はこれを使っています。
Typename関数の詳細は、HELPでチェックしてみてください。

ユーザー定義のコマンドバーを作成して、
そこにいくつかのボタンを配置した場合に
登録したマクロにこのApplication.Callerを使用すると
配列を返してくれます。以下のコードは、その例です。
標準モジュールに
'===================================================
Const cbdnm As String = "サンプル"
Sub 設定1()
'サンプルというコマンドバーを作成し、その中に10個のボタンを配置します
  Dim cmdb As CommandBar
  Dim cmd As CommandBarControl
  Set cmdb = Application.CommandBars.Add(cbdnm)
  dd = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
  For idx = LBound(dd) To UBound(dd)
   cmdb.Visible = True
   Set cmd = cmdb.Controls.Add(msoControlButton)
   With cmd
    .Style = msoButtonCaption
    .Caption = dd(idx)
    .OnAction = "sample1"
    End With
   Next
 
End Sub
'===============================================================
Sub sample1()
'各ボタンに登録するマクロ
' msgbox typename(application.caller)
  If LCase(TypeName(Application.Caller)) = "variant()" Then
   c_inf = Application.Caller
   '配列を返します c_inf(1)---インデックス
   '        c_inf(2)---コマンドバーの名前
   With Application.CommandBars(c_inf(2))
    MsgBox .Controls(c_inf(1)).Caption & "のボタンが押されました"
    End With
   End If
End Sub
'=================================================================
Sub 設定消去()
'作成したコマンドバーを削除
  On Error Resume Next
  Application.CommandBars(cbdnm).Delete
  On Error GoTo 0
End Sub

他にも種類があるかもしれませんから、試してみてください。

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