Есть ли базовый класс для листов - PullRequest
1 голос
/ 13 июня 2019

Я написал базовую процедуру, которая выполняет некоторые операции форматирования страницы (устанавливает верхние и нижние колонтитулы и так далее). Эта подпрограмма имеет лист в качестве первого параметра:

Sub FormatSheet(Optional ws As Worksheet = Nothing, _
            Optional language As String = "Deutsch", _
            ...)

Все работало нормально, до сегодняшнего дня у кого-то была книга с листом Chart. Поскольку вы можете установить все свойства и для такого листа, я сказал себе «хорошо, нет проблем, я изменю тип параметра на Sheet вместо Worksheet - проблема решена . Однако Я не смог найти такой класс Sheet.

Мой обходной путь - изменить тип параметра на Object - это работает. Однако мне не очень нравится эта попытка, поскольку объект может быть чем угодно, и я хочу явно разрешить только - uuhm Sheets . Конечно, я могу решить эту проблему, проверив тип объекта и еще много чего, но мой основной вопрос: есть ли какой-либо «родительский» тип класса в Excel / VBA для какого-либо листа?

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

Нет, потому что в этом нет необходимости.

Если целью FormatSheet является настройка PageSetup листа, то вместо целого Worksheet.

принимается аргумент PageSetup.

Класс Chart, как и Worksheet, имеет свойство PageSetup типа PageSetup.

c.f. Принцип наименьшего знания / Закон Деметры : дайте процедуру настолько мало, сколько нужно для выполнения своей работы. Вам не нужен целый Worksheet для настройки PageSetup.

2 голосов
/ 13 июня 2019

К сожалению, в иерархии Excel.Chart и Excel.Workhseet нет общего объекта. Таким образом, принимая параметр, вы должны будете принять его как объект в подписях. Но если вам действительно не нравится универсальный объект в вашем коде, вы можете добавить сегмент, который будет классифицировать входной объект либо на листе, либо на диаграмме.

Sub FormatSheet(Optional obj As Object = Nothing, _
            Optional language As String = "Deutsch", ...)

    Select Case TypeName(obj)
        Case "Worksheet"
            Dim ws As Worksheet

        Case "Chart"
            Dim cht As Chart

        Case Else

    End Select
    Set ws = obj '//work with this throughout your code.


End Sub

Вы хотите убедиться, что все, что ваш код делает с объектом ws, действительно для диаграмм и рабочих таблиц. В противном случае вам нужно обрабатывать каждый случай в логической ветви.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...