3

アクティブ化されたときにコードを実行する必要があるテンプレートシートがあるファイルがあります。このシートは、このコードを実行する必要のないシートを作成するために複製されています。現在、実行時にワークシートのコードネームをチェックして余分なシートで何も行わないようにするコードがありますが、シートを切り替えると使用が遅くなります。

複製を作成するマクロでVBAコードの内容もクリアする方法はありますか?

(編集)クリアする必要のあるコードがモジュールにないことに注意してください。調査の結果、(にアクセスして)モジュールを削除する方法を見つけたようですが、ワークシートのVBAコードVBProject.VBComponentsにアクセスする方法がわかりません。

4

2 に答える 2

4

すべてのモジュールの完全なコードを削除するには、Sheet次のような方法を試すことができます。

Sub Remove_some_vba_code()

Dim activeIDE As Object 'VBProject
Set activeIDE = ActiveWorkbook.VBProject

Dim Element As VBComponent

Dim LineCount As Integer
For Each Element In activeIDE.VBComponents
    If Left(Element.Name, 5) = "Sheet" Then    'change name if necessary
        LineCount = Element.CodeModule.CountOfLines

        Element.CodeModule.DeleteLines 1, LineCount
    End If
Next

End Sub
于 2013-03-26T06:17:52.510 に答える
2

これに取り組むもう1つの方法は、すべてのコードをワークシートに含めないようにすることです。その後、何も削除する必要はありません。ワークシートのコードモジュールはイベントをコーディングするのに便利な場所ですが、イベントを処理するための独自のクラスモジュールを作成することもできます。これを標準モジュールに入れます。

Public gclsEvent As CEvent

Sub Auto_Open()

    Set gclsEvent = New CEvent
    Set gclsEvent.This = Sheet1

End Sub

これにより、グローバルなCEventのインスタンスが作成されるため、ブックが開いている限りスコープが失われることはありません。コードネームSheet1のワークシートをクラスのThisプロパティに割り当てます。このコードでCEventという名前のクラスモジュールを作成します

Private WithEvents mwsThis As Worksheet

Public Property Set This(ByVal wsThis As Worksheet): Set mwsThis = wsThis: End Property
Public Property Get This() As Worksheet: Set This = mwsThis: End Property

Private Sub mwsThis_Activate()

    Me.This.Copy , Me.This.Parent.Sheets(Me.This.Parent.Sheets.Count)

End Sub

WithEventsキーワードは、そのオブジェクトのイベントを公開します。Sheet1のイベントのみをフックしているため、別のシートをアクティブ化してもコードはトリガーされません。

于 2013-03-26T13:22:22.120 に答える