|
67 Кб. |
|
| При обновлении данных ФИО лист автоматически переименовывается, листы сортируются и обновляется оглавление листов.
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, связанное с ячейкой имени с возможностью подстановки и добавления новых имен. Но при изменении ComboBox2 листы не переименовывается, не сортируются и не обновляется оглавление. Подскажите пожалуйста чего не хватает для обновления.
| |
|
| |
|
|
|
| Вернитесь к своему первоначальному варианту, т.е. сортировка листов - отдельная процедура Sort_Sheets() и просто вызывайте этот макрос, по мере необходимости (из событий Worksheet_Change и ComboBox2_KeyDown)
P.S. Если же Вас удивляет, что изменение данных в ComboBox2 не вызывает событие Worksheet_Change, то причина этого безобразия кроется в использовании свойства LincedCell ( которое имеет свои особенности, например, приводит к вызову события Worksheet_Calculate )
P.P.S. Вместо Target.Parent.Name можно написать более лаконичное Me.Name или даже просто Name | |
|
| |
|
62 Кб. |
|
| Другой вариант. Все работает как надо
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
Но выдает ошибку при копировании листа:
Run-time error '1004'.
Нельзя присвоить листу имя, совподающее с именем другого листа, библиотеки объектов или книги, на которую ссылается VisualBasic. | |
|
| |