|    | 
     ▼VBA初心者 さん: 
おはようございます。 
 
 
>通常、コマンドボタンからマクロを起動する場合、 
> 
>> Private Sub CommandButton1_Click() 
>>  
>> End Sub 
> 
>というような記述をするかと思います。 
> 
>コマンドボタンが複数あり、類似した処理を実行したいと考えているのですが、コマンドボタンの数だけ上記のような記述をしないといけないのでしょうか? 
> 
>「OLEObjects」をうまく使えれば・・・と考えているのですが、なかなかうまくいきません。どなたかお知恵をお貸し頂けませんか? 
 
これは、コマンドバー「コントロールツールボックス」のコマンドボタンですね? 
 
結論から言えば、この手の処理はコマンドバー「フォーム」のボタンを使う方が 
よいという事なのですが・・・。 
 
コマンドバー「コントロールツールボックス」のコマンドボタンでも動作としての 
実現は可能です。 
 
 
新規ブックのシートSheet1に「コントロールツールボックス」のコマンドボタンを 
3個配置してください。(Commandbutton1〜Commandbutton3) 
 
VBEにてクラスモジュールを挿入してください。 
(「挿入」----「クラスモジュール」) 
クラス名は規定値のClass1 
このクラスモジュールに 
 
'================================================================ 
Public id As Long 
Public WithEvents cmd As CommandButton 
 
Private Sub cmd_Click() 
  MsgBox "コマンドボタン" & id & "が押された" 
'ここにクリック時のコードを記述idにより、コードの分岐も可能。 
End Sub 
 
 
更にSheet1のモジュールに 
'======================================= 
Private cls_btn(1 To 3) As Class1 
'============================================================== 
Sub settei() 
  For idx = 1 To 3 
    Set cls_btn(idx) = New Class1 
    With cls_btn(idx) 
      .id = idx 
      Set .cmd = OLEObjects("commandbutton" & idx).Object 
      End With 
    Next idx 
End Sub 
 
 
一度、setteiを実行後、各ボタンをクリックして見てください。 
 
とすれば可能ですが、 
何かの拍子にcls_btn()が初期化されてしまうと 
イベントが発生しなくなってしまいます。 
これがちょっと心配の種・・・。 
 
 
これをフォーム」のボタンを使うと 
 
 
標準モジュールに 
 
'======================================================= 
Sub btn_push() 
  Dim shpnm As String 
  shpnm = Application.Caller 
  MsgBox shpnm & "が押された" 
' shpnmによって処理を分岐できる  
End Sub 
 
 
として、作成した「フォーム」のボタンに上記のマクロを登録して試してください 
 
 
私も本来は新しい概念が好きなのですが、 
「フォーム」のボタンのほうが安全性は高そうですよ!! 
 | 
     
    
   |