Новости:

Из правил форума: Тема должна отражать суть вопроса, топики типа "help please" будут удаляться!

Главное меню

Защита листа и книги Excel

Автор Allaire, 14.05.2012, 12:47

« назад - далее »

Allaire

Добрый день коллеги. У меня есть несколько вопросов, ксательно защиты готовой печатной формы формы и исользуемых формул на листе "от дурака". Для начала я хотел спросить, как защитить формулу в ячейке (как ее скрыть я знаю, вопрос созрел потому, что сокрытие формулы не спасает от ее удаления, при вводе информации в ту-же ячейку), реально ли и оставить формулу в ячейке невридимой и сделать ее доступной для ввода? Второй вопрос менее примитивный, т.к. в целях все той-же защиты от непреднамеренной порчи формы или таблицы или листа в целом я хотел реализовать переход по полям(ячейкам) для ввода информации по нажатию на Tab. Вроде как все получилось, но у  этого VBA кода (см. ниже) есть один жуткий недостаток, он зачем-то выделяет все ячейки, доступные для ввода... работает он не плохо, но стоит случайно (или умышленно) нажать Del к примеру для очистки какой-либо ячейки, как тут-же удалится вся инфа во всех выделенных ячейках, без возможность сделать возврат (Undo). Подскажите как можно улулчшить этот код, чтоб он подсвечивал ячейки для ввода, а не выделял (может у кого есть похожее решение для переходя по ячейкам ввода по Таб-у):

'This sub goes in the code pane for the data entry worksheet
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Establishes tab order for data entry. Hit Enter or Tab keys to jump to the next cell.
Dim TabOrder As Variant, x As Variant
Dim addr As String
Dim rg As Range, targ As Range
If TabOrderFlag = True Then Exit Sub

TabOrder = Array("Q8", "Q9", "Q10", "Q11", "T14", "AJ14", "AP14", "C19", "K19", "W19", "AH19", "AO19", "AK23", "AC26", "AL30", "AL34", "AL36", "AK42", "AU42", "J44", "BC51", "B59:AW78", "V85", "AG85", "K88", "Q88", "AF88", "AL88", "AC91", "C5", "J5")  'List your cell addresses in desired tab order here
For Each x In TabOrder
    If rg Is Nothing Then
        Set rg = Range(x)
    Else
        Set rg = Union(rg, Range(x))
    End If
Next

Set targ = Intersect(rg, Target)
rg.Select
If targ Is Nothing Then
    addr = Target.Cells(1, 1).Address(ColumnAbsolute:=False, RowAbsolute:=False)
    x = Application.Match(addr, TabOrder, 0)
    If IsError(x) Then Range(TabOrder(LBound(TabOrder))).Activate
Else
    targ.Activate
End If
End Sub

Для модуля:


Sub TabOrderMode()
    TabOrderFlag = Not TabOrderFlag
End Sub

Poltava

Неплохо бы было увидеть пример файла :)
Ну а пока
Цитироватьреально ли и оставить формулу в ячейке невридимой и сделать ее доступной для ввода
Что и куда вы хотите ввести ??? Если я вас правильно понял то у вас на форме есть формула которая вбивает в ячейку какое то дефолтное значение а пользователь потом может его поменять если оно его не устроило. Если так то НИКАК. Тут можно пойти двумя путями либо вбивать данные в другую ячейку а затем проверять если она пуста то дефолт если нет то значение из той ячейки. Ну либо если уж все равно есть макросы то сделать чтоб допустим при инициализации листа с формулой либо еще по какому то событию данные в ячейке затирались и на их место записывалась ваша формула. Кстати если идти через макрос то можно значение допустим вводить в примечаниях чтоб доп ячейки не использовать.
Цитироватьон зачем-то выделяет все ячейки
Честно говоря пока тоже не знаю. Но судя по вопросу Код не вы писали а тупо его где то с форума слямзили. Может там стояла такая задача! Ну а пока попробуйте закомментировать вот эту строчку rg.Select Именно она выделяет. Но это на первый взгляд. Разбираться детальней без файла примера просто лень.
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Allaire

