2010-10-01 9 views
23

У меня есть очень простой код, который добавляет новый рабочий лист после текущих рабочих листов в документ Excel и затем изменяет его имя на одно, введенное в текстовое поле пользовательской формы. Хорошо работает в новой книге, однако в книге, содержащей несколько существующих рабочих листов, он создает новый рабочий лист, но не переименовывает его.Создание и присвоение имен в Excel VBA

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

код я использую здесь:

 Dim WS As Worksheet 

    Set WS = Sheets.Add(After:=Sheets(Worksheets.count)) 
    WS.name = txtSheetName.value 

Довольно просто. Мне интересно, если эта проблема заключается в том, что она пытается переименовать лист, прежде чем он будет правильно создан? Есть ли лучший способ написать этот код?

Update: Я начал отладки это с помощью msgboxes, как открытие отладчика делает остановку проблемы, и кажется, что он просто прекращает обработку коды на полпути через:

Dim WS As Worksheet 
    MsgBox (WS Is Nothing) 

    Set WS = Sheets.Add(After:=Sheets(Worksheets.count)) 
    '***** Nothing after this point gets processed ******* 
    MsgBox (WS Is Nothing) 
    MsgBox WS.name 

    WS.name = txtSheetName.value 
    MsgBox WS.name 
+1

В Excel есть много способов, чтобы вы были в восторге.Часто вы ничего не можете с этим поделать. Попробуйте различные относительно бесполезные вещи, например, используя коллекцию Worksheets вместо 'Sheets' или присваивая' txtSheetName.value' строковой переменной. – GSerg

+0

Похоже, вы настраиваете имя до того, как оно находится в txtSheetName. Вы запускаете этот код из события txtSheetName_Change? Если нет, это, вероятно, устранит проблему. –

+0

@Marc событие запускается из события кнопки, которое проверяет, установлено ли текстовое поле. –

ответ

27

http://www.mrexcel.com/td0097.html

Dim WS as Worksheet 
Set WS = Sheets.Add 

Вам не обязательно знать, где он находится, или как его зовут, вы просто ссылаетесь на него как на WS.
Если вы все еще хотите сделать это «старомодный» способ, попробуйте следующее:

Sheets.Add.Name = "Test" 
+0

Как это отличается от того, что делает OP? – GSerg

+0

Я не написал статью, я указал ему на источник. когда я тестировал код в статье, в частности [Sheets.Add.Name = "test"], он работал безупречно. – Sage

+4

Да, я пробовал это. Проблема в том, что она работает безупречно во второй раз, или вы открываете отладчик, или лист пуст, или луна находится в третьей четверти ... –

0

ли занимайтесь ячейкой перед нажатием кнопки (нажав Enter)? Содержимое ячейки необходимо сохранить до того, как ее можно будет использовать для обозначения листа.

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

+0

Он берет имя из текстового поля в пользовательской форме. –

2

Вы используете обработчик ошибок? Если вы игнорируете ошибки и пытаетесь назвать лист таким же, как существующий лист или имя с недопустимыми символами, оно может просто пропустить эту строку. Смотрите функцию CleanSheetName здесь

http://www.dailydoseofexcel.com/archives/2005/01/04/naming-a-sheet-based-on-a-cell/

для списка недопустимых символов, которые вы можете проверить на.

Update

Другие вещи, чтобы попробовать: Полностью квалифицированные ссылки, бросая в DoEvents, очистки кода. Этот код квалифицирует вашу литовую ссылку на ThisWorkbook (вы можете изменить ее на ActiveWorkbook, если это подходит). Он также добавляет тысячу DoEvents (глупое переполнение, но если что-то займет некоторое время, чтобы это сделать, это позволит вам - вам может понадобиться только один DoEvents, если это действительно что-то исправляет).

Dim WS As Worksheet 
Dim i As Long 

With ThisWorkbook 
    Set WS = .Worksheets.Add(After:=.Sheets(.Sheets.Count)) 
End With 

For i = 1 To 1000 
    DoEvents 
Next i 

WS.Name = txtSheetName.Value 

Наконец, когда у меня есть тупая проблема VBA, что просто не имеет смысла, я использую CodeCleaner Роб Бовите в. Это надстройка, которая экспортирует все ваши модули в текстовые файлы, а затем повторно импортирует их. Вы можете сделать это вручную. Этот процесс очищает любой поврежденный p-код, который висит вокруг.

+0

К сожалению, нет, я не игнорирую ошибки, и имя работает во второй раз, когда вы запускаете его, что говорит мне, что все в порядке. –

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