Каков наилучший способ хранения настроек для каждого листа? - PullRequest
2 голосов
/ 13 февраля 2012

Мне нужно временно сохранить настройки моего макроса для каждого листа.Я думал о расширении свойств активного листа для хранения настроек там.Целью было бы прочитать свойство, например ActiveSheet.Setting1.Я пытался обернуть объект ActiveSheet в класс:

модуль класса "cCustomSheet":

Public WithEvents WS As Worksheet
Public Setting1 As String

модуль "Module1":

Dim ActiveWS As cCustomSheet
Sub test1()
    Set ActiveWS = New cCustomSheet
    Set ActiveWS.WS = ActiveSheet
End Sub
Sub test2()
    MsgBox ActiveWS.WS.Name
End Sub

Этот код работаетбез ошибок, но ActiveWS следует обновить до нового активного листа, если пользователь активирует другой лист, а это не так.Если я удаляю ключевое слово Set из строки Set ActiveWS.WS = ActiveSheet, я получаю следующую ошибку:

Ошибка № 91: переменная объекта или переменная блока не установлена ​​

Как мне это сделать, и возможно ли это вообще?

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

Заранее спасибо.

Обновление : я должен добавить, что мой макрос будет сохранен как Excel Addпоэтому у меня не будет доступа к коду рабочих книг пользователей.Я не могу использовать событие Worksheet_Activate () для отслеживания активного листа.Кроме того, параметры настройки предпочтительно будут потеряны или сброшены на значения по умолчанию при повторном открытии книги, поэтому я не могу сохранить их в файле пользователя (например, на скрытом листе).

Ответы [ 4 ]

4 голосов
/ 13 февраля 2012

Чтобы вы могли хотя бы частично пройти туда:

В Module1 просто введите строку:

Public ActiveWS As cCustomSheet

Обратите внимание, что теперь она объявлена ​​как Public.

ВМодуль ThisWorkbook попробует этот код:

Private Sub Workbook_Open()
Set ActiveWS = New cCustomSheet
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Set ActiveWS.WS = ActiveSheet
With ActiveWS
     Debug.Print .WS.Name
    .Setting1 = "something important about this sheet"
End With
End Sub

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

РЕДАКТИРОВАТЬ: В более общем ответе на ваш вопрос я склонен хранить настройкив именах листов, которые при желании могут быть полностью скрыты от пользователей.Это может быть хорошим способом, особенно если вам нужно, чтобы настройки сохранялись между моментами открытия рабочей книги.

0 голосов
/ 19 февраля 2012

Спасибо всем за ваши предложения.Они помогли мне найти способ сохранить мои настройки для каждого листа.Я использовал ActiveWorkbook.CustomDocumentProperties, чтобы назначить случайный идентификатор активной книге.Каждый рабочий лист идентифицируется путем объединения идентификатора рабочей книги и кодового имени листа (которое уникально внутри рабочей книги).Параметры активной рабочей таблицы добавляются в коллекцию, где идентификатор листа служит индексом, поэтому их можно легко получить.

Это не на 100% безопасно, поскольку две книги могут гипотетически получить один и тот же идентификатор,так как это случайное числоИдентификатор рабочей книги также сохраняется в файле Excel.Он становится бесполезным после закрытия рабочей книги, но «загрязняет» список пользовательских свойств файла.

Мне также нужно было сохранить адрес столбца, содержащего значения, к которым применяется мой макрос.Это устанавливается пользователем.Вместо того, чтобы хранить абсолютный адрес диапазона, я использую свойство .ID первой ячейки столбца.Таким образом, если пользователь перемещает ячейки, идентификатор придерживается значений.Недостатком является то, что мне приходится циклически проходить по каждой ячейке первой строки выделения, чтобы проверить, содержит ли ячейка значение .ID, что довольно неэлегантно.Свойство .ID исчезает после повторного открытия книги, что мне подходит, потому что я не хотел, чтобы настройки были постоянными.

0 голосов
/ 13 февраля 2012

Поскольку ваш макрос находится в надстройке Excel, вы можете хранить информацию в листах этого надстройки, которые не отображаются.Вы даже можете сделать этот лист «очень скрытым», если хотите убедиться, что никто не скрывает его по ошибке.Например, вы можете присвоить Sheet1 вашего надстройки «Параметры» и сохранить в каждой строке имя книги в столбце A и параметр в столбце B.

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

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

0 голосов
/ 13 февраля 2012

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

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

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