Подтвердить что ты не робот

Создание и присвоение имен в Excel VBA

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

Это происходит только при первом запуске этого кода, в следующий раз, когда он будет работать нормально. Вещь, которая делает ее еще более странной, заключается в том, что если вы откроете редактор 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
4b9b3361

Ответ 1

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

Dim WS as Worksheet
Set WS = Sheets.Add

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

Sheets.Add.Name = "Test"

Ответ 2

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

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

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

Обновление

Другие вещи, чтобы попытаться: Полностью квалифицированные ссылки, бросая в 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, который просто не имеет смысла, я использую Rob Bovey CodeCleaner. Это надстройка, которая экспортирует все ваши модули в текстовые файлы, а затем повторно импортирует их. Вы можете сделать это вручную. Этот процесс очищает любой поврежденный p-код, который висит вокруг.

Ответ 3

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

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