2016-04-12 19 views
0

を経由してVBAでシートをコピーすることができ、私は(エクセル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 

それはOKですが、シートのイベントは、私のマクロの必要性「キャンセル」パラメータを持っていません。

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

答えて

0

明らかに、シートイベントはパラメータを取らない。私はSheet1タブを右クリックし、Sheet Eventsを選択し、ダブルクリックイベントにWorksheet_BeforeDoubleClickを割り当てました。ダブルクリックすると、次のエラーメッセージが生成されました。

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

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

我々は代わりに、引数を取らないマクロに割り当てた場合:

Sub DoDoubleClick 
    MsgBox "Double clicked" 
End Sub 

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

したがって、引数が必要ないようにWorksheet_BeforeDoubleClickを書き換える必要があると思います。範囲を取得するには、現在の選択肢を読んでください:

oSelect = ThisComponent.CurrentSelection.getRangeAddress