25.07.2005, 09:36 | #21 |
Участник
|
Цитата:
Если в появившемся документе скопировать группу ячеек, затем открыть новый документ, то информация вставится успешно, это два.
PHP код:
|
|
26.07.2005, 10:18 | #22 |
Участник
|
нет не забыл... но в любом случае спасибо Вам огромное!
|
|
26.07.2005, 11:25 | #23 |
Участник
|
2Ak!ro
В скрипте есть маленькая неточность - sheet надо выбирать через workbook. Так работает.
com app,workbook, activeSheet, activeWindow, sheets; ... ; app = this.getApplication(); workbook = app.workbooks.item(1); sheets = workbook.sheets(); ... activeSheet.enableSelection(-4142); PS Хотя, нет, первый вариант тоже работает. Попробуйте в Екселе поставить защиту листа вручную, создать пустой макрос, вставить туда Sheets.Item(1).EnableSelection = xlNoSelection и исполнить его. Работает. |
|
26.07.2005, 14:29 | #24 |
Участник
|
Получается, версия Excel имеет большое значение.
Тот скрипт, что я привел, работает для Excel 2002. Для других версий нужно записывать макрос и переносить его в Аксапту. |
|
02.04.2007, 11:02 | #25 |
Участник
|
Цитата:
Сделал protect и enableSelection(xlNoSelection) При visible(true) получаем лист, все ОК. Редактировать, копировать и т.д. нельзя - только распечатать. НО. Сохраняем документ, открываем заново - копировать уже можно. (редактировать так и нельзя) Так вот - это глюк? или так и должно быть? И, в любом случае? Как этого избежать? Возможно запретить сохранение файла? Если это возможно, то может у кого код уже есть? |
|
02.04.2007, 15:41 | #26 |
Участник
|
Для запрета сохранения и распечатки могу предложить такой подход
X++: static void ExcelMacroEvent(Args _args) { ComExcelDocument_Ru excel = new ComExcelDocument_Ru(); COM Doc; COM app; COM Workbook; COM prj; COM comp; COM module; COM code; Com sheet; int Beg; Com VBE; Com Wnd; Com Wnds; int i; ; excel.newFile("", false); doc = excel.getComDocument(); app = doc.Application(); Workbook = app.ActiveWorkbook(); prj = Workbook.VBProject(); VBE = prj.Vbe(); Wnd = Vbe.MainWindow(); Wnd.Visible(false); comp = prj.VBComponents(); module = comp.item(1); module = comp.item(1); code = module.CodeModule(); Beg = code.CreateEventProc(ComVariant::createFromStr("BeforeSave"), ComVariant::createFromStr("Workbook"))+1; Wnd.Visible(false); code.InsertLines(Beg+1, "Cancel = True"); Beg = code.CreateEventProc(ComVariant::createFromStr("BeforePrint"), ComVariant::createFromStr("Workbook"))+1; Wnd.Visible(false); code.InsertLines(Beg+1, "Cancel = True"); sheet = app.ActiveSheet(); sheet.protect(); Wnds = Vbe.Windows(); for (i=1;i<=Wnds.count();i++) { Wnd = wnds.item(i); Wnd.Close(); } app.DisplayAlerts(false); Wnd.Visible(false); Workbook.Activate(); Sheet.enableSelection(-4142); excel.visible(true); /* app.OnKey("%{F11}"); app.SendKeys("%{F11}%TE^{TAB} {TAB}1{TAB}1~"); Wnd.Visible(false); Workbook.Activate(); Workbook.SaveAs("c:\\Книга1.xls");*/ } В закомментареной части - попытка обхода этой возможности (установка пароля на VBA). Но, к сожалению, для того, чтобы это работало надо сохранить и открыть книгу заново (сохранение выключено из кода, да и добивались обратного) Ну и повторюсь: Для того, что бы этот код выполнился, необходимо включить в Excel параметр "Доверять доступ к Visual Basic Project" в форме управления безопасностью макросов (можно поискать на эту тему исследования Gustav)
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
02.04.2007, 15:47 | #27 |
Участник
|
А более "изящного" способа что, нет?
Тогда уж проще для листа при открытии просто каждый раз проставлять X++: activeSheet.enableSelection(-4142); //xlNoSelection Правда изначально хотелось обойтись без макросов. Ладно, спасибо, AndyD, буду что-то пробовать. |
|
25.06.2015, 08:49 | #28 |
Участник
|
У меня сработало в оригинальном варианте. Наверное, зависит от версии офис. У меня Office 365 (Сейчас это 2013)
Мне надо было защищать по листам, переделал: X++: void ProtectWorkSheet(int _worksheetid = 1) { com activeSheet; ; activeSheet = this.getWorkSheet(_workSheetID); activeSheet.protect( "12345", //password true, //DrawingObjects true, //Contents true, //Scenarios true, //UserInterfaceOnly true, //AllowFormattingCells true, //AllowFormattingColumns true, //AllowFormattingRows true, //AllowInsertingColumns true, //AllowInsertingRows true, //AllowInsertingHyperlinks true, //AllowDeletingColumns true, //AllowDeletingRows true, //AllowSorting true, //AllowFiltering true //AllowUsingPivotTables ); activeSheet.enableSelection(-4142); //xlNoSelection } Последний раз редактировалось gefr; 25.06.2015 в 08:52. Причина: уточнение |
|
26.06.2015, 09:31 | #29 |
Участник
|
В итоге обошелся более простым методом, который меня устроил:
1. Уровень защиты не такой жесткий, но достаточный 2. Мне надо было блокировать все, кроме одного столбца (заказ-проформа). В итоге: X++: void ProtectSheet_WO_Range(str _pass, MSOfficeBookMark_RU _bookMark, str _rangename, int _worksheetid = 1) { com range,worksheet, protection, allow; ; worksheet = this.getWorkSheet(_worksheetid); range = worksheet.Range(_bookMark); protection=worksheet.Protection(); allow = Protection.AllowEditRanges(); allow.Add(_rangename,range); worksheet.protect(_pass); } |
|
Теги |
excel |
|
Похожие темы | ||||
Тема | Ответов | |||
фильтр на копировании в буфер обмена | 15 | |||
Блокировка ключа индекса | 4 | |||
Системный буфер обмена | 15 | |||
Буфер обмена | 1 | |||
Вот - про быстр. Ексель, буфер обмена, и т.д. | 22 |
|