Вкладка Excel покрывает имена по сравнению с именами листа Visual Basic

Кажется, что Visual Basic не может таблицы ссылок согласно измененным пользователями именам листа. Вкладкам рабочего листа можно было изменить их имена, но кажется, что Visual Basic все еще думает о названиях рабочего листа как о Sheet1, и т.д., несмотря на вкладку рабочей книги, измененную на что-то полезное.

У меня есть это:

TABname = rng.Worksheet.Name  ' Excel sheet TAB name, not VSB Sheetx name.

но я хотел бы использовать имена листа в стандартных программах Visual Basic. Лучшее я мог подойти до сих пор, должно Выбрать Случай Вкладка Рабочего листа по сравнению с именами Visual Basic, которая не делает мой день. Visual Basic должен знать Sheet1, Sheet2, и т.д., имена. Как я могу получить их связанные с именами вкладки Excel так, чтобы я не поддерживал справочную таблицу, которая изменяется с каждым новым листом или переименованием вкладки листа? Заранее спасибо за Ваши ответы.

18
задан Jon Seigel 30 April 2010 в 18:44
поделиться

5 ответов

В объектной модели Excel рабочий лист имеет 2 разных свойства имени:

Рабочий лист.Имя
Рабочий лист.КодНазвание

свойство Name доступно для чтения и записи и содержит имя, которое отображается на вкладке листа. Это пользовательский и изменяемый VBA

свойство CodeName доступно только для чтения

Вы можете ссылаться на конкретный лист как на Worksheets ("Fred"). Range ("A1"), где Fred - это .Name свойство или как Sheet1.Range ("A1"), где Sheet1 - это кодовое имя рабочего листа.

25
ответ дан 30 November 2019 в 07:28
поделиться

Мне пришлось прибегнуть к этому, но у этого есть проблемы с содержанием.

Function sheet_match(rng As Range) As String  ' Converts Excel TAB names to the required VSB Sheetx names.
  TABname = rng.Worksheet.Name                ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates.
' Next, match this Excel sheet TAB name to the VSB Sheetx name:
   Select Case TABname 'sheet_match
      Case Is = "Sheet1": sheet_match = "Sheet1"  ' You supply these relationships
      Case Is = "Sheet2": sheet_match = "Sheet2"
      Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB
      Case Is = "Sheet4": sheet_match = "Sheet4"
      Case Is = "Sheet5": sheet_match = "Sheet5"
      Case Is = "Sheet6": sheet_match = "Sheet6"
      Case Is = "Sheet7": sheet_match = "Sheet7"
      Case Is = "Sheet8": sheet_match = "Sheet8"
   End Select
End Function
0
ответ дан 30 November 2019 в 07:28
поделиться

Существует (как минимум) два разных способа получить доступ к объекту Worksheet

  • через коллекции Sheets или Worksheets , на которые ссылается DanM
  • неквалифицированными именами объектов

Когда создается новая книга с тремя рабочими листами, будут существовать четыре объекта, к которым вы можете получить доступ через неполные имена: ThisWorkbook ; Лист1 ; Лист2 ; Лист 3 . Это позволяет вам писать такие вещи:

Sheet1.Range("A1").Value = "foo"

Хотя это может показаться полезным ярлыком, проблема возникает, когда рабочие листы переименовываются. Неквалифицированное имя объекта остается как Sheet1 , даже если рабочий лист переименован во что-то совершенно другое.

В этом есть некоторая логика, потому что:

  • имена рабочих листов не соответствуют тем же правилам, что и имена переменных
  • вы можете случайно замаскировать существующую переменную

Например (проверено в Excel 2003), создать новая Рабочая тетрадь с тремя рабочими листами. Создайте два модуля. В одном модуле объявите это:

Public Sheet4 As Integer

В другом модуле поместите:

Sub main()

Sheet4 = 4

MsgBox Sheet4

End Sub

Запустите это, и окно сообщения должно появиться правильно.

Теперь добавьте четвертый рабочий лист в книгу, который создаст объект Sheet4 . Попробуйте запустить main еще раз, и на этот раз вы получите ошибку «Объект не поддерживает это свойство или метод»

0
ответ дан 30 November 2019 в 07:28
поделиться

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

Если это проблема, использование ActiveWorkbook (текущая активная книга) или ThisWorkbook (книга, содержащая макрос) должно решить ее.

Например,

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet")
3
ответ дан 30 November 2019 в 07:28
поделиться

Фактически объект / кодовое имя "Лист1" можно изменить. В VBA щелкните Sheet1 в списке объектов Excel. В окне свойств вы можете изменить Sheet1 на rng.

Затем вы можете ссылаться на rng как на глобальный объект без предварительного создания переменной. Так что debug.print rng.name работает нормально. Больше нет рабочих листов ("rng"). Name.

В отличие от вкладки, имя объекта имеет те же ограничения, что и другие переменные (т.е. без пробелов).

3
ответ дан 30 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: