Нельзя установить свойство locked класса range 1с
Я получаю всеобъемлющую ошибку выполнения 1004, «невозможно установить свойство Locked класса Range», когда, ну, пытаюсь установить Locked объекта Range. Код выглядит следующим образом:
Когда я устанавливаю точку останова в строке и пытаюсь запросить значение that_goddamn_range.Locked из окна Immediate, это работает без проблем, но установить его не удается.
Однако, если я запускаю that_goddamn_range.Select , ломаю макрос, снимаю защиту с листа (он автоматически повторно защищается при изменении выбора), затем щелкните правой кнопкой мыши, выберите «Свойства», переключитесь на вкладку «Защита» и отметьте «Заблокировано», затем подтвердите, все работает нормально, однако .
Что могло пойти не так?
Вот полное объяснение:
Обычно эта ошибка возникает по двум причинам: попытка изменить свойство Заблокировано ячейки на защищенном листе и/или попытка изменить свойство Заблокировано отдельной ячейки в листе. объединенный диапазон.
В первом случае вы можете либо разблокировать лист, либо установить для него защиту UserInterfaceOnly, что настоятельно рекомендуется, поскольку тогда вам не придется возиться с его повторной разблокировкой/блокировкой.
Что касается объединенных ячеек, вы не можете заблокировать одну ячейку, которая является частью объединенного диапазона, но есть разумные варианты:
Если вы используете нотацию адреса ячейки для ссылки на ячейку/диапазон,
затем вместо этого ссылайтесь на весь объединенный диапазон:
Range("A1:A3").Locked = True 'where "A1:A3" is the entire merged range
Если вы используете именованный диапазон для набора объединенных ячеек, по умолчанию он будет определен как ссылка только на первую из объединенных ячеек. Вы можете либо отредактировать его определение, включив в него весь объединенный диапазон, либо использовать его свойство MergeArea, чтобы сослаться на связанный с ним объединенный диапазон:
Но обратите внимание, что вы не можете сделать и то, и другое, так как свойство MergeArea, по-видимому, не определено для диапазона, который не является строгим подмножеством более крупной объединенной области!
Конечно, вы всегда можете разъединить объединенный диапазон перед установкой свойства Locked включенной ячейки, а затем снова объединить его после этого, но я никогда не видел ситуации, в которой одного из двух приведенных выше решений было бы недостаточно (и намного чище). ).
Примечание, которое следует добавить к этому исчерпывающему ответу, заключается в том, что для заданного диапазона или именованного диапазона, содержащего набор адресов, вам нужно будет пройтись по ячейкам и перестроить этот заданный диапазон, чтобы он содержал все объединенные области всех этих ячеек, а затем вы можете установить заблокированное свойство за один раз, используя NewlyBuiltRange.Locked = True
Вы не можете заблокировать ячейку, которая является частью диапазона объединенных ячеек, если это не ячейка в верхнем левом углу. Следующее работает для любой ячейки или объединенной области ячеек.
[лист] автоматически повторно защищается при изменении выбора
Лист по какой-то причине повторно защитил себя в середине метода. Снятие защиты непосредственно перед настройкой свойства Locked устранило мою проблему.
На самом деле у меня было несколько диапазонов, которые мне нужно было заблокировать в строке, и мне приходилось снимать защиту листа перед каждым изменением свойства.
Столкнулся с похожей проблемой. Оказалось, что пользователь отфильтровал данные, а затем сохранил их, и защиту нельзя изменить в отфильтрованном наборе данных, не отключив фильтры.
У меня была такая же проблема, и я попытался вручную скрыть ячейки и получил следующее предупреждение: Cannot shift objects off sheet.
Моя проблема заключалась в некоторых комментариях в ячейках одного листа. После удаления всех комментариев листа код запускается.
Мой код находит строку, используя регистр соответствия в столбце, используемом только для этого (потому что мне нужно вставить несколько строк, а столбец «B» является моей ссылкой для идентификации строки).
При попытке защиты ячейки выскакивает ошибка Error 1004 Нельзя установить свойство Locked класса Range. Перепроверила уже все и вся, никак не могу понять причину. Помогите!
Ошибка 1004 при печати
Почему то не печатает выделенную область Sheets("Заказы с истекшим сроком").Activate .
Ошибка 1004 записи формулы при изменении типа переменной
Dim sb As Currency ' НАКОПЛЕННАЯ СУММА БЕЛКОВ одного приема В ГРАММАХ sb = 6.9 .
Ошибка Run-time error '1004' при записи массива на лист
Добрый день Подскажите почему вылетает такая ошибка Run-time error '1004' Application-defined or.
При копировании данных с одной книги в другую возникает ошибка 1004
Здравствуйте! Подскажите пожалуйста, где я сделала ошибку? Private Sub CommandButton1_Click() Dim.
Изначально все ячейки защищены, но без защиты листа можно вносить изменения в ячейки до установки пароля (может быть и пустой пароль) на лист. Поэтому снятие защиты с листа позволяет изменять ячейки любым образом. Есть ли смысл экспериментировать со свойством Locked.
Изначально все ячейки защищены, но без защиты листа можно вносить изменения в ячейки до установки пароля (может быть и пустой пароль) на лист. Поэтому снятие защиты с листа позволяет изменять ячейки любым образом. Есть ли смысл экспериментировать со свойством Locked.
Мне нужно, чтобы сначала (при первом цикле) определенная ячейка защищалась(т.е. ее нельзя было изменить), а при втором цикле защищался весь лист. Если подскажете, как это сделать, буду безмерно благодарна.
Мне не нужна защита всего листа, мне нужна защита одной ячейки а уже потом листа. То есть это должны быть разные процедуры.
Так покажите нам, как защитить ячейку не защищая лист именно инструментом "Защита". Можно без макросов, руками. Так, чтоб ее нельзя было редактировать на незащищенном листе. Думаю, для всех это будет очень познавательно.
Если установить на файл флажок " Пометить как окончательный" тогда невозможно редактировать файл и в т.ч. и лист до снятия этого флажка.
В Вашем случае 1004 - это попытка изменения атрибута защиты ячейки или области при неснятой защите листа. Почему? Так, как у Вас в алгоритме неверно проставлены окончания циклов Next. Кроме того, под Next у Вас попадают и некоторые Dimensions.
toiai, прав. Но можно действительно сделать разные процедуры. Защита листа предусматривает опции исключений. Таким образом она будет влиять только на одну защищаемую ячейку.
Какого рода защиту Вы хотите поставить? Если только от изменеия данных (не форматирования), можно так:
Процедура 1. Защита ячейки [A1]
0) Если лист защищен - снимаем защиту.
1) Снятие защиты со всех ячеек.
2) Установка защиты на ячейку А1
3) Защита листа с опциями исключения всех видов защит, кроме изменения данных.
Также не рекомендую Вам использовать метод Activate (который у Вас тоже попал под цикл), а по возможности и метод Select тоже. Это вызовет мельтешение и замедление работы. Можно обращаться к ячейкам напрямую.
Добрый день,
Искала на просторах интернета решения по данному вопросу, но к сожалению конкретного работающего решения найти не смогла.
У меня в документе excel несколько страниц - каждая страница это отчёт за один календарный день (к примеру, в ячейке F1 каждой страницы я записываю дату, за которую формируется отчёт). Соответственно, в документе Excel у меня примерно 30 листов.
Нужно, чтобы excel блокировал листы для редактирования, дата которых больше одного дня текущего дня. (то есть вчерашний отчёт доступен для редактирования, а позавчерашний - нет).
1. Вариант, который проверяет все листы в книге, но он некорректный на мой взгляд.
Sub Auto_Open()
Dim y As Worksheet
For Each y In ThisWorkbook.Worksheets
y.EnableOutlining = True
If DateSerial(Year(Date), Month(Date), 1) >= DateSerial(Year(wsSh.[F1]), Month(y.[F1]) + 1, 1) Then
If Day(Now()) > 5 Then
y.Protect Password:="8D5r2B1n2", UserInterfaceOnly:=True
End If
End If
Next y
2. Вот более простой вариант на мой взгляд
Private Sub Protect
Dim n as Date, x as Object
n=Range("F1")
If Date()-n>1 then
for each x in Sheets
x.Cells. Locked=True
x.ProtectPassword:="1234"
end if
end sub
Но как в целом, оформить это, запуталась. Подскажите, пожалуйста, где ошибки и как лучше поступить в данной ситуации?
Ограничение фунционала базы после определенной даты
Доброго времени суток! Вопрос в следующем: Есть база данных с формами на локальных компах и.
Запретить открытие документа после определенной даты
Можно ли запретить открытие документа после определенной даты? Можно написать макрос, но макросы.
А если у меня на листах имеются уже заблокированные ячейки с формулами, то не наступит конфликта?
И эта программа будет правильно блокировать листы при открытии файла? Например, если человек работает с документом на протяжении двух дней. ему нужно будет после 00 часов 00 минут сохранять и закрывать отчёт, и затем снова открывать?
Я скопировала, но странно: Excel позволяет редактировать старый отчёт, но блокирует отчёты за те дни, которые ещё не наступили.
Что я неверно сделала?
Решение
1. Данная процедура д.б. в одном из модулей группы Modules, а не в модуле ЭтаКнига
2. Добавим проверку, что в F1 находится дата
3. Уберем Private на всякий случай
У меня на листе есть заблокированные ячейки с формулами.
То есть я сначала отформатировала ячейки на листе как "незащищаемые", а потом ячейки с формулами сделала защищаемыми и заблокировала.
Поэтому при запуске файла выходит ошибка.
Как сделать так, чтобы он перед блокировкой листа разблокировал эти ячейки, а потом блокировал. Какую команду нужно использовать для этой проверки и разблокировки?
Добавлено через 7 минут
Ошибка: "Нельзя установить свойство Locked класса Range"
Помогите пожалуйста!
Есть код макроса, который находится на листе, а не в модуле.
Требуется определенные ячейки защитить от редактирования.
[vba]
ActiveWorkbook.Activate
Sheets("Entrance").Activate
Columns("A:L").Select
Selection.Locked = True
Sheets("Entrance").Activate
Получаю ошибку "Run-time error '1004' Метод Select из класса Range завершен неверно" и выделяется строка:
[vba]
Помогите пожалуйста!
Есть код макроса, который находится на листе, а не в модуле.
Требуется определенные ячейки защитить от редактирования.
[vba]
ActiveWorkbook.Activate
Sheets("Entrance").Activate
Columns("A:L").Select
Selection.Locked = True
Sheets("Entrance").Activate
Получаю ошибку "Run-time error '1004' Метод Select из класса Range завершен неверно" и выделяется строка:
[vba]
Помогите пожалуйста!
Есть код макроса, который находится на листе, а не в модуле.
Требуется определенные ячейки защитить от редактирования.
[vba]
ActiveWorkbook.Activate
Sheets("Entrance").Activate
Columns("A:L").Select
Selection.Locked = True
Sheets("Entrance").Activate
Получаю ошибку "Run-time error '1004' Метод Select из класса Range завершен неверно" и выделяется строка:
[vba]
KuklP,
Все равно не работает.
"Run-time error '1004' Нельзя установить свойство Locked класса Range" Red_Sloth
У меня работает. Может для начала снять защиту листа, заблокировать ячейки, а потом уж защищать лист? Так обычно принято Попробуйте:
[vba]
Public Sub www()
With Sheets("Entrance")
.Unprotect
.Range("A:L").Locked = True
.Protect UserInterfaceOnly:=True
End With
End Sub
У меня работает. Может для начала снять защиту листа, заблокировать ячейки, а потом уж защищать лист? Так обычно принято Попробуйте:
[vba]
Public Sub www()
With Sheets("Entrance")
.Unprotect
.Range("A:L").Locked = True
.Protect UserInterfaceOnly:=True
End With
End Sub
Public Sub www()
With Sheets("Entrance")
.Unprotect
.Range("A:L").Locked = True
.Protect UserInterfaceOnly:=True
End With
End Sub
KuklP,
О, так заработало, спасибо большое!
А если мне при этом надо еще и первые четыре строки защитить?
Как будет корректнее написать Range?
KuklP,
О, так заработало, спасибо большое!
А если мне при этом надо еще и первые четыре строки защитить?
Как будет корректнее написать Range? Red_Sloth
А как можно сделать так, чтобы при выгрузке из 1С 8 методом "сохранить как. " в екселе сразу устанавливался формат "по ширине страницы"?
Возможно в екселе 2007 есть галочка, где поставить можно, но что то не могу найти.
(1) Пользуясь тем же методом что и автор, можно много чего раскопать =).
В екселе есть несколько отличный от 1с способ установки масштаба: количество страниц в ширину и в высоту. Чтоб добиться нужного результата (установки печати по ширине страницы) можно задать одну страницу в ширину и заведомо большое значение в высоту. Например так:
Ехсел=СоздатьОбъект("Excel.Application");
.
.
Ехсел.ActiveSheet.PageSetup.Orientation = 1; //ориентация
Ехсел.ActiveSheet.PageSetup.PaperSize = 9; //размер бумаги
Ехсел.ActiveSheet.PageSetup.Zoom = False;
Ехсел.ActiveSheet.PageSetup.FitToPagesWide = 1;//страниц в ширину
Ехсел.ActiveSheet.PageSetup.FitToPagesTall = 100;//страниц в высоту
(3) Alltruist, спасибо, конечно, пригодится. Но проблему мою это не решит. Тут не лезу в код, использую встроенную в 1с возможность выгрузки, и в момент открытия в екселе, надо найти где это сделать. В разметке страницы есть опция, но она уже на сформированном листе действует, а мне хотелось до того как. Ну если нельзя, то придется написать выгрузку, и буду очень благодарна автору топика за мастер-класс. Жду развития и продолжения.
Полезная статья. Добавлю еще пример программного создания макроса в Excel из 1С
xl=CreateObject("Excel.Application");
wb=xl.Workbooks.Add();
xl.VBE.ActiveVBProject.VBComponents(1).CodeModule.AddFromString("public sub Hello" +
РазделительСтрок+ "MsgBox(""Hello World!"")" + РазделительСтрок + "end sub");
wb.SaveAs("Test.xls");
xl.run("ЭтаКнига.Hello");
wb.Close();
xl.quit();
вообще, если читать документацию внимательно, можно без зазрения совести писать:
Ехсел.Cells(1, 3).LocalFormula = "=СЦЕПИТЬ(E1;C7)";
Спасибо за комментарии и отзывы - очень приятно. И правильно Вы заметили - цель этой статьи, не "тупо" дать алгоритм на копипаст
а рассказать , как несложными действиями самому научится находить ответ на нужный вопрос.
Отдельное спасибо (4) MoneG2 , как он правильно указал есть еще одно решение данного вопроса и это показывает и еще раз доказывает , что в программировании - любую задачу, можно решить РАЗНЫМИ способами.
Спасибо (3) Alltruist - за добавление к статье, очень хороший пример.
(6) larisab , как то решал твою "проблему" следующим способом
ручками написать макрос и его в автозагрузку (личную книгу макросов)
он смотрит при открытии файла , если есть определенная метка
например в ячейке "AW" = 1
значит такой формат листа
если 2 то другой
и так до бесконечности.
а при написании кода в 1С , ты помнишь и формируешь таблицу
согласно правилам данного макроса.
и вот теперь . только пользуясь стандарным методом "Сохранить как. "
в Еxcel у тебе будет все в шоколаде )))
это не панацея это только пример.
(кстати у меня в публикация есть пример создания макроса из 1С)
(4) и (7) заодно: Не корысти ради, а токмо волею пославшей.
- не LocalFormula, а FormulaLocal;
- если нет планов по распространению за границы, то (лучше?) быстрее писать в родной локали, ибо не придется так нудно выяснять, что СЦЕПИТЬ шифруется как CONCATENATE;
- и если кому-то вдруг да придется разбираться со множеством формул, так для перевода локализованных названий функций в оригинальные существует прямо от авторов Екселя секретная книга FUNCS.XLS, спрятанная где-то в недрах типа "X:\Program Files\Microsoft Office\Office12\1049\FUNCS.XLS", и там все-все имена расписаны: откроешь её, и сразу можно узнать, что ОКРУГЛТ - это MROUND и тому подобное
nekit_rdx; Slypower; bow; freeek; Dolly_EV; lushka; fisherboy; hotey; larisab; Alltruist; JohnyDeath; Tatitutu; + 12 – Ответить
+(44) Program Files\Microsoft Office\OFFICE1 1 \1049 - для 2003 Офиса
а еще красота в том, что можно самому из 1С написать функцию и уже в ячейках ссылаться на нее. и она будет доступна в меню -вставка -функция- пользовательские
для этого совсем необязательно куда-либо за рубеж выезжать.
достаточно чтобы сервер стоял не русский, а ваш код выполнился на сервере. или офис был не русский. частая ситуация.
а ещё проблемы с переносом кода в оупен-офис.
(46) "достаточно чтобы сервер стоял не русский, а ваш код выполнился на сервере. или офис был не русский. частая ситуация" - Ох! Сочувствую, если для вас это частая ситуация. Но - по-моему - это лишь когда админ ненавидит локализованные версии чего бы то ни было, и ставит всё везде аглицкое. (Я о таких админах только слыхал. )
Вот ОпенОффис - это да, этот, видимо, может понимать или не понимать разные функции саавсем по-разному; но с ним не пришлось мне работать.
(45) Буквоедство я тоже люблю. Ну так сложилось, у меня лично есть и OFFICE11, и OFFICE12, и там и там есть FUNCS.XLS, и вообще он был в соответствующей папке со времен Офиса 97.
(47) и (49) - константы быстрее всего смотреть из редактора VBA, но без всякого F2 и поиска, а правой кнопкой по имени константы и выбрать Quick Info.
А БОЛЬШОЙ список внутренних констант находится в справке Excel: для Офиса 2003: F1 - Оглавление - Microsoft Excell Visual Basic Reference - Enumerations - Microsoft Excell Constants, вверху справа жмакнуть "Показать все" и смотреть все, смотреть, смотреть. Вот, правда, пояснений там нет. Да! И еще надо, чтоб при установке Офиса справку по VBA тоже установили.
при работе из 1с с ОО итак есть проблемы (одинэсный код для Екселя и ОО несколько отличается!) Поэтому, например, когда я писал обработку, которая должна была работать и там и сям, приходилось проверять на установленность екселя на компе.
Лично мне понравилось скрещивать 1с с другими системами, всвязи с этим пригодилась книга А.Михайлова "1С предприятие системное программирование".
работать это будет только с русской локалью.
А у меня другой вопрос. Чем отличаются свойства "FormulaR1C1", "Formula"? (по-моему еще какие-то "Формулы" были)
(9) "FormulaR1C1" - предопределяет использование ссылок типа "R1C1". Т.е. в не зависимости от того как у тебя в настройках стоит обозначение ссылок (буквы или цифры). Лучше использовать, так как неоднократно сталкивался с тем, что обработка создающая Экселевский файл прекрасно создавала на одном компе и "спотыкалась" на другом. А вся проблема была только в "цифро-буквенном" обозначении.
В дополнение к (12):
Для уже ранее созданного файла не имеет значение, какая формула стоит. Но вот при создании из 1С файла Эксель локальные настройки бывают критичны.
А у меня другой вопрос. Чем отличаются свойства "FormulaR1C1", "Formula"? (по-моему еще какие-то "Формулы" были)
Лично я редко использую Ексель, еще реже Ексель+1С. Но, Ексель - поистине мат. комбайн :D Например, можно встроенными функциями решать задачи оптимизации (без долгого и трудного написания кода на 1с), в Екселе есть прекрасный поиск решения! - Для решения оптимизационных задач, задач рассчета з/п - сам лично его применял.
кому будет интересно по работе с VBA MS EXCEL
посмотрите вложенный файл
называется "Справка-расчет денежной компенсации за вещевое имущество"
этот программа на макросах была написана " в окопе, на сапоге убитого командира.." во время бурной молодости и славной службы в ВС РФ.
и не поверите заняла почетное 3-е место в конкурсе Microsoft Office Extensions в 2003 г. (подарили полный набор офиса 2003 на 18 компакт дисках, сертифакт, пресса. вообщем приятно было)
Выбор пал (а это был 2001 год на EXCEL, только из-за доступности для военнослужащих т.к. про 1С . ну вообщем вы поняли)
На сладкое.
К последней фразе поста автора. И к наступающему. :D
Если 1С считать (а оно так и есть по сути) надстройкой на экселем,
то мы имеем воплощенную мечту идиота, которая выражается тостом:
"За то чтобы ваши желания охренели бы перед вашими возможностями!"
Заметка полезная, но количество плюсов говорит только о том, что подавляющее большинство программистов ленится просто погуглить (я уж молчу про чтение мануалов или спецлитературы).
(22) по оценке самих специалистов MS Oficce
среднестатический пользователь EXCEl использует его возможности только на 5-7% . А возможности его безграничны.
ситуация , когда начинайщий программист (да и не только ) тупо скопипастил какую либу функцию или процедуру и даже не разобрался что она делает и КАК ОНА это делает (работает и работает)- думаю в пример приводить не стоит.
А вот когда человек сам доходит до этого, сам нашел и разобрался, как найти , как научится - это намного ДОРОЖЕ любого ПЛЮСА, это плюс в ЕГО копилку знания и опыта. Вот цель этой статьи.
(22) Ты меня не так понял - никаких претензий к твоей заметке я не имею, и уж тем более плюсам не завидую.
Я просто отметил весьма быстрый прирост плюсов и сделал вывод, которым и поделился.
(22) Однако если плюсАми меряться , то Noy круче чем Tatitutu. :-)
А заметка действительно, сомнительная. С тем же успехом можно и другие, не менее очевидные вещи публиковать.
(25) К чему ты это написал ? кто такой Noy и его работы - я прекрасно знаю - и уважаю его и его мнение , как и каждого участника нашего сообщества.
хотелось сказать, но думаю , не достаточно правильно смогу сформулировать свою мысль .
- самый ДОРОГОЙ это первый ПЛЮС и самый горький это первый МИНУС
(но полюбому это ОПЫТ набранный тобой, ты учишся, ты начинаешь понимать, вникать, перенимать азы общения )
знаешь анекдот:
Вовочка папе:
- пап, мы сегодня кружочки в классе рисовали, и у меня
лучше всех получился. Это потому, что я сын нового русского ?
- да, сынок !
- пап, а на переменке с мальчишками в туалете . письками мерялись, это потому что я сын нового русского ?
- да, сынок и не только, ведь тебе уже 22 годика.
А мерять плюсами людей - это в корне НЕПРАВИЛЬНО , а тебе по твоей же ОЦЕНКЕ - нарушаешь суббординацию. Было бы у тебя плюсов больше, чем у Noy вот тогда бы и сравнивал. Надеюсь ты меня услышал.
я добавил к статье пример задачи (ЗАДАЧА №1 и ответ к ней, но он под паролем ) специально для поста (25)
(32) Ты же сам плюсанул пост (26), а теперь начинаешь мерятся?
Прям как дети малые.
(33) :o нет я не мерится собрался, вернее даже и не собирался. А как порядочный преподователь к статье - выложил "домашнее" задание.
(32) Задача мне неинтересна. Как и процесс мерянья плюсами. А вот люди, меряющиеся интересны :-)
Пошёл за кукурузой.
этот программа на макросах была написана " в окопе, на сапоге убитого командира.." во время бурной молодости и славной службы в ВС РФ.
Вопрос похожий но не совсем Можеть кто поможет:
нужно также Из 1С записать состояние группы: "Разгруппировать"
VBA выглядеть так :
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
(29) не вопрос. Подожди минут 20 напишу прямо здесь . Обед сейчас (война - войной, а обед по распорядку (с))
продолжение [29]
ф=Ексель.Range(Область).Select;
ф=Ексель.Selection.Columns.Group;
а В Ексель итак-то оказывается группа откроется раскрытым, мне наоборот надо закрыть группу при открытии
Читайте также: