Приветствую всех. Помогите правильно использовать словарь (коллекцию) для решения одной задачи (насколько я понимаю их использование в моем случае оптимальный вариант). На листе есть диапазон из двух колонок. В одной колонке список значений (пусть это будет список листов в книге), в другой метка, обозначающая что элемент выбран (пусть будет звездочка). Как сделать так, чтобы при добавлении макросом нового значения (оно будет "влезать" между имеющимися) соответствие между меткой и значением имеющихся данных не сбивалось?
На примере будет понятнее.
Словари (коллекции) недавно начал осваивать, поэтому у самого это сделать к сожалению не получилось.
Постараюсь объяснить. У меня есть проект с большим количество листов, модулей и процедур. Он пока полностью не готов, но работать пользователям с ним уже можно. При передаче пользователю каждый раз определенное количество листов и модулей мне необходимо удалять, так как они временные. На отдельных листах макросом формируется их список в котором я выделяю (помечаю меткой слева от названия) те листы (модули, процедуры), которые подлежат удалению и по нажатию на одну кнопку разом делаю это. Проблема в том, что список этих объектов постоянно меняется, добавляются одни листы, удаляются или изменяются названия процедур и модулей. Проект ведь еще не готов полностью и много временных объектов. И в списке приходится заново проставлять метки для выделения удаляемых объектов, так как список изменился (сдвинулся, отсортировался), а метки остались на прежнем месте. В примере я привел только список листов. Например, появляется новый "Лист2" и метки уже сбиваются
Зачем Вы сортируете листы при каждой интерации цикла? Зачем Вы так СЛОЖНО их сортируете? Используйте штатную сортировку и будет Вам счастье Например
Код
Sub Создаем_список_листов()
Range("B2:B5").ClearContents
Dim Sheet As Worksheet, cell As Range
For Each Sheet In ThisWorkbook.Worksheets
Set cell = Worksheets("Лист1").Cells(Sheet.Index + 1, 2)
cell.Formula = Sheet.Name
Next
Call SortSheets
End Sub
Sub SortSheets()
Dim ShName: ShName = ActiveSheet.Name
With ActiveSheet.Sort
With .SortFields
.Clear
.Add key:=Range("B2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
End With
.SetRange Range("A2:B" & Cells(Rows.Count, 2).End(xlUp).row)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Интересный вариант с сортировкой, даже не думал в этом направлении. Но, почему подумал про словарь. Когда страницы не добавляются, а удаляются, то в первой колонке остается метка удаленного листа. Думал, что удаляя из словаря ключ, можно как-то удалить за собой и элемент ему соответствующий или наоборот. Возможно ли это при сортировке, пока не знаю. Удалить сортировкой конечно же нет, после нее имеется ввиду. При повторной сортировке также соответствие слетает.
Почему Вы все время говорите про словарь? В Ваших процедурах на них нет и намека
Цитата
Александр Медведев написал: насколько я понимаю их использование в моем случае оптимальный вариант Александр Медведев написал: При передаче пользователю каждый раз определенное количество листов и модулей мне необходимо удалять, так как они временные.
Зачем Вы вообще ТАК заморачиваетесь? Ну отдайте пользователям на растерзание то, что уже готово, а когда доделаете весь проект, вот тогда и поудаляете все временные листы/макросы/и проч. ОДИН раз З.Ы. Про Словари
Согласие есть продукт при полном непротивлении сторон
В том числе потому что, нашлась задача, решение которой позволило бы мне наконец разобраться с этими способами работы. Всегда откладывал из-за за их относительной сложности и неимением конкретной задачи. С учетом того, что изучил чувствую, что скорее всего можно мой вопрос решим и таким образом. Но как, пока не соображу. Вариантов со словарями было несколько, но я их не стал выкладывать по причине недоделанности, в прямом и переносном смысле. А итоговый вариант появится еще очень не скоро, так как делаю его в свободное от работы время.
Так гораздо нагляднее. Здорово! Забросил я идею решить задачу с помощью словаря, не получилось. Пробую по простому, через VLOOKUP. Похоже все получится.