На листе имеются ячейки G1 (фамилия), K1 (имя), I1 (отчество), N1 (фамилия, инициалы). При обновлении любой из ячеек лист автоматически переименовывается, листы сортируются и обновляется оглавление листов.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$G$1" Or Target.Address = "$I$1" Or Target.Address = "$K$1" Then
If Range("N1").Value <> "" Then
If Len(Range("N1").Value) < 30 Then
Target.Parent.Name = Range("N1").Value
End If
End If
End If
Dim i As Integer, j As Integer
For i = 1 To Sheets.Count - 1
For j = i + 1 To Sheets.Count
If UCase(Sheets(i).Name) > UCase(Sheets(j).Name) Then
Sheets(j).Move before:=Sheets(i)
End If
Next j
Next i
End Sub
Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13
With Sheets("!!!Оглавление").Range("Имена")
If ComboBox2.ListIndex = -1 Then .Offset(.Rows.Count).Resize(1) = ComboBox2.Text
End With
End Select
End Sub
Добавил поле со списком ComboBox, связанное с K1 с возможностью подстановки и добавления новых имен. Но при изменении ComboBox2 листы не переименовывается, не сортируются и не обновляется оглавление. Подскажите пожалуйста чего не хватает для обновления.
Использовал другой вариант. Все работает как надо
Private Sub ComboBox2_Change()
bla ("$I$1")
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$G$1" Or Target.Address = "$I$1" Or Target.Address = "$K$1" Then
bla (Target.Address)
End If
End Sub
Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13
With Sheets("!!!Оглавление").Range("Имена")
If ComboBox2.ListIndex = -1 Then .Offset(.Rows.Count).Resize(1) = ComboBox2.Text
End With
End Select
End Sub
Sub bla(addr As String)
If Range("N1").Value <> "" Then
If Len(Range("N1").Value) < 30 Then
If Range(addr).Parent.Name = Range("N1").Value Then Exit Sub
[color=red]Range(addr).Parent.Name = Range("N1").Value[/color]
End If
End If
Dim i As Integer, j As Integer
For i = 1 To Sheets.Count - 1
For j = i + 1 To Sheets.Count
If UCase(Sheets(i).Name) > UCase(Sheets(j).Name) Then
Sheets(j).Move before:=Sheets(i)
End If
Next j
Next i
End Sub
Но выдает ошибку на строчку
Range(addr).Parent.Name = Range("N1").Value
при копировании листа:
Run-time error '1004'.
Нельзя присвоить листу имя, совподающее с именем другого листа, библиотеки объектов или книги, на которую ссылается VisualBasic.