2013-08-20 3 views
0

Я в затруднении, пытаясь выяснить, где этот код отключается. Я ищу, чтобы переименовать activesheet, используя concat двух диапазонов на activesheet и некоторый статический текст. Когда в рабочей книге находится только один рабочий лист, код отлично работает. Как только будет добавлен второй рабочий лист, я получаю Runtime Error 1004. Я выделим строку кода, где она разбивается. Этот код в настоящее время находится в нормальном модуле.Excel VBA Runtime Ошибка 1004 при переименовании ActiveSheet

Option Explicit 
Sub updateName() 
    Dim fNumber 
    Dim pCheckNumber 
    Dim asName As String 
    Dim tempASName As String 
    Dim worksheetName As Object 

If ActiveSheet.Name = "Launch Page" Then Exit Sub 

fNumber = ActiveSheet.Range("FlightNumber").Value 
pCheckNumber = ActiveSheet.Range("PerformanceCheckNumber").Value 

If fNumber <> "" And pCheckNumber <> "" Then 
    tempASName = "Flight " & fNumber & " | Run " & pCheckNumber & " (0.0%)" 
    asName = tempASName 
    MsgBox ActiveSheet.Name & vbCr & asName 
    ActiveSheet.Name = asName 
    worksheetName.Caption = asName 
Else 
    Exit Sub 
End If 

End Sub 

Я в процессе добавления проверки ошибок, чтобы убедиться, что у меня нет дубликатов имен листов. Однако из-за характера имен полей это никогда не произойдет.

Я ценю все идеи!

+0

Итак, где код разбивается? –

+1

Не могли бы вы добавить примерное значение переменной 'asName'? может быть символ, который не разрешается использовать в имени листа или /, а текст может превышать ограничение длины для имени листа. –

+0

Извините, код разбивается на оператор «if» - строка ActiveSheet.Name. Значение asName в приведенном выше примере будет «Flight 5 | Run 1 (0.0%)). Насколько я могу судить, я не использую никаких запрещенных символов, и я нахожусь в пределах 31 символа. –

ответ

1

Ошибка, о которой вы сообщаете, скорее всего спровоцирована из-за попытки переименовать рабочий лист с использованием имени, которое уже используется. Здесь у вас есть небольшой код, чтобы избежать такого рода ситуаций:

Dim newName As String: newName = "sheet1" 
Dim addition As String: addition = "_2" 
Do While (Not sheetNameFree(newName)) 
    newName = newName & addition 
Loop 

Где sheetNameFree определяется по формуле:

Function sheetNameFree(curName As String) As Boolean 
    sheetNameFree = True 
    For Each Sheet In ActiveWorkbook.Sheets 
     If (LCase(Sheet.Name) = LCase(curName)) Then 
      sheetNameFree = False 
      Exit Function 
     End If 
    Next Sheet 
End Function 

Вы можете адаптировать этот код для ваших конкретных потребностей (например, путем преобразования addition в число, которое растет после каждого неправильного имени).

В вашем коде я вижу еще одну проблему (хотя она не должна запускать ошибку 1004): вы получаете доступ к свойству Caption из объекта, не созданного экземпляром (worksheetName), чья точная функциональность не слишком ясна. Просто удалите эту строку.

ПРИМЕЧАНИЕ: хорошая точка зрения от KazJaw, возможно, вы используете незаконный характер. Если fNumber и pCheckNumber - цифры или буквы, все будет в порядке.

Примечание 2: если с worksheetName вы хотите обратиться к ActiveX Label в листе, лучше делать: ActiveSheet.Label1.Caption (где Label1 это название ярлыка). Вы не можете определить worksheetName в качестве метки, потому что это не «обычная метка».

Смежные вопросы