[/vba] Хотя данный код где только уже не использовался и все олрайд а тут [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'код пользовательского формата ячейки If Target.Address(0, 0) = "D5" Then t_ = Split(Target, "-") If UBound(t_) Then Application.EnableEvents = 0 Target = "Протокол № " & Format(t_(0), "000\-") & t_(1) Application.EnableEvents = 1 End If End If 'код добавления нового сотрудника в выпадающий список Dim lReply As Long
If Target.Cells.Count > 1 Then Exit Sub If Target.Address = "$O$43" Then If IsEmpty(Target) Then Exit Sub If WorksheetFunction.CountIf(Worksheets("Сотрудники").Range("Сотр"), Target) = 0 Then lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion) If lReply = vbYes Then Worksheets("Сотрудники").Range("Сотр").Cells(Worksheets("Сотрудники").Range("Сотр").Rows.Count + 1, 1) = Target End If End If End If Sheets("Сотрудники").Range("A1:A1000").Sort Key1:=Sheets("Сотрудники").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal 'этот код и поможет отсортировать в алфавитном порядке End Sub
[/vba] Хотя данный код где только уже не использовался и все олрайд а тут [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'код пользовательского формата ячейки If Target.Address(0, 0) = "D5" Then t_ = Split(Target, "-") If UBound(t_) Then Application.EnableEvents = 0 Target = "Протокол № " & Format(t_(0), "000\-") & t_(1) Application.EnableEvents = 1 End If End If 'код добавления нового сотрудника в выпадающий список Dim lReply As Long
If Target.Cells.Count > 1 Then Exit Sub If Target.Address = "$O$43" Then If IsEmpty(Target) Then Exit Sub If WorksheetFunction.CountIf(Worksheets("Сотрудники").Range("Сотр"), Target) = 0 Then lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion) If lReply = vbYes Then Worksheets("Сотрудники").Range("Сотр").Cells(Worksheets("Сотрудники").Range("Сотр").Rows.Count + 1, 1) = Target End If End If End If Sheets("Сотрудники").Range("A1:A1000").Sort Key1:=Sheets("Сотрудники").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal 'этот код и поможет отсортировать в алфавитном порядке End Sub
_Boroda_, Александр спасибо за ответ и ночи доброй В начале он просто не позволял и сразу выводил код в окрашивание красного с припиской breakpoint not allowed on thi Сейчас действительно пишу свою фамилию и он позволяет, но как только выбираю ДА так вот так вот сразу выдает [img][/img] Бред какой то Пересохранился и работает без ругания И звените за беспокойство может с офисом что не так или компом
_Boroda_, Александр спасибо за ответ и ночи доброй В начале он просто не позволял и сразу выводил код в окрашивание красного с припиской breakpoint not allowed on thi Сейчас действительно пишу свою фамилию и он позволяет, но как только выбираю ДА так вот так вот сразу выдает [img][/img] Бред какой то Пересохранился и работает без ругания И звените за беспокойство может с офисом что не так или компомlebensvoll
Кто бы ты ни был, мир в твоих руках
Сообщение отредактировал lebensvoll - Воскресенье, 24.03.2019, 03:29
Public Function Столбец_Вниз_Ячейка_Свободная(ByVal cell As Range) _ As Range ' тестом Покрыто опосредованно ' вернуть ячейку свободную по столбцу вниз ' АртеФакт
Set Столбец_Вниз_Ячейка_Свободная = cell.EntireColumn.End(xlDown).Offset(1, 0)
Public Function Столбец_Вниз_Ячейка_Свободная(ByVal cell As Range) _ As Range ' тестом Покрыто опосредованно ' вернуть ячейку свободную по столбцу вниз ' АртеФакт
Set Столбец_Вниз_Ячейка_Свободная = cell.EntireColumn.End(xlDown).Offset(1, 0)
Какой в этом смысл? То, что Worksheets("Сотрудники").Range("Сотр") нужно вынести в With - это да, но зачем в отдельную функцию, у нас же нет одинаковых блоков в нескольких частях кода? Единственное, что мне приходит в голову - создание базы таких микрофункций для последующего использования. Согласен, это удобно и экономит время написания кода (написания, но не исполнения, исполнение будет чуть дольше - тратится время на вызов функции). Все это так для мастера VBA (коим Вы, несомненно, и являетесь) или для того, кто штампует коды пачками на продажу, а вот для не очень уверенного пользователя такой подход, (сразу оговорюсь - это мое личное мнение) вреда принесет гораздо больше, чем пользы. Основываясь на своем немалом опыте частного преподавания, утверждаю, что код нужно писать руками каждый раз заново до тех пор, пока не почвится 100%-е понимание написанного и пока он (код) не будет писаться полностью на автомате. Иначе обязательно возникнет ситуация, когда код написать нужно, а базы с функциями рядом не будет (да хотя бы тест при устройстве на работу). Что тогда этот не очень уверенный пользователь делать будет? Он ведь только пользовался своими функциями, а что там написано и как они работают - давно уже забыл и быстро восстановить необходимое ему будет очень сложно. Повторюсь - это исключительно мое мнение, а выбирать, конечно, пользователю
Какой в этом смысл? То, что Worksheets("Сотрудники").Range("Сотр") нужно вынести в With - это да, но зачем в отдельную функцию, у нас же нет одинаковых блоков в нескольких частях кода? Единственное, что мне приходит в голову - создание базы таких микрофункций для последующего использования. Согласен, это удобно и экономит время написания кода (написания, но не исполнения, исполнение будет чуть дольше - тратится время на вызов функции). Все это так для мастера VBA (коим Вы, несомненно, и являетесь) или для того, кто штампует коды пачками на продажу, а вот для не очень уверенного пользователя такой подход, (сразу оговорюсь - это мое личное мнение) вреда принесет гораздо больше, чем пользы. Основываясь на своем немалом опыте частного преподавания, утверждаю, что код нужно писать руками каждый раз заново до тех пор, пока не почвится 100%-е понимание написанного и пока он (код) не будет писаться полностью на автомате. Иначе обязательно возникнет ситуация, когда код написать нужно, а базы с функциями рядом не будет (да хотя бы тест при устройстве на работу). Что тогда этот не очень уверенный пользователь делать будет? Он ведь только пользовался своими функциями, а что там написано и как они работают - давно уже забыл и быстро восстановить необходимое ему будет очень сложно. Повторюсь - это исключительно мое мнение, а выбирать, конечно, пользователю_Boroda_
базы таких микрофункций для последующего использования.
Именно. Если наша цель - удовольствие при программировании, то наш поводырь в этом процессе когнитивная сложность - стало сЛожно - скоро исчезнет благодать. Возможности сознательного написания и анализа кода ограничены. Кто боролся со сложностью проектов, создавая код, понятный компилятору, замечая, что не понимает собственный код через неделю?
Выход нашли до нас: иерархия, декораторы и артефакты.
Артефакт для программиста - функция нулевой сложности. Её некуда упрощать. Программист за артефакты спокоен, они: - понятны - подвержены юнит-тестированию = не подведут - повышают производительность труда, ибо - часто используются повторно - элементы живого ООП - разрушьте собор, создайте базар. - тут я много наконспектировал :-)
[/vba] Она состоит из артефактов и декораторов артефактов. Почти весь код под контролем. Это почти проза. Я продолжаю с удовольствием программировать - чего и Вам желаю!
базы таких микрофункций для последующего использования.
Именно. Если наша цель - удовольствие при программировании, то наш поводырь в этом процессе когнитивная сложность - стало сЛожно - скоро исчезнет благодать. Возможности сознательного написания и анализа кода ограничены. Кто боролся со сложностью проектов, создавая код, понятный компилятору, замечая, что не понимает собственный код через неделю?
Выход нашли до нас: иерархия, декораторы и артефакты.
Артефакт для программиста - функция нулевой сложности. Её некуда упрощать. Программист за артефакты спокоен, они: - понятны - подвержены юнит-тестированию = не подведут - повышают производительность труда, ибо - часто используются повторно - элементы живого ООП - разрушьте собор, создайте базар. - тут я много наконспектировал :-)
[/vba] Она состоит из артефактов и декораторов артефактов. Почти весь код под контролем. Это почти проза. Я продолжаю с удовольствием программировать - чего и Вам желаю!InExSu
Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
Сообщение отредактировал InExSu - Воскресенье, 24.03.2019, 17:15
[/vba] ? И когда код состоит из простых функций - юнитов, его можно тестировать - юнит-тестировать. А код спагетти несколько затруднительно тестировать. Цель - простота и удовольствие от труда.
[/vba] ? И когда код состоит из простых функций - юнитов, его можно тестировать - юнит-тестировать. А код спагетти несколько затруднительно тестировать. Цель - простота и удовольствие от труда.InExSu
Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
InExSu, _Boroda_, ГОСПОДА!!! Вечер бодрый, если честно я лишь понял одно
Цитата
Нет уж позвольте :-)
Ваш случай - удачный для создания артефакта. Спагетти код налицо.
И это факт!!! В связи с тем что я дополнил ранее код предоставленный Александром My WebPage с этой темы. Теперь получается что добавленный код по "Добавлению в выпадающий список нового сотрудника" срабатывает. А вот если присвоить номер протокола то он не дополняет его текстом "Протокол №" InExSu, Данный код на "Добавление нового в выпадающий список" работает на ура во всех созданных мною файлах. Эту тему поднимали и помогали в решении на этом форуме а также тут My WebPage За чем его усложнять в моем понимание, мне и так очень сложно дается понимание VBA... Но спасибо за отзывчивость!!! И как мне теперь быть!? Возможно как раз таки из за этого у меня и были в начале проблемы побудившие поднять данную тему с "руганием" кода
InExSu, _Boroda_, ГОСПОДА!!! Вечер бодрый, если честно я лишь понял одно
Цитата
Нет уж позвольте :-)
Ваш случай - удачный для создания артефакта. Спагетти код налицо.
И это факт!!! В связи с тем что я дополнил ранее код предоставленный Александром My WebPage с этой темы. Теперь получается что добавленный код по "Добавлению в выпадающий список нового сотрудника" срабатывает. А вот если присвоить номер протокола то он не дополняет его текстом "Протокол №" InExSu, Данный код на "Добавление нового в выпадающий список" работает на ура во всех созданных мною файлах. Эту тему поднимали и помогали в решении на этом форуме а также тут My WebPage За чем его усложнять в моем понимание, мне и так очень сложно дается понимание VBA... Но спасибо за отзывчивость!!! И как мне теперь быть!? Возможно как раз таки из за этого у меня и были в начале проблемы побудившие поднять данную тему с "руганием" кодаlebensvoll
Кто бы ты ни был, мир в твоих руках
Сообщение отредактировал lebensvoll - Воскресенье, 24.03.2019, 20:41
_Boroda_, моя проблема слишком много текста... Созданная тема с выдачей ошибки она решилась. Предложение от InExSu, чтоб не было спагетти на мой взгляд есть в этом что то... Но оно связано лишь при с тем что в один код
Цитата
Worksheet_Change
объединил два действия. 1. Это действие на листе из прошлой темы по "Пользовательскому формату ячейки" [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) = "D5" Then t_ = Split(Target, "-") If UBound(t_) Then Application.EnableEvents = 0 Target = "Протокол № " & Format(t_(0), "000\-") & t_(1) Application.EnableEvents = 1 End If End If End Sub
[/vba] Затем я решил дополнить данное событие на листе еще одним кодом "Добавление нового в выпадающий список" 2.[vba]
Код
'код добавления нового сотрудника в выпадающий список Dim lReply As Long
If Target.Cells.Count > 1 Then Exit Sub If Target.Address = "$O$43" Then If IsEmpty(Target) Then Exit Sub If WorksheetFunction.CountIf(Worksheets("Сотрудники").Range("Сотр"), Target) = 0 Then lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion) If lReply = vbYes Then Worksheets("Сотрудники").Range("Сотр").Cells(Worksheets("Сотрудники").Range("Сотр").Rows.Count + 1, 1) = Target End If End If End If Sheets("Сотрудники").Range("A1:A1000").Sort Key1:=Sheets("Сотрудники").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal 'этот код и поможет отсортировать в алфавитном порядке End Sub
[/vba] И скорее всего из за этого в начале у меня возникали ОШИБКИ и код ругался на строку [vba]
[/vba] Но после перестал, не могу понять по чему но все же. Но позже я заметил что 1-е событие теперь не срабатывает
_Boroda_, моя проблема слишком много текста... Созданная тема с выдачей ошибки она решилась. Предложение от InExSu, чтоб не было спагетти на мой взгляд есть в этом что то... Но оно связано лишь при с тем что в один код
Цитата
Worksheet_Change
объединил два действия. 1. Это действие на листе из прошлой темы по "Пользовательскому формату ячейки" [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) = "D5" Then t_ = Split(Target, "-") If UBound(t_) Then Application.EnableEvents = 0 Target = "Протокол № " & Format(t_(0), "000\-") & t_(1) Application.EnableEvents = 1 End If End If End Sub
[/vba] Затем я решил дополнить данное событие на листе еще одним кодом "Добавление нового в выпадающий список" 2.[vba]
Код
'код добавления нового сотрудника в выпадающий список Dim lReply As Long
If Target.Cells.Count > 1 Then Exit Sub If Target.Address = "$O$43" Then If IsEmpty(Target) Then Exit Sub If WorksheetFunction.CountIf(Worksheets("Сотрудники").Range("Сотр"), Target) = 0 Then lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion) If lReply = vbYes Then Worksheets("Сотрудники").Range("Сотр").Cells(Worksheets("Сотрудники").Range("Сотр").Rows.Count + 1, 1) = Target End If End If End If Sheets("Сотрудники").Range("A1:A1000").Sort Key1:=Sheets("Сотрудники").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal 'этот код и поможет отсортировать в алфавитном порядке End Sub
[/vba] И скорее всего из за этого в начале у меня возникали ОШИБКИ и код ругался на строку [vba]
Конечно не срабатывает. В коде ячейка D5, а в файле В14
И еще, по-моему это довольно важно, особенно на начальном этапе - следите за иерархией кода. Сейчас у Вас там так написано, что для того, чтобы разобраться, нужно внимательно все просмотреть. А должно быть все понятно с первого взгляда. На работу кода это не влияет, а вот на понимание того, что как и после чего идет - влияет очень сильно Кстати, сортировку нужно делать для Q43, поэтому ее нужно занести вовнутрь If [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'код пользовательского формата ячейки If Target.Address(0, 0) = "B14" Then t_ = Split(Target, "-") If UBound(t_) Then Application.EnableEvents = 0 Target = "Протокол № " & Format(t_(0), "000\-") & t_(1) Application.EnableEvents = 1 End If End If 'код добавления ного сотрудника в выпадающий список If Target.Cells.Count > 1 Then Exit Sub If Target.Address = "$O$43" Then If IsEmpty(Target) Then Exit Sub If WorksheetFunction.CountIf(Worksheets("Сотрудники").Range("Сотр"), Target) = 0 Then lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion) If lReply = vbYes Then Worksheets("Сотрудники").Range("Сотр").Cells(Worksheets("Сотрудники").Range("Сотр").Rows.Count + 1, 1) = Target End If Sheets("Сотрудники").Range("A1:A1000").Sort Key1:=Sheets("Сотрудники").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal 'этот код и поможет отсортировать в алфавитном порядке End If End If End Sub
[/vba]
* Ага, пока я писал, уже разобрался. Ну ладно, все равно оставлю И тогда формулу для возраста бетона добавлю
Код
=ABS(ПРАВБ(B14;2))
Конечно не срабатывает. В коде ячейка D5, а в файле В14
И еще, по-моему это довольно важно, особенно на начальном этапе - следите за иерархией кода. Сейчас у Вас там так написано, что для того, чтобы разобраться, нужно внимательно все просмотреть. А должно быть все понятно с первого взгляда. На работу кода это не влияет, а вот на понимание того, что как и после чего идет - влияет очень сильно Кстати, сортировку нужно делать для Q43, поэтому ее нужно занести вовнутрь If [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'код пользовательского формата ячейки If Target.Address(0, 0) = "B14" Then t_ = Split(Target, "-") If UBound(t_) Then Application.EnableEvents = 0 Target = "Протокол № " & Format(t_(0), "000\-") & t_(1) Application.EnableEvents = 1 End If End If 'код добавления ного сотрудника в выпадающий список If Target.Cells.Count > 1 Then Exit Sub If Target.Address = "$O$43" Then If IsEmpty(Target) Then Exit Sub If WorksheetFunction.CountIf(Worksheets("Сотрудники").Range("Сотр"), Target) = 0 Then lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion) If lReply = vbYes Then Worksheets("Сотрудники").Range("Сотр").Cells(Worksheets("Сотрудники").Range("Сотр").Rows.Count + 1, 1) = Target End If Sheets("Сотрудники").Range("A1:A1000").Sort Key1:=Sheets("Сотрудники").Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal 'этот код и поможет отсортировать в алфавитном порядке End If End If End Sub
[/vba]
* Ага, пока я писал, уже разобрался. Ну ладно, все равно оставлю И тогда формулу для возраста бетона добавлю