Есть задача - программно присваивать ячейке какой-нибудь уникальный идентификатор, чтобы потом его использовать в различных операциях. Идентификатор должен свободно "висеть" в течение всего времени работы, сохраняться вместе с книгой и не зависеть от изменений значений value ячейки. Это что-то типа атрибута "tag", куда можно писать любой текст, только это для ячейки excel.
Пробовал использовать range.id, но он удаляется, если нажать del. Есть еще вариант range.name, но там любые значения не запишешь. Примечания используются для других целей. Есть всякие варианты сделать номерную серию, присваивать name ячейки номер, по номеру хранить текст где-то в другом месте, но это не вариант, это грустно и громоздко.
Конкретно в моем случае, динамически создается временная таблица, в которой я пишу значения, которые потом сохраняю в другой таблице по параметрам, которые и хотелось бы прописать в идентификаторе ячейки, т.е. там будет некий paramstring или куски SQL-запросов.
В общем, что-то типа cell custom properties.
Если у кого-то есть мысли, было бы здорово. ))
Всем привет!
Есть задача - программно присваивать ячейке какой-нибудь уникальный идентификатор, чтобы потом его использовать в различных операциях. Идентификатор должен свободно "висеть" в течение всего времени работы, сохраняться вместе с книгой и не зависеть от изменений значений value ячейки. Это что-то типа атрибута "tag", куда можно писать любой текст, только это для ячейки excel.
Пробовал использовать range.id, но он удаляется, если нажать del. Есть еще вариант range.name, но там любые значения не запишешь. Примечания используются для других целей. Есть всякие варианты сделать номерную серию, присваивать name ячейки номер, по номеру хранить текст где-то в другом месте, но это не вариант, это грустно и громоздко.
Конкретно в моем случае, динамически создается временная таблица, в которой я пишу значения, которые потом сохраняю в другой таблице по параметрам, которые и хотелось бы прописать в идентификаторе ячейки, т.е. там будет некий paramstring или куски SQL-запросов.
В общем, что-то типа cell custom properties.
Если у кого-то есть мысли, было бы здорово. ))Gamma754
Сообщение отредактировал Gamma754 - Пятница, 11.04.2014, 23:47
Словарь адресов ячеек (можно с книгой/листом), адресу в item пишем что угодно, хоть другой словарь. Правда вот "сохраняться вместе с книгой" словарь словарей будет затруднительно сделать, да и вообще придётся его на скрытый лист перед сохранением выгружать, а при открытии оттуда считывать.
Словарь адресов ячеек (можно с книгой/листом), адресу в item пишем что угодно, хоть другой словарь. Правда вот "сохраняться вместе с книгой" словарь словарей будет затруднительно сделать, да и вообще придётся его на скрытый лист перед сохранением выгружать, а при открытии оттуда считывать.Hugo
Есть еще вариант range.name, но там любые значения не запишешь. Примечания используются для других целей. Есть всякие варианты сделать номерную серию, присваивать name ячейки номер, по номеру хранить текст где-то в другом месте, но это не вариант, это грустно и громоздко.
Почему грустно? Почему громоздко? Я как раз за подобный алгоритм: 1. На основном листе генерируем для ячейки имя - Range.Name. 2. Это Name прописываем на другой лист (можно скрытый) в ячейку колонки A. 3. Начиная с колонки B можем писать на этом другом листе хоть по 32767 символов в каждую ячейку. Всё это будут комментарии, теги, кастом пропертис к нашему священному Name. Т.е. фактически это означает создание справочника именованных ячеек на отдельном листе.
По поводу "грусти и громоздкости". Строка для определенного Name на другом листе легко находится при помощи функции ПОИСКПОЗ или программно при помощи ее аналога WorksheetFunction.Match. Не громоздче, чем доставать инфу из примечания к ячейке.
По поводу скорости обработки. Известно, что диапазон ячеек листа считывается в массив одной операци присваивания: array = Range("A1..."). А дальше в массиве, как я недавно и не без удовольствия обнаружил, работают все полезные функции поиска из семейства WorksheetFunction: Match, Index, Lookup и др. Т.е. программирование всего этого хозяйства обещает быть вполне комфортным.
Есть еще вариант range.name, но там любые значения не запишешь. Примечания используются для других целей. Есть всякие варианты сделать номерную серию, присваивать name ячейки номер, по номеру хранить текст где-то в другом месте, но это не вариант, это грустно и громоздко.
Почему грустно? Почему громоздко? Я как раз за подобный алгоритм: 1. На основном листе генерируем для ячейки имя - Range.Name. 2. Это Name прописываем на другой лист (можно скрытый) в ячейку колонки A. 3. Начиная с колонки B можем писать на этом другом листе хоть по 32767 символов в каждую ячейку. Всё это будут комментарии, теги, кастом пропертис к нашему священному Name. Т.е. фактически это означает создание справочника именованных ячеек на отдельном листе.
По поводу "грусти и громоздкости". Строка для определенного Name на другом листе легко находится при помощи функции ПОИСКПОЗ или программно при помощи ее аналога WorksheetFunction.Match. Не громоздче, чем доставать инфу из примечания к ячейке.
По поводу скорости обработки. Известно, что диапазон ячеек листа считывается в массив одной операци присваивания: array = Range("A1..."). А дальше в массиве, как я недавно и не без удовольствия обнаружил, работают все полезные функции поиска из семейства WorksheetFunction: Match, Index, Lookup и др. Т.е. программирование всего этого хозяйства обещает быть вполне комфортным.Gustav
Решение нашлось. Оказывается, range.name - это объект (к моему большом удивлению), и там есть свойство comment, куда можно писать все. Это string, 255 симв., но мне хватит.
Т.к. мне для каждой ячейки, к которой надо хранить properties, нужно "содержать" 1 строку на скрытом листе. Т.е. надо создавать механизм ее создания, редактирования, удаления. К тому же, каждый раз при создании рабочего листа придется заботится о том, чтобы генерить те же самые имена, что и в прошлый раз (или читать их с листа).
Я проправлюсь, эта схема громоздкая в моем случае. А так она, по меньшей мере, рабочая, и, бы даже сказал, классическая, и за нее респект )).
(лирическая приписка) А так вообще я за то, чтобы хранить только исходные табличные данные (в виде plain tables), а все "Простыни" для работы генерить динамически, вместе с формулами и всем прочим. Это удобно - представьте, что мне надо вести учет по 30 товарным позициям в течение 6 мес. по 4м поставщикам. Отслеживать, там, общий процент поставки, делать заказы и т.п. Если я буду руками рисовать эту простыню - ошибки неизбежны. Т.е. все рабочие простыни генерятся автоматически,а введенные в них значения - сохраняются.
Решение нашлось. Оказывается, range.name - это объект (к моему большом удивлению), и там есть свойство comment, куда можно писать все. Это string, 255 симв., но мне хватит.
Т.к. мне для каждой ячейки, к которой надо хранить properties, нужно "содержать" 1 строку на скрытом листе. Т.е. надо создавать механизм ее создания, редактирования, удаления. К тому же, каждый раз при создании рабочего листа придется заботится о том, чтобы генерить те же самые имена, что и в прошлый раз (или читать их с листа).
Я проправлюсь, эта схема громоздкая в моем случае. А так она, по меньшей мере, рабочая, и, бы даже сказал, классическая, и за нее респект )).
(лирическая приписка) А так вообще я за то, чтобы хранить только исходные табличные данные (в виде plain tables), а все "Простыни" для работы генерить динамически, вместе с формулами и всем прочим. Это удобно - представьте, что мне надо вести учет по 30 товарным позициям в течение 6 мес. по 4м поставщикам. Отслеживать, там, общий процент поставки, делать заказы и т.п. Если я буду руками рисовать эту простыню - ошибки неизбежны. Т.е. все рабочие простыни генерятся автоматически,а введенные в них значения - сохраняются. Gamma754
(Продолжая лирику последнего сообщения). Вообще, чем дальше я пишу, тем больше хочется изобрести для экселя что-то типа jquery. Вообще, странно, что этого еще не изобрели. Такие массивы данных - и нет языка развитого языка запросов. Кгм, действительно странно.
легко делается вообще без программирования, сводными таблицами
. Ну, не знаю. (продолжая мысль) Вообще, я сталкиваюсь в экселе с как полнейшим концептуальным отсутствие такой штуки, как теги. Без всяких доп. наворотов типа массивов данных на других листах и т.п., в которых рано или поздно запутываешься. Просто нет тегов, которыми можно как-то манипулировать. Приходится давать диапазонам имена, хранить в переменных адреса ячеек с опред. признаками, или прибегать к цветовой \ текстовой разметке на листе, чтобы потом, например, поместить в эти ячейки формулу, собранную из каких-то других, заранее размеченных ячеек по опред. критериям. И все это делается, фактически, переборами диапазонов. Бррр.
(Продолжая лирику последнего сообщения). Вообще, чем дальше я пишу, тем больше хочется изобрести для экселя что-то типа jquery. Вообще, странно, что этого еще не изобрели. Такие массивы данных - и нет языка развитого языка запросов. Кгм, действительно странно.
легко делается вообще без программирования, сводными таблицами
. Ну, не знаю. (продолжая мысль) Вообще, я сталкиваюсь в экселе с как полнейшим концептуальным отсутствие такой штуки, как теги. Без всяких доп. наворотов типа массивов данных на других листах и т.п., в которых рано или поздно запутываешься. Просто нет тегов, которыми можно как-то манипулировать. Приходится давать диапазонам имена, хранить в переменных адреса ячеек с опред. признаками, или прибегать к цветовой \ текстовой разметке на листе, чтобы потом, например, поместить в эти ячейки формулу, собранную из каких-то других, заранее размеченных ячеек по опред. критериям. И все это делается, фактически, переборами диапазонов. Бррр. Gamma754
Сообщение отредактировал Gamma754 - Понедельник, 21.04.2014, 23:25