別のブックにあるコマンド ボタンを「クリック」するマクロを作成しようとしています。それは可能ですか?その他のワークブック内のコードを変更せずに?
7 に答える
プログラムでボタンをクリックする代わりに、ボタンにリンクされたマクロをコードから直接実行することができます。
まず、ボタンがクリックされたときに実行されるマクロの名前を見つける必要があります。
これを行うには、コマンドボタンが含まれているブックを開きます。
コマンドボタンを右クリックして、[マクロの割り当て]を選択します
「マクロの割り当て」ダイアログが表示されます。
ダイアログの上部にある[マクロ名]ボックスにフルネームをメモします。
[ OK ]ボタンをクリックします。
コードを呼び出す必要があるブック内のコードは、次のようになります。
Sub Run_Macro()
Workbooks.Open Filename:="C:\Book1.xls"
'Open the workbook containing the command button
'Change the path and filename as required
Application.Run "Book1.xls!Macro1"
'Run the macro
'Change the filename and macro name as required
'If the macro is attached to a worksheet rather than a module, the code would be
'Application.Run "Book1.xls!Sheet1.Macro1"
End Sub
そのために使用できますApplication.Run
:
Run "OtherWorkbook.xls!MyOtherMacro"
シートではなくワークブックを意味しますか?とにかく、「フォルダ内のすべてのブックをループして、それぞれに対して操作を実行したい場合」
別のシートにアクセスする場合は、次のようにします。
Worksheets("MySheet").YourMethod()
上記と同様の問題があり、理解するのに時間がかかりましたが、これですべてです。
Sheet1 で、次のボタンを作成しました。
Private Sub cmdRefreshAll_Click()
Dim SheetName As String
SheetName = "Mon"
Worksheets(SheetName).Activate
ActiveSheet.cmdRefresh_Click
SheetName = "Tue"
Worksheets(SheetName).Activate
ActiveSheet.cmdRefresh_Click
' "I repeated the above code to loop through a worksheet for every day of the week"
End Sub
次に、それを機能させるためのインポート ビットを、他のワークシートのコードに移動して、Private から Public に変更する必要があります。
これまでのところ、バグは発生していません。
いいえ:
これは簡単です:
があるワークシート ABC で
Private Sub xyz_Click()
、新しい public サブルーチンを追加します。Public Sub ForceClickOnBouttonXYZ() Call xyz_Click End Sub
他のワークシートまたはモジュールに、次のコードを追加します。
Sheets("ABC").Activate Call Sheets("ABC").ForceClickOnBouttonXYZ
それだ!!!画面がちらついたりアクティビティを表示したりしたくない場合は、ルーチンApplication.ScreenUpdating = False
を呼び出す前に を設定し、その後すぐに設定します。Sheets("ABC").ForceClickOnBouttonXYZ
Application.ScreenUpdating = True
ボタンのクリック イベントは通常、他のワークブックのプライベート メソッドであるため、コードを使用してこれを行う明確な方法はありません。
ただし、ワークブックを開いて必要なコントロールを見つけ、それをアクティブにしてスペース文字を送信する (ボタンを押すのと同じ) ことにより、VBA コードのクリックを自動化できます。
これはほぼ間違いなく恐ろしい考えであり、おそらくあなたとあなたの子孫に不幸以外の何ものももたらさないでしょう. より良い解決策を見つけることをお勧めしますが、当面はこれでうまくいくようです...
Public Sub RunButton(workbookName As String, worksheetName As String, controlName As String)
Dim wkb As Workbook
Dim wks As Worksheet
Set wkb = Workbooks.Open(workbookName)
wkb.Activate
Dim obj As OLEObject
For Each wks In wkb.Worksheets
If wks.Name = worksheetName Then
wks.Activate
For Each obj In wks.OLEObjects
If (obj.Name = controlName) Then
obj.Activate
SendKeys (" ")
End If
Next obj
End If
Next wks
End Sub