powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / защита листа
20 сообщений из 20, страница 1 из 1
защита листа
    #33646221
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуция следующая. Есть лист Excel, его постепенно заполняет человек. Как только он становится уверенным что цифра в ячейке подтверждена и не подлежит изменению, он устанавливает ячейку как защищаемую и защищает лист. Таким образом получаем лист в котором часть ячеек защищена и в них не возможно изменять данные, а часть нет. Причем нет никакой закономерности в расположенни защищаемых и незащихаемых ячеек.
Возникакет проблема при копировании диапазона ячеек из другого листа. Если среди ячеек куда копируется встречаются защищенные, то выдается ошибка Excel и копирование не происходит.

Кто что может сказать по этому поводу???
...
Рейтинг: 0 / 0
защита листа
    #33646253
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Какая версия экселя?
2. Копирование происходит макросом?
...
Рейтинг: 0 / 0
защита листа
    #33646268
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
копируйте частями
...
Рейтинг: 0 / 0
защита листа
    #33646270
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версия 2000 и выше (если это принципиально, то установим какой нужно). ставка производиться через буфер, т.е. человек нажимает кнопочку "КОПИРОВАТЬ", затем выделяет ячейку и нажимает кнопочку "ВСТАВИТЬ". И тут возникает ошибка если в диапазон куда копируют попадают защищенные ячеки
...
Рейтинг: 0 / 0
защита листа
    #33646288
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to vkodor

В том-то и дело, что этого хочеться избежать, поскольку диапазоны в основном строго фиксированы.
...
Рейтинг: 0 / 0
защита листа
    #33646298
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ааааа. Данные копируются не С защищенного листа, а НА защищенный лист.
Тогда, наверное, только снятием защиты листа можно помочь.
...
Рейтинг: 0 / 0
защита листа
    #33646326
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Eremkin Как только он становится уверенным что цифра в ячейке подтверждена и не подлежит изменению, он устанавливает ячейку как защищаемую и защищает лист.
Один защищает, другой пытается изменить, нелогично как-то.

Может защищать ячейку в том месте, от куда копируется инфо?
...
Рейтинг: 0 / 0
защита листа
    #33646453
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно так. Данные копируются на защищенный лист с незащищенного. Но особенность в том, что часть данных в защищенном листе уже утверждена и не подлежит изменению, а остальную часть можно изменять. Ячейки защищаются для того, чтобы случайно не изменить уже утвержденную цифру.

to vkodor

работает один человек. Эта проблемма возникает, т.к. собираются данные из кучи файлов, которые все время изменяются
...
Рейтинг: 0 / 0
защита листа
    #33646621
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тебе без листа "Temp" не обойтись.
пусть копируют в Temp а там сделай кнопку чтобы анализировалась ситуация
типа
Код: plaintext
1.
2.
3.
Dim rng As Range
For Each rng In Worksheets("Лист1").UsedRange
    If rng.Locked = False Then rng = Worksheets("Temp").Range(rng.Address)
Next
...
Рейтинг: 0 / 0
защита листа
    #33646648
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я так и не пойму что требуется?
Нужно чтобы защищенные ячейки тоже обновились (скопировались из другого листа)? Или нужно чтобы диапазон скопировался только в те ячейки, которые не защищены, а защищенные остались без изменений?
...
Рейтинг: 0 / 0
защита листа
    #33647816
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k-nikeА я так и не пойму что требуется?
Нужно чтобы защищенные ячейки тоже обновились (скопировались из другого листа)? Или нужно чтобы диапазон скопировался только в те ячейки, которые не защищены, а защищенные остались без изменений?
Именно так, нужно чтобы диапазон скопировался только в те ячейки, которые не защищены, а защищенные остались без изменений. Вот именно в этой ситуации и возникает ошибка Excel, он просто не копирует вообще ничего
...
Рейтинг: 0 / 0
защита листа
    #33650748
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что же все пропали куда-то
...
Рейтинг: 0 / 0
защита листа
    #33651748
Фотография talgat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное копировать нужно программно по одной ячейке, анализируя кажую на предмет защиты.
Тогда точно будет Вам счастье !
...
Рейтинг: 0 / 0
защита листа
    #33651898
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я понял.... как это сделать?
...
Рейтинг: 0 / 0
защита листа
    #33652331
Фотография talgat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail EremkinЭто я понял.... как это сделать?
1. Определяешь (программно) границы таблицы-приемника.
2. Во вложенном цикле обходишь ВСЕ ячейки таблицы-приемника проверяя свойства ячейки.
2.2 Не защищенная - копируешь ячейку с другого листа.
2.3 Защищена - не копируешь ячейку с другого листа.
...
Рейтинг: 0 / 0
защита листа
    #33652342
Фотография talgat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
talgat Mikhail EremkinЭто я понял.... как это сделать?
1. Определяешь (программно) границы таблицы-приемника.
2. Во вложенном цикле обходишь ВСЕ ячейки таблицы-приемника проверяя свойства ячейки.
2.2 Не защищенная - копируешь ячейку с другого листа.
2.3 Защищена - не копируешь ячейку с другого листа.
Весь код повесь на кнопку. Все равно на коком листе.
...
Рейтинг: 0 / 0
защита листа
    #33653062
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Это положи в модуль под названием "Эта Книга" (ThisWorkbook)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call myAdd
End Sub
Private Sub Workbook_Open()
    Sheets("Лист1").Select
    Call myDel
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "Лист1" Then Call myAdd
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh.Name = "Лист1" Then Call myDel
End Sub
2. Где написано "Лист1" - измени на имя твоего листа в который копируют

3. Это положи в обычный модуль
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
Sub myPaste()
    Dim xlAp As New Excel.Application
    Dim xlWb As New Excel.Workbook
    Dim xlSh As New Excel.Worksheet
    Dim rgn As Range
    Dim NumRow As Currency, r As Currency
    Dim NumCol As Integer, c As Integer
    Dim tmp As Range
    On Error Resume Next
    Set tmp = ActiveCell
    Set xlWb = xlAp.Workbooks.Add
    Set xlSh = xlWb.Sheets( 1 )
    xlSh.Paste
    Set rgn = xlSh.UsedRange
    NumRow = rgn.Rows.Count
    NumCol = rgn.Columns.Count
    For r =  0  To NumRow -  1 
        For c =  0  To NumCol -  1 
            If tmp.Offset(r, c).Locked = False Then
                tmp.Offset(r, c) = rgn.Cells(r +  1 , c +  1 )
            End If
        Next c
    Next r
    Set rgn = Nothing
    Set xlSh = Nothing
    xlWb.Close False
    xlAp.Quit
    
    Set xlWb = Nothing
    Set xlAp = Nothing
    Set tmp = Nothing
    
End Sub
Sub myAdd()
    Dim a As Integer, b As Integer
    Dim c As CommandBarControl
    On Error Resume Next
    ' установка макроса в меню
    a = Application.CommandBars( 1 ).FindControl(ID:= 30003 ).Index
    For Each c In Application.CommandBars( 1 ).Controls(a).Controls
        If c.ID =  22  Then b = c.Index
    Next
    'установка макроса в контекстном меню
    Application.CommandBars( 1 ).Controls(a).Controls(b).OnAction = "myPaste"
    For Each c In Application.CommandBars("cell").Controls
        If c.ID =  22  Then b = c.Index
    Next
    Application.CommandBars("cell").Controls(b).OnAction = "myPaste"
    'присвоение макроса комбинации клавишь
    Application.OnKey "^v", "myPaste"

End Sub

Sub myDel()
    Dim a As Integer, b As Integer
    Dim c As CommandBarControl
    On Error Resume Next
    a = Application.CommandBars( 1 ).FindControl(ID:= 30003 ).Index
    For Each c In Application.CommandBars( 1 ).Controls(a).Controls
        If c.ID =  22  Then b = c.Index
    Next
    Application.CommandBars( 1 ).Controls(a).Controls(b).OnAction = ""
    For Each c In Application.CommandBars("cell").Controls
        If c.ID =  22  Then b = c.Index
    Next
    Application.CommandBars("cell").Controls(b).OnAction = ""
    Application.OnKey "^v", ""
End Sub
ну и естественно макросы не отключать при загрузке файла

Теперь попробую объяснить что это!

Вставка данных производится тремя способами
А. вставка из панели "Файл... Меню... и т. д. "
Б. вставка из контекстного меню (правый клик мыши)
С. вставка комбинацией клавиш "Ctrl+C"

процедура "myAdd" присваивает всем трем позициям макрос "myPaste"
причем события "Workbook_SheetActivate" и Workbook_SheetDeactivate
нужны для того чтобы этот макрос работал только на определённом листе у меня на "Лист1"
процедура "myDel" возвращает всё в исходное положение

теперь "myPaste" копирует всё в скрытый вновь созданный файл и, просматривая нужный диапазон ячеек, в зависимости от условий защиты, вставляет данные правда только значения (форматы не вставляет).

Если кто-нибудь усовершенствует процедуру буду рад, надеюсь незабудете поделиться.

P.S. Блин пол дня убил на это.
...
Рейтинг: 0 / 0
защита листа
    #33653096
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodor[quot vkodor]С. вставка комбинацией клавиш "Ctrl+C"

пардон конечно же "Ctrl+V"
и еще так правильнее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call myDel
End Sub
Private Sub Workbook_Open()
    Sheets("Лист1").Select
    Call myAdd
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "Лист1" Then Call myAdd
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh.Name = "Лист1" Then Call myDel
End Sub
...
Рейтинг: 0 / 0
защита листа
    #33654812
Mikhail Eremkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо vkodor.

Ваше решение очень оригинальное. Я только вынес вставку на отдельную кнопочку и работает на Ура!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
защита листа
    #34970099
UserA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot vkodor ]Application.CommandBars(1).Controls(a).Controls
quot]

а что это за свойство у объекта Control - Controls? ладно - я не нашел, так и Excel не понимает?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / защита листа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]