Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Mac OS X : Excel 2016)
Worksheet_Changeのコードを自動ですべてのシートに作成したい
投稿日時: 21/04/19 11:14:16
投稿者: cafeko

こんにちは。
CSVで毎週提供される大量のサーバとIPアドレスのリストをExcel VBAを使って、グループごとに分け、それぞれ別のシートに振り分けるようにしています。毎週更新をしているので、毎週、複数のシートが作成されています。前週のシートは削除しています。
各シートのIPアドレスのセルをクリックするとiTermというMacのターミナルが起動して、IP Addressにsshログインをする機能をApple Scriptと組み合わせて実装しました。以下がコードです。うまく動作しているのですが、問題は以下のコードを新しく作成したシート毎に登録しないといけないことです。シートは毎週自動で作成できるのですが、以下のコードも自動で作成したシートごとに登録する方法はないでしょうか。
 
'******************************************************
Option Explicit
Private Sub worksheet_SelectionChange(ByVal Target As Range)
'******************************************************
' When IFN IP address Cell is clicked, open iTerm and ssh to the IP address
    Dim IP As String
    Dim xRg As Range
    Dim xRg2 As Range
    Dim Row, Column As Long
    Dim ans As Integer
    Dim OS As String
     
    If Selection.Count = 1 Then
 
        If Not Intersect(Target, Range("O2:O50")) Is Nothing Then
            Row = Target.Row
            Column = Target.Column
            Set xRg = ActiveSheet.Cells(Row, Column)
            Set xRg2 = ActiveSheet.Cells(Row, 2)
             
            IP = xRg.Value
            OS = ActiveSheet.Cells(Row, 5).Value
            If InStr(UCase(OS), "WIN") > 0 Then
                MsgBox "You can't ssh", vbOKOnly, "This VM is Windows"
                Exit Sub
            End If
            If (xRg.Value = "") Then Exit Sub
            ans = MsgBox(xRg2.Value & " : " & IP, vbOKCancel, "proceed?")
            If ans = vbOK Then
                Call RunMacScriptFunc(IP)
            End If
             
        End If
    End If
End Sub

回答
投稿日時: 21/04/19 13:32:15
投稿者: simple

Mac上のExcelは使ったことがありませんので確認はできませんが、
すべてのsheetを対象としたChangeイベントプロシージャがあります。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub
・ThisWorkbookモジュールに書きます。
・自動設定されるShという引数は、当該イベントが起きたSheetです。(Sheetオブジェクト相当)
・TargetはSheetレベルのものと同様です。
これを使ってみてはどうでしょうか。

回答
投稿日時: 21/04/19 13:32:58
投稿者: Suzu

引用:
前週のシートは削除しています。

引用:
問題は以下のコードを新しく作成したシート毎に登録しないといけないことです。シートは毎週自動で作成できるのですが、以下のコードも自動で作成したシートごとに登録する方法はないでしょうか。

 
この「削除」は、シートを削除しているのですよね。
シートを削除ではなく、 Cells の必要範囲に対し、ClearContents を行えば
Sheetのコードは消えませんよね?
 
どうしても シートを削除したいのであれば
コードを設定済みのシートを用意しておいて、そのシートを雛形にシートを追加すれば良いと思いますよ。

回答
投稿日時: 21/04/19 14:44:22
投稿者: sk

cafeko さんの引用:
Worksheet_Changeのコードを自動ですべてのシートに作成したい

cafeko さんの引用:
Private Sub worksheet_SelectionChange(ByVal Target As Range)

Change イベントと SelectionChange イベントは別物。
 
cafeko さんの引用:
各シートのIPアドレスのセルをクリックするとiTermというMacのターミナルが起動して、
IP Addressにsshログインをする機能をApple Scriptと組み合わせて実装しました。

「いずれかのワークシートの選択範囲を変更した時」に発生するのは
選択されたセル範囲を含む Worksheet オブジェクトの SelectionChange イベントと
そのワークシートを含む Workbook オブジェクトの SheetSelectionChange イベントです。
 
simple さんの引用:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

投稿日時: 21/04/19 17:15:31
投稿者: cafeko

simple 様、SUZU様、sk様
早速のアドバイスをありがとうございました。
すべてのworksheetに対応したPrivate Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
を探していました。This Workbookにコードを書くと動きました。
皆様、ありがとうございました。