Не совсем так... я наверное неправильно выразился. Фишка вот в чем - реально ли, чтобы ячейка содержала формулу и в нее так-же можно было вводить информацию (не убив при этом формулу), или ячейки для ввода отдельно, а ячейки с формулами отдельно?
Сорри за файл с примером, все время забываю прикрепить его (см. вложение).
Цитата: PoltavaНо судя по вопросу Код не вы писали а тупо его где то с форума слямзили
на vba я не пишу, код "одожил" у наших европейских коллег  :)


Serge 007

Цитата: Allaire от 14.05.2012, 13:45
...реально ли, чтобы ячейка содержала формулу и в нее так-же можно было вводить информацию (не убив при этом формулу)...
Как по вашему, реально ли, что бы одним автомобилем одновременно управляли два водителя?
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

Allaire

Цитата: Serge 007 от 14.05.2012, 14:17
Как по вашему, реально ли, что бы одним автомобилем одновременно управляли два водителя?
Вопрос философский, в голову приходит только вариант с учебным авто ))) А если шутки в сторону, то я думал, что формулы в екселе работают несколько иначе, т.е. формула эта некая функция, висящая в бэкграунде, ее можно скрыть, чтоб не повредить и туда-же можно вводить данные (как оказалось полная чепуха ибо скрытая формула тоже дамажится). Значит - мухи отдельно, котлеты отдельно, т.е. ячейки с формулами отдельно, для ввода данных отдельно. Спасибо за разъяснения.  :)

Allaire

Нашел вот неплохой скрипт, где переход пр ТАБу осуществляется по незащищенным ячейкам, начиная с первой:
http://en.allexperts.com/q/Excel-1059/2008/8/TAB-Order-similar.htmм

IKor

Цитата: Allaire от 14.05.2012, 13:45
реально ли, чтобы ячейка содержала формулу и в нее так-же можно было вводить информацию (не убив при этом формулу), или ячейки для ввода отдельно, а ячейки с формулами отдельно?
Чисто теоретически аргументами функции могут быть константы, вводимые непосредственно в саму функцию, например:
=2+2
Здесь ничто не может помешать пользователю заменить значение одной из констант (вводить данные непосредственно в тело функции), при этом сама функция останется неизменной...

С практической стороны это, мягко говоря, неудобно. Поэтому кажется предпочтительным вариант, описанный Poltava:
данные вводить в ячейку_для_ввода,
а в дальнейшем в формулах использовать конструкцию ЕСЛИ(ЕПУСТО(ячейка_для_ввода);значение_по_умолчанию;ячейка_для_ввода) или для некоторых случаев бывает удобнее ЕСЛИОШИБКА(МОЯФУНКЦИЯ(ячейка_для_ввода);МОЯФУНКЦИЯ(значение_по_умолчанию))

Allaire

Цитата: IKor от 16.05.2012, 15:58
Цитата: Allaire от 14.05.2012, 13:45
реально ли, чтобы ячейка содержала формулу и в нее так-же можно было вводить информацию (не убив при этом формулу), или ячейки для ввода отдельно, а ячейки с формулами отдельно?
Чисто теоретически аргументами функции могут быть константы, вводимые непосредственно в саму функцию, например:
=2+2
Здесь ничто не может помешать пользователю заменить значение одной из констант (вводить данные непосредственно в тело функции), при этом сама функция останется неизменной...

С практической стороны это, мягко говоря, неудобно. Поэтому кажется предпочтительным вариант, описанный Poltava:
данные вводить в ячейку_для_ввода,
а в дальнейшем в формулах использовать конструкцию ЕСЛИ(ЕПУСТО(ячейка_для_ввода);значение_по_умолчанию;ячейка_для_ввода) или для некоторых случаев бывает удобнее ЕСЛИОШИБКА(МОЯФУНКЦИЯ(ячейка_для_ввода);МОЯФУНКЦИЯ(значение_по_умолчанию))
Спасибо!