Excel - Как сбросить имя таблицы по умолчанию при копировании листа с таблицей - PullRequest
0 голосов
/ 04 мая 2020

У меня есть книга с одним листом «Лист1». На этом листе у меня есть одна таблица с именем по умолчанию «Таблица1». Когда я копирую лист (щелкните правой кнопкой мыши -> Переместить или Скопировать) в той же книге, я получаю Лист » Лист1 (2) ". Таблица на этом листе автоматически называется «Таблица13». Я делаю некоторую обработку в этом скопированном листе и впоследствии удаляю это. Оставляя рабочую книгу только с ее оригинальным Листом 1.

Каждый раз, когда я делаю копию Листа1, таблица в скопированном листе увеличивается на единицу. Также если я удалю лист и добавлю новый. Он продолжает увеличиваться.

Я использую рабочую книгу и Лист1 в качестве шаблона и создаю с помощью макроса много копий. Новое имя таблицы теперь увеличено до «Table21600». Я обнаружил, что Excel выдаст переполнение, когда я достигну приблизительно «Table21650».

Итак, мне нужен способ для сброса счетчика имени добавленной таблицы.

Кто-нибудь знает, как достичь этого?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Сброс таблицы «Счетчик»

  • Несмотря на то, что «счетчик» не прекращает увеличиваться, при закрытии рабочей книги и открытии ее в следующий раз она снова начинается с Table13.
  • В окне Immediate CRTL + G вы увидите имя таблицы до и после переименования. После завершения тестирования просто закомментируйте строки, содержащие Debug.Print.

Первый код

' Copies a sheet and renames all its tables.
Sub CopySheetWithTable(Optional SheetNameOrIndex As Variant = "Sheet1", _
  Optional NewTableName As String = "Tbl")

    Dim MySheet As Worksheet
    Dim MyCopy As Worksheet
    Dim MyTable As ListObject
    Dim i As Long

    Set MySheet = ThisWorkbook.Worksheets(SheetNameOrIndex)
    'MySheet.Copy MySheet    ' Before e.g. Sheet1)
    MySheet.Copy , MySheet  ' After e.g. Sheet1
    Set MyCopy = ActiveSheet
    For Each MyTable In MyCopy.ListObjects
        i = i + 1
        Debug.Print "Old Table Name = " & MyTable.Name
        MyTable.Name = NewTableName & i
        Debug.Print "Old Table Name = " & MyTable.Name
    Next

End Sub

Использование

  • Скопируйте предыдущую и следующую подпрограмму в модуль. Запустите следующую подпрограмму, чтобы скопировать новый лист. Отрегулируйте, если хотите, чтобы он был до или после копирования листа.
  • Вам больше не нужно копировать лист вручную.

Второй код

' You can create a button on the worksheet and use this one-liner in its code.
Sub CopySheet()
    CopySheetWithTable  ' Default is CopySheetWithTable "Sheet1", "Tbl"
End Sub

Удалить все листы после рабочего листа

Это всего лишь инструмент тестирования.

' Deletes all sheets after the selected sheet (referring to the tab order).
Sub DeleteSheetsAfter(DeleteAfterSheetNameOrIndex As Variant) 'Not tested.

    Dim LastSheetNumber As Long
    Dim SheetsArray() As Variant
    Dim i As Long

    ' Try to find the worksheet in the workbook containing this code.
    On Error Resume Next
      LastSheetNumber = _
        ThisWorkbook.Worksheets(DeleteAfterSheetNameOrIndex).Index
    If Err.Number <> 0 Then
        MsgBox "There is no Sheet '" & DeleteAfterSheetNameOrIndex & "' " _
          & "in (this) workbook '" & ThisWorkbook.Name & "'."
        Exit Sub
    End If

    With ThisWorkbook
        ReDim SheetsArray(.Sheets.Count - LastSheetNumber - 1)
        For i = LastSheetNumber + 1 To .Sheets.Count
            SheetsArray(i - LastSheetNumber - 1) = i
        Next
    End With
    Application.DisplayAlerts = False
        ThisWorkbook.Sheets(SheetsArray).Delete
    Application.DisplayAlerts = True

    MsgBox "Deleted " & UBound(SheetsArray) & " worksheets after worksheet '" _
      & ThisWorkbook.Worksheets(DeleteAfterSheetNameOrIndex).Name & "'.", _
      vbInformation, "Delete Successful"

End Sub

Sub DeleteAfter()
    DeleteSheetsAfter "Sheet1"
End Sub
0 голосов
/ 04 мая 2020

Вы можете получить доступ (и изменить) имена каждой таблицы («ListObject») из вашего макрокода, как показано в этом примере:

Sub ListAllListObjectNames()

Dim wrksheet As Worksheet
Dim lstObjct As ListObject
Dim count As Integer

count = 0
For Each wrksheet In ActiveWorkbook.Worksheets
    For Each lstObjct In wrksheet.ListObjects
        count = count + 1
        lstObjct.Name = "Table_" & CStr(count)
        Debug.Print wrksheet.Name, ": ", lstObjct.Name
    Next
Next

End Sub
...