0

マルコのシートがあります(Excel VBAから):

Rem Attribute VBA_ModuleType=VBADocumentModule
Option VBASupport 1
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
...
End Sub

それは正しく機能します。

しかし、シートを新しいシートにコピーすると、新しいシートはマクロを失います。

そこでダブルクリックのシートイベントを書いてみたり、シートとイベントをコピーするマルコを書いてみたり。

Sub CopySheetWithEvents()
    oSheets = ThisComponent.Sheets
    oSheet = ThisComponent.CurrentController.ActiveSheet
    sName = oSheet.Name
    sNewName = oSheets.Count + 1
    oSheets.CopyByName(sName, sNewName, oSheets.Count + 1)

    oNewSheet = oSheets(oSheets.Count - 1)
    aSheetEvents = oSheet.Events
    sEventNames = aSheetEvents.ElementNames
    aNewSheetEvents = oNewSheet.Events
    For i = 0 To ubound(aSheetEvents.ElementNames)
        aEvent = aSheetEvents.getbyname(sEventNames(i))
        aNewSheetEvents.ReplaceByName(sEventNames(i), aEvent)
    Next i
End Sub

大丈夫ですが、シート イベントには、マクロが必要とする「キャンセル」パラメータがありません。

vbaでシートをコピーするにはどうすればよいですか?

4

1 に答える 1

0

どうやらシートイベントはパラメータを取らないようです。[シート 1] タブを右クリックして を選択し、ダブルクリック イベントにSheet Events割り当てました。Worksheet_BeforeDoubleClick次に、ダブルクリックすると、次のエラー メッセージが表示されます。

Basic スクリプト Standard.Module2.Worksheet_BeforeDoubleClick の実行中にスクリプト フレームワーク エラーが発生しました。

メッセージ: パラメータの数が間違っています!

代わりに、引数を取らないマクロに代入すると:

Sub DoDoubleClick
    MsgBox "Double clicked"
End Sub

次にダブルクリックすると、意図した結果が得られます。またCopySheetWithEvents()、新しいシートを作成し、イベントを新しいシートに正しく割り当てます。

Worksheet_BeforeDoubleClickなので、引数が不要になるように書き直す必要があると思います。範囲を取得するには、現在の選択を読み取ります。

oSelect = ThisComponent.CurrentSelection.getRangeAddress
于 2016-04-12T21:56:01.237 に答える