2016-04-12 7 views
0

У меня есть лист с Марко (из Excel 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 

Это нормально, но у листа Event нет параметра «Отмена», который нужен моему макросу.

Как скопировать лист с помощью vba?

ответ

0

Очевидно, что события листа не принимают параметры. Я щелкнул правой кнопкой мыши на вкладке «Лист 1», выбрал Sheet Events и назначил Worksheet_BeforeDoubleClick событию Double click. Затем двойным щелчком появилось следующее сообщение об ошибке:

Ошибка при создании сценария при запуске основного скрипта Standard.Module2.Worksheet_BeforeDoubleClick.

Сообщение: неправильное количество параметров!

Если мы вместо того, чтобы назначить его в макрос, который не принимает аргументов:

Sub DoDoubleClick 
    MsgBox "Double clicked" 
End Sub 

Затем двойной щелчок производит желаемого результата. Также ваш CopySheetWithEvents() создаст новый лист и правильно назначит событие новому листу.

Итак, я думаю, вам нужно переписать Worksheet_BeforeDoubleClick так, чтобы он не требовал аргументов. Чтобы получить диапазон, прочтите текущий выбор:

oSelect = ThisComponent.CurrentSelection.getRangeAddress