Есть достаточно большой файл, в котором нужно отмечать данные разным пользователям в зависимости от выполнения работ. Т.е. каждом файле нужно в столбцах с "AX" до "BM", начиная с 10-ой строки вносить данные. Но доступ к редактированию строк в этом диапазоне строк у всех должен быть разный.Столбцы с "A" до "AW" включительно редактировать нельзя, как и шапку таблицы (диапазно "A1:BM9"). Если человек открыл файл и ввел в ячейку BN1 свою фамилию, то он имеет право вносить изменения только в те строки, где в столбце "AW" записана эта фамилия.
Есть достаточно большой файл, в котором нужно отмечать данные разным пользователям в зависимости от выполнения работ. Т.е. каждом файле нужно в столбцах с "AX" до "BM", начиная с 10-ой строки вносить данные. Но доступ к редактированию строк в этом диапазоне строк у всех должен быть разный.Столбцы с "A" до "AW" включительно редактировать нельзя, как и шапку таблицы (диапазно "A1:BM9"). Если человек открыл файл и ввел в ячейку BN1 свою фамилию, то он имеет право вносить изменения только в те строки, где в столбце "AW" записана эта фамилия.ovechkin1973
чисто теоретические размышления по решению задачки:
т.е. если нужно другие данные изменить любой вносит другую фамилию и меняет? если учетные записи пользователя у всех уникальные, может к ним тогда привязываться? или на скрытом листе вести список логин/пароль при изменении в ячейке bn1 запрашивать пароль сверять со списком если верный снимать защиту листа, ячейки совпадающие с Фио устанавливать незащищенные, остальные защищенные и ставить защиту листа...
чисто теоретические размышления по решению задачки:
т.е. если нужно другие данные изменить любой вносит другую фамилию и меняет? если учетные записи пользователя у всех уникальные, может к ним тогда привязываться? или на скрытом листе вести список логин/пароль при изменении в ячейке bn1 запрашивать пароль сверять со списком если верный снимать защиту листа, ячейки совпадающие с Фио устанавливать незащищенные, остальные защищенные и ставить защиту листа...K-SerJC
Private Sub Worksheet_SelectionChange(ByVal Target As Range) u_01 = Target.Row u_02 = Range("aw" & u_01).Value u_03 = Range("bn1").Value u_04 = Cells(Rows.Count, "aw").End(xlUp).Row u_05 = Target.Column u_21 = Application.Match(u_03, Range("aw10:aw" & u_04), 0) u_22 = Application.IsNA(u_21) If u_22 And u_01 > 9 And u_05 > 49 Then Range("bn1").Select Else If u_02 <> u_03 And u_01 > 9 And u_05 > 49 Then u_06 = Application.Match(u_03, Range("aw" & u_01 + 1 & ":aw" & u_04), 0) u_07 = Application.IsNumber(u_06) If u_07 Then Cells(u_01 + u_06, u_05).Select Else u_08 = Application.Match(u_03, Range("aw1:aw" & u_04), 0) Cells(u_08, u_05).Select End If End If End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) u_04 = Cells(Rows.Count, "aw").End(xlUp).Row If Not Intersect(Target, Range("ax10:bm" & u_04)) Is Nothing Then Target.Offset(0, 1).Select End If End Sub
[/vba]для начала ну там, если шо, напильником пройтись
как-то так [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) u_01 = Target.Row u_02 = Range("aw" & u_01).Value u_03 = Range("bn1").Value u_04 = Cells(Rows.Count, "aw").End(xlUp).Row u_05 = Target.Column u_21 = Application.Match(u_03, Range("aw10:aw" & u_04), 0) u_22 = Application.IsNA(u_21) If u_22 And u_01 > 9 And u_05 > 49 Then Range("bn1").Select Else If u_02 <> u_03 And u_01 > 9 And u_05 > 49 Then u_06 = Application.Match(u_03, Range("aw" & u_01 + 1 & ":aw" & u_04), 0) u_07 = Application.IsNumber(u_06) If u_07 Then Cells(u_01 + u_06, u_05).Select Else u_08 = Application.Match(u_03, Range("aw1:aw" & u_04), 0) Cells(u_08, u_05).Select End If End If End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) u_04 = Cells(Rows.Count, "aw").End(xlUp).Row If Not Intersect(Target, Range("ax10:bm" & u_04)) Is Nothing Then Target.Offset(0, 1).Select End If End Sub
[/vba]для начала ну там, если шо, напильником пройтисьNic70y
Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range Set r = Range("A" & Cells(Rows.Count, 49).End(xlUp).Row & ":BM1") If Not Intersect(Target, r) Is Nothing Then If Target.Row < 10 Or Target.Column < 50 Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True Else If Cells(Target.Row, 49) <> Cells(1, 66) Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End If End If End Sub
[/vba]
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range Set r = Range("A" & Cells(Rows.Count, 49).End(xlUp).Row & ":BM1") If Not Intersect(Target, r) Is Nothing Then If Target.Row < 10 Or Target.Column < 50 Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True Else If Cells(Target.Row, 49) <> Cells(1, 66) Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End If End If End Sub
т.е. если нужно другие данные изменить любой вносит другую фамилию и меняет?
Проблема с хотелками по файлу более глобальная и правила форума требуют задавать в одной теме один вопрос. Поэтому про ФИО Админа файла я не задал.. может зря.
если учетные записи пользователя у всех уникальные, может к ним тогда привязываться?
Можно и так. Думал над этим, когда вопрос задавал. На работе у всех учётки свои, но иногда нужно кому то помочь своему товарищу.... Но ваш вопрос меня еще поразмышлять заставил.. Можно и по учеткам сделать привязку, просто если кто то хочет помочь с работой с файлом - пусть под учеткой своего товарища заходит в комп... Короче буду думать.
при изменении в ячейке bn1 запрашивать пароль сверять со списком если верный снимать защиту листа, ячейки совпадающие с Фио устанавливать незащищенные, остальные защищенные и ставить защиту листа...
Моих познаний в Эксель не хватит так сделать.. Да способы предложенные чуть ниже вашего поста работают.. работают по разному, пока не разобрался еще как..
т.е. если нужно другие данные изменить любой вносит другую фамилию и меняет?
Проблема с хотелками по файлу более глобальная и правила форума требуют задавать в одной теме один вопрос. Поэтому про ФИО Админа файла я не задал.. может зря.
если учетные записи пользователя у всех уникальные, может к ним тогда привязываться?
Можно и так. Думал над этим, когда вопрос задавал. На работе у всех учётки свои, но иногда нужно кому то помочь своему товарищу.... Но ваш вопрос меня еще поразмышлять заставил.. Можно и по учеткам сделать привязку, просто если кто то хочет помочь с работой с файлом - пусть под учеткой своего товарища заходит в комп... Короче буду думать.
при изменении в ячейке bn1 запрашивать пароль сверять со списком если верный снимать защиту листа, ячейки совпадающие с Фио устанавливать незащищенные, остальные защищенные и ставить защиту листа...
Моих познаний в Эксель не хватит так сделать.. Да способы предложенные чуть ниже вашего поста работают.. работают по разному, пока не разобрался еще как..ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Nic70y, код работает не совсем ожидаемо, как я думал, когда вопрос писал.. но по своему задачу решает. Он просто не дает выделить ячейку, которую нельзя редактировать, а если начинаешь редактировать данные не в "своей" ячейке, то редактирование не происходит и курсор уходит вниз по столбцу до ближайшей ячейки, которую можно редактировать. Пока с кодом не разобрался.... для меня сложно и специфический способ решения задачи. В закладки сохраню.
Nic70y, код работает не совсем ожидаемо, как я думал, когда вопрос писал.. но по своему задачу решает. Он просто не дает выделить ячейку, которую нельзя редактировать, а если начинаешь редактировать данные не в "своей" ячейке, то редактирование не происходит и курсор уходит вниз по столбцу до ближайшей ячейки, которую можно редактировать. Пока с кодом не разобрался.... для меня сложно и специфический способ решения задачи. В закладки сохраню.ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range Set r = Range("A" & Cells(Rows.Count, 49).End(xlUp).Row & ":BM1") If Not Intersect(Target, r) Is Nothing Then If Target.Row < 10 Or Target.Column < 50 Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True Else If Cells(Target.Row, 49) <> Cells(1, 66) Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End If End If End Sub
[/vba] Господа профи - вопрос в принципе полностью соответствует данной теме. Как доработать макрос, чтобы в столбце AW можно было записать несколько фамилий через запятую людей, которые может редактировать диапазон. В ячейке BN1 будет записана всегда одна фамилия. Ну и еще есть одно ограничение на невнимательность пользователей данного файла. Фамилию в столбец AW могут занести и правильно типа "Иванов, Сидоров, Овечкин", а могут между фамилиями и несколько пробелов поставить. Но запятая точно будет. Если мой вопрос противоречит правилам форума, то готов часть вопроса оформить отдельной темой.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range Set r = Range("A" & Cells(Rows.Count, 49).End(xlUp).Row & ":BM1") If Not Intersect(Target, r) Is Nothing Then If Target.Row < 10 Or Target.Column < 50 Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True Else If Cells(Target.Row, 49) <> Cells(1, 66) Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End If End If End Sub
[/vba] Господа профи - вопрос в принципе полностью соответствует данной теме. Как доработать макрос, чтобы в столбце AW можно было записать несколько фамилий через запятую людей, которые может редактировать диапазон. В ячейке BN1 будет записана всегда одна фамилия. Ну и еще есть одно ограничение на невнимательность пользователей данного файла. Фамилию в столбец AW могут занести и правильно типа "Иванов, Сидоров, Овечкин", а могут между фамилиями и несколько пробелов поставить. Но запятая точно будет. Если мой вопрос противоречит правилам форума, то готов часть вопроса оформить отдельной темой.ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Сообщение отредактировал Pelena - Четверг, 24.10.2019, 21:34
Вопрос действительно по доработке макроса, поэтому пусть остается в этой теме. А вот код надо не под спойлер класть, а оформлять тегами с помощью кнопки #. Исправьте
Вопрос действительно по доработке макроса, поэтому пусть остается в этой теме. А вот код надо не под спойлер класть, а оформлять тегами с помощью кнопки #. ИсправьтеPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Dim spl, fl As Boolean spl = Split(Cells(1, 66), ",") For i = LBound(spl) To UBound(spl) If Cells(Target.Row, 49) = Trim(spl(i)) Then fl = True: Exit For Next If Not fl Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If
[/vba]
Будем надеяться, что исправит [vba]
Код
Dim spl, fl As Boolean spl = Split(Cells(1, 66), ",") For i = LBound(spl) To UBound(spl) If Cells(Target.Row, 49) = Trim(spl(i)) Then fl = True: Exit For Next If Not fl Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If
Dim spl, fl As Boolean spl = Split(Cells(Target.Row, 49), ",") For i = LBound(spl) To UBound(spl) If Cells(1, 66) = Trim(spl(i)) Then fl = True: Exit For Next If Not fl Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If
[/vba]
Андрей, огромное человеческое! Код мне товарищ допилил. Работает отлично!
Dim spl, fl As Boolean spl = Split(Cells(Target.Row, 49), ",") For i = LBound(spl) To UBound(spl) If Cells(1, 66) = Trim(spl(i)) Then fl = True: Exit For Next If Not fl Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If
[/vba]
Андрей, огромное человеческое! Код мне товарищ допилил. Работает отлично!ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
А вот код надо не под спойлер класть, а оформлять тегами с помощью кнопки #. Исправьте
Елена, сильно извиняюсь, но не могу исправить. Видимо поздно. Но Ваши замечания учел в следующем посту. [admin]ОК. Исправила первый код[/admin]ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Сообщение отредактировал Pelena - Четверг, 24.10.2019, 21:37