|
20.07.2005, 11:59 | #1 |
Участник
|
Блокировка копирования в буфер
Добрый день!
Вопрос касается всего того, что связано с выгрузкой данных в Excel. Можно ли каким либо образом заблокировать лист (от изменений можно) от копирования данных в буфер и сохранения в файл? Так, что бы можно было только смотреть и печатать. Вообще не понятен смысл защиты Excel документа стандартными средствами. Да, новую информацию добавить нельзя, но всегда можно скопировать в буфер и перенести на новый лист, а там с данными можно делать что угодно. |
|
02.04.2007, 15:41 | #2 |
Участник
|
Для запрета сохранения и распечатки могу предложить такой подход
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 | #3 |
Участник
|
А более "изящного" способа что, нет?
Тогда уж проще для листа при открытии просто каждый раз проставлять X++: activeSheet.enableSelection(-4142); //xlNoSelection Правда изначально хотелось обойтись без макросов. Ладно, спасибо, AndyD, буду что-то пробовать. |
|
25.06.2015, 08:49 | #4 |
Участник
|
У меня сработало в оригинальном варианте. Наверное, зависит от версии офис. У меня 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 | #5 |
Участник
|
В итоге обошелся более простым методом, который меня устроил:
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 |
|