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

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

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

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

to vkodor

работает один человек. Эта проблемма возникает, т.к. собираются данные из кучи файлов, которые все время изменяются
...
Рейтинг: 0 / 0
05.04.2006, 15:27:24
    #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
05.04.2006, 15:32:51
    #33646648
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
А я так и не пойму что требуется?
Нужно чтобы защищенные ячейки тоже обновились (скопировались из другого листа)? Или нужно чтобы диапазон скопировался только в те ячейки, которые не защищены, а защищенные остались без изменений?
...
Рейтинг: 0 / 0
06.04.2006, 06:12:05
    #33647816
Mikhail Eremkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
k-nikeА я так и не пойму что требуется?
Нужно чтобы защищенные ячейки тоже обновились (скопировались из другого листа)? Или нужно чтобы диапазон скопировался только в те ячейки, которые не защищены, а защищенные остались без изменений?
Именно так, нужно чтобы диапазон скопировался только в те ячейки, которые не защищены, а защищенные остались без изменений. Вот именно в этой ситуации и возникает ошибка Excel, он просто не копирует вообще ничего
...
Рейтинг: 0 / 0
07.04.2006, 07:24:37
    #33650748
Mikhail Eremkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
что же все пропали куда-то
...
Рейтинг: 0 / 0
07.04.2006, 12:38:27
    #33651748
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
Наверное копировать нужно программно по одной ячейке, анализируя кажую на предмет защиты.
Тогда точно будет Вам счастье !
...
Рейтинг: 0 / 0
07.04.2006, 13:07:52
    #33651898
Mikhail Eremkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
Это я понял.... как это сделать?
...
Рейтинг: 0 / 0
07.04.2006, 14:54:16
    #33652331
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
Mikhail EremkinЭто я понял.... как это сделать?
1. Определяешь (программно) границы таблицы-приемника.
2. Во вложенном цикле обходишь ВСЕ ячейки таблицы-приемника проверяя свойства ячейки.
2.2 Не защищенная - копируешь ячейку с другого листа.
2.3 Защищена - не копируешь ячейку с другого листа.
...
Рейтинг: 0 / 0
07.04.2006, 14:55:30
    #33652342
talgat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
talgat Mikhail EremkinЭто я понял.... как это сделать?
1. Определяешь (программно) границы таблицы-приемника.
2. Во вложенном цикле обходишь ВСЕ ячейки таблицы-приемника проверяя свойства ячейки.
2.2 Не защищенная - копируешь ячейку с другого листа.
2.3 Защищена - не копируешь ячейку с другого листа.
Весь код повесь на кнопку. Все равно на коком листе.
...
Рейтинг: 0 / 0
07.04.2006, 17:51:27
    #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
07.04.2006, 18:07:29
    #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
10.04.2006, 07:11:16
    #33654812
Mikhail Eremkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
защита листа
Спасибо vkodor.

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

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


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