Как получить предыдущий выбор при изменении выбора?

Я работаю над диалоговым окном импорта (из Excel), чтобы выбрать диапазоны ячеек.

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

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

OnSelectionChange()
 {
 if (m_PrevSelection)
    UnHilite(m_PrevSelection);
 HiliteCurrentSelection();
 GetSelectedRange(m_PrevSelection);
}

Я предполагаю, что просто удержание этого диапазона (полученного из _Application :: Selection) без его освобождения вызовет всевозможные проблемы. Я не нашел способа скопировать диапазон (IRange Copy просто копирует содержимое ячейки из одного диапазона в другой).

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


person Steve    schedule 31.10.2008    source источник


Ответы (3)


Если бы вы работали в Excel VBA, вы могли бы

Set Rng = Application.Selection

где Rng - это объект диапазона Excel. Я полагаю, вы могли бы воспроизвести этот объект там, где вы находитесь.

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

К сожалению, в Excel не хранится история выбора.

person dbb    schedule 31.10.2008

Если вы не ожидаете, что диапазон переместится или изменится в размере, я сохраню адрес, а затем использую Range (myAddress), чтобы вернуть объект диапазона для выделения.

Ссылка на адрес всегда будет относиться к фиксированной области листа, тогда как диапазон будет обновлен для отражения вставок / удалений ячеек. Любой из них может соответствовать вашим намерениям, но учтите, что ссылка на диапазон может стать неопределенной, если ячейки, которые она содержит, будут удалены.

person Hobbo    schedule 31.10.2008

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

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

person JTeagle    schedule 31.10.2008