Создавал аналогичную тему в вопросах по Excel, направили сюда.
Просьба помочь со следующими проблемами: 1. При выборе уровня профессионализма "Manual" или "Professional" в разделе "Level" открывается меню выбора компетенций "Professional Competencies". Подскажите верное решение, чтобы в трех строчках выбора нельзя было выбирать одинаковые компетенции (сообщение об ошибке, как в выборе из списка).
2. При выборе уровня профессионализма "Manual", "Professional" в разделе "Level" меню выбора компетенций "Professional Competencies" имеет длину в три строчки. А если выбирать уровень профессионализма "Manager", то меню выбора компетенций меняет свое название на "Managerial Competencies" и длина его увеличивается до 6 строк. При использовании защиты ячеек (незащищенными оставляю все ячейки кремового цвета, т.к. они заполняются или вручную, или данными из списков) меню выбора компетенций название своё меняет ("Professional Competencies" на "Managerial Competencies"), а вот кол-во строк не меняется с 3 на 6.
Доброго времени суток, уважаемые гуру!
Создавал аналогичную тему в вопросах по Excel, направили сюда.
Просьба помочь со следующими проблемами: 1. При выборе уровня профессионализма "Manual" или "Professional" в разделе "Level" открывается меню выбора компетенций "Professional Competencies". Подскажите верное решение, чтобы в трех строчках выбора нельзя было выбирать одинаковые компетенции (сообщение об ошибке, как в выборе из списка).
2. При выборе уровня профессионализма "Manual", "Professional" в разделе "Level" меню выбора компетенций "Professional Competencies" имеет длину в три строчки. А если выбирать уровень профессионализма "Manager", то меню выбора компетенций меняет свое название на "Managerial Competencies" и длина его увеличивается до 6 строк. При использовании защиты ячеек (незащищенными оставляю все ячейки кремового цвета, т.к. они заполняются или вручную, или данными из списков) меню выбора компетенций название своё меняет ("Professional Competencies" на "Managerial Competencies"), а вот кол-во строк не меняется с 3 на 6.Graceless
в процедуре Workbook_SheetChange я бы посоветовал заменить [vba]
Код
Select Case CStr(target) Case "_": MannagerList (-1) Case "Manager": MannagerList (1) Case "Manual_Worker", "Professional": MannagerList (0) End Select
[/vba] на [vba]
Код
If Not Intersect(target, Range("H4:I5")) Is Nothing Then Select Case CStr(target) Case "_": MannagerList (-1) Case "Manager": MannagerList (1) Case "Manual_Worker", "Professional": MannagerList (0) End Select End If
[/vba]
проблема №1 вариант с дополнительными столбцами
в ячейку M85 поставить два пробела в диапазоне N76:N85 формула
в процедуре Workbook_SheetChange я бы посоветовал заменить [vba]
Код
Select Case CStr(target) Case "_": MannagerList (-1) Case "Manager": MannagerList (1) Case "Manual_Worker", "Professional": MannagerList (0) End Select
[/vba] на [vba]
Код
If Not Intersect(target, Range("H4:I5")) Is Nothing Then Select Case CStr(target) Case "_": MannagerList (-1) Case "Manager": MannagerList (1) Case "Manual_Worker", "Professional": MannagerList (0) End Select End If
да и весь код процедуры MannagerList я бы переписал как-то так [vba]
Код
Sub MannagerList(Mang As Integer) Dim AA As Variant ActiveSheet.Unprotect AA = Array("Organization and planning", "Decision-making", _ "Team building, management And development", "Delegation and control", _ "Leadership and motivation", "Strategic thinking") ' "Manual_Worker", "Professional": If Mang = 0 Then Range("E39:E45").Value = " " ' Range("E46").Value = " " Range("B39").Value = "Professional Competencies" Range("D42:I44").RowHeight = 0 'Range("D44:I46").Select 'Range("D44:I46").Select ' Selection.RowHeight = 0 ' Уставновка With Range("E39:E44").Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="=List" End With 'Установка в начало Range("E40").Select Range("D39").Value = 1 Range("D40").Value = 2 Range("D41").Value = 3 ElseIf Mang = 1 Then ' Manager For i = 0 To 5 Range("E" & 39 + i).Value = AA(i) Next 'Range("E46").Value = A7 Range("B39").Value = "Managerial Competencies" ' Высота строк Range("D40:I46").RowHeight = 14 ' Очистка данных проверки With Range("E39:E46").Validation .Delete .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween End With ' Установка в текущее положение Range("E40").Select For i = 1 To 6 Range("D" & 38 + i).Value = i Next ElseIf Mang = -1 Then ' ************************************************************************* ' Пустое значение ' ************************************************************************* Range("B39").Value = "" Range("D39:D44").Value = "" Range("E39:E44").Value = "" End If ' Следующее поле для заполнения после выбора типа Range("C6").Select ActiveSheet.Protect End Sub
[/vba]
да и весь код процедуры MannagerList я бы переписал как-то так [vba]
Код
Sub MannagerList(Mang As Integer) Dim AA As Variant ActiveSheet.Unprotect AA = Array("Organization and planning", "Decision-making", _ "Team building, management And development", "Delegation and control", _ "Leadership and motivation", "Strategic thinking") ' "Manual_Worker", "Professional": If Mang = 0 Then Range("E39:E45").Value = " " ' Range("E46").Value = " " Range("B39").Value = "Professional Competencies" Range("D42:I44").RowHeight = 0 'Range("D44:I46").Select 'Range("D44:I46").Select ' Selection.RowHeight = 0 ' Уставновка With Range("E39:E44").Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="=List" End With 'Установка в начало Range("E40").Select Range("D39").Value = 1 Range("D40").Value = 2 Range("D41").Value = 3 ElseIf Mang = 1 Then ' Manager For i = 0 To 5 Range("E" & 39 + i).Value = AA(i) Next 'Range("E46").Value = A7 Range("B39").Value = "Managerial Competencies" ' Высота строк Range("D40:I46").RowHeight = 14 ' Очистка данных проверки With Range("E39:E46").Validation .Delete .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween End With ' Установка в текущее положение Range("E40").Select For i = 1 To 6 Range("D" & 38 + i).Value = i Next ElseIf Mang = -1 Then ' ************************************************************************* ' Пустое значение ' ************************************************************************* Range("B39").Value = "" Range("D39:D44").Value = "" Range("E39:E44").Value = "" End If ' Следующее поле для заполнения после выбора типа Range("C6").Select ActiveSheet.Protect End Sub
Спасибо. Изменил. Теперь пункт 2 работает так, как нужно.
Но с дополнительными столбцами проблема: вставил формулы, создал именованный диапазон, не получилось (( Наверное, туплю. Поправьте, если что не так.
Спасибо. Изменил. Теперь пункт 2 работает так, как нужно.
Но с дополнительными столбцами проблема: вставил формулы, создал именованный диапазон, не получилось (( Наверное, туплю. Поправьте, если что не так.Graceless
Написанные мной формулы - формулы массива. Чтобы их ввести, нужно выделить диапазон, в строку формул ввести фомулу без фигурных скобок и нажать ctrl±shift+enter
Написанные мной формулы - формулы массива. Чтобы их ввести, нужно выделить диапазон, в строку формул ввести фомулу без фигурных скобок и нажать ctrl±shift+enterkrosav4ig
Serge_007, скажите пожалуйста можно ли эти первые две формулы объединить в одну?
Graceless, ради интереса заглянул в ваш макрос... у меня возникли большие сомнения по поводу строки [vba]
Код
If Target.Count > 1 Then Target.Delete
[/vba] чтобы было понятнее переведу ее на руссий язык [vba]
Код
ЕСЛИ в выделенном диапазоне более 1 ячейки ТО удалить первую ячейку выделенного диапазона со сдвигом влево
[/vba] дело в том, что в Range("E39:G41") все ячейки являются частью объединенного диапазона и привыборе любой из них на этой строке кода будет происходить удаление
заглянул в module1 и мне стало как-то непосебе настоятельно рекомендую все что там написано заменить на чтото типа этого [vba]
Код
Sub Clear_all() ActiveSheet.Unprotect Application.ScreenUpdating = False Dim rngs As Variant Dim rng, rng2 As Range rngs = Array("B39", "C4", "H4", "C6", "C7", "C8", "C9", "C10", "C12", _ "C13", "H12", "H8", "C17", "E17:H19", "C21", "E21:H23", "C25", "E25:H31", _ "C39", "E39:H44", "D49:D54", "D56:D58", "B62:E62", "B63:E63", "B66:E66", _ "B67:E67", "H33:H37", "F62:I62", "F67:I67", "D64:E64", "D68:E68", "H64:I64", _ "C2") Set rng = Range(rngs(0)) Dim i As Integer For i = 0 To UBound(rngs) For Each cell In Range(rngs(i)) If cell.MergeCells Then Set rng = Union(rng, cell.MergeArea) Else Set rng = Union(rng, cell) End If Next Next rng.ClearContents Application.ScreenUpdating = True ActiveSheet.Protect End Sub
[/vba]
и еще несколько слов про использование Worksheet_Change, Workbook_SheetChange, Worksheet_SelectionChange, Workbook_SheetSelectionChange
Worksheet_Change, Workbook_SheetChange - это процедуры, которые выполняются при любом изменении ячеек листа. Worksheet_Change запускается только при изменении на листе, в модуль которого она прописана, если она прописана не в модуль листа, оно работать не будет. Workbook_SheetChange запускается при изменениии на любом листе и эта процедура должна быть прописана в модуль книги (в вашем случае ЦяКнига). Если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.
та же картина и с Worksheet_SelectionChange, Workbook_SheetSelectionChange Worksheet_SelectionChange запускается при изменении адреса активной ячейки в том листе, в модуль которого она прописана. Workbook_SheetSelectionChange запускается при изменении адреса активной ячейки в любом листе и точно так же как и Workbook_SheetChange должна быть прописана в модуль книги (в вашем случае ЦяКнига). И так же если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.
небольшая поправка: в диапазоне O76:O85 формулу нужно заменить на
Serge_007, скажите пожалуйста можно ли эти первые две формулы объединить в одну?
Graceless, ради интереса заглянул в ваш макрос... у меня возникли большие сомнения по поводу строки [vba]
Код
If Target.Count > 1 Then Target.Delete
[/vba] чтобы было понятнее переведу ее на руссий язык [vba]
Код
ЕСЛИ в выделенном диапазоне более 1 ячейки ТО удалить первую ячейку выделенного диапазона со сдвигом влево
[/vba] дело в том, что в Range("E39:G41") все ячейки являются частью объединенного диапазона и привыборе любой из них на этой строке кода будет происходить удаление
заглянул в module1 и мне стало как-то непосебе настоятельно рекомендую все что там написано заменить на чтото типа этого [vba]
Код
Sub Clear_all() ActiveSheet.Unprotect Application.ScreenUpdating = False Dim rngs As Variant Dim rng, rng2 As Range rngs = Array("B39", "C4", "H4", "C6", "C7", "C8", "C9", "C10", "C12", _ "C13", "H12", "H8", "C17", "E17:H19", "C21", "E21:H23", "C25", "E25:H31", _ "C39", "E39:H44", "D49:D54", "D56:D58", "B62:E62", "B63:E63", "B66:E66", _ "B67:E67", "H33:H37", "F62:I62", "F67:I67", "D64:E64", "D68:E68", "H64:I64", _ "C2") Set rng = Range(rngs(0)) Dim i As Integer For i = 0 To UBound(rngs) For Each cell In Range(rngs(i)) If cell.MergeCells Then Set rng = Union(rng, cell.MergeArea) Else Set rng = Union(rng, cell) End If Next Next rng.ClearContents Application.ScreenUpdating = True ActiveSheet.Protect End Sub
[/vba]
и еще несколько слов про использование Worksheet_Change, Workbook_SheetChange, Worksheet_SelectionChange, Workbook_SheetSelectionChange
Worksheet_Change, Workbook_SheetChange - это процедуры, которые выполняются при любом изменении ячеек листа. Worksheet_Change запускается только при изменении на листе, в модуль которого она прописана, если она прописана не в модуль листа, оно работать не будет. Workbook_SheetChange запускается при изменениии на любом листе и эта процедура должна быть прописана в модуль книги (в вашем случае ЦяКнига). Если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.
та же картина и с Worksheet_SelectionChange, Workbook_SheetSelectionChange Worksheet_SelectionChange запускается при изменении адреса активной ячейки в том листе, в модуль которого она прописана. Workbook_SheetSelectionChange запускается при изменении адреса активной ячейки в любом листе и точно так же как и Workbook_SheetChange должна быть прописана в модуль книги (в вашем случае ЦяКнига). И так же если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.krosav4ig