2012-02-12 2 views
2

Мне нужно временно сохранить настройки моего макроса для каждого рабочего листа. Я думал о расширении свойств активного листа, чтобы сохранить настройки там. Целью было бы прочитать свойство, такое как 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, я получаю следующее сообщение об ошибке:

Error n° 91: Object variable or With block variable not set

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

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

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

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

ответ

0

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

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

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

4

Чтобы получить Вас, по крайней мере, часть пути туда:

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

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

+0

Спасибо за это предложение. Однако мой макрос хранится в надстройке Excel, что означает, что он будет использоваться в других книгах. Я не могу коснуться кода книги, на которой он будет использоваться. Кроме того, пользователи, вероятно, будут работать с несколькими листами одновременно, а это значит, что мой макрос будет поддерживать свои настройки для каждого из листов одновременно. Если я сохраню листы в коллекции, как отслеживать, что это? Мне, вероятно, придется полагаться на номера индексов или имена листов, которые я не хотел в первую очередь. Например, если лист переименовывается, он должен сохранять свои настройки. – Cutter

+2

Ответ на отслеживание заключается в использовании кодовых имен листов, по крайней мере предполагая, что вы создали или имеете доступ к исходным версиям книг, на которых они будут работать. К счастью, я просто написал сообщение об этом в своем новом блоге по адресу: http://yoursumbuddy.com/using-worksheet-codenames-in-other-workbooks/. Кроме того, если вы посмотрите на первый пост, есть пример добавления списков в коллекцию, немного другого, но это может помочь. До сих пор все это проблемы. –

+0

Я также должен добавить, что я предпочел бы, чтобы настройки не были постоянными. Пользователь может сохранить свою книгу и отправить ее кому-то еще, и мой макрос будет вести себя с предпочтениями предыдущего пользователя, что может сбить с толку. – Cutter

0

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

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

0

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

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

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

Смежные вопросы