Не может ли Ctrl + Z (отменить) с ComboBox, ссылаясь на динамический список с именованным диапазоном, переименовать в массив? Как? - PullRequest
0 голосов
/ 08 мая 2019

У меня есть ComboBox, список которого относится к именованному диапазону, который создает динамический список на основе совпадений со связанным текстом в ComboBox (связан с ячейкой).Список имеет длину количества совпадений, ComboBox имеет ComboBox_Change, чтобы обновить его.

Теперь моя проблема в том, что я не могу ничего Ctrl + Z в документе, и это делает его довольно трудным для работы.Раньше у меня также возникала проблема со списком тригерринов при любых изменениях на листе, но, похоже, это прекратилось, поскольку я изменил именованный диапазон «зона» на его лист вместо всего Excel (даже странно, даже на его собственном листе).Ячейки, используемые в именованном диапазоне, ссылаются на другой лист.

Вчера я видел ссылку, где кто-то упоминал, что это происходит, потому что каждое изменение обновляет поле, и список должен быть "кэширован" как массив ( Почему событие изменения списка выпадающих списков (Excel VBA) срабатывает при каждом обращении к одному из его свойств? ).Как бы я поступил так, если бы длина моего списка постоянно менялась, и я не могу ctrl + shift + ввести 500 ячеек одновременно (это будет работать?)

Вот некоторые коды и формулы.Я внештатный перевод с французского, так что могут быть опечатки формулы.Скажем, Sheet1 - это то место, где находится мой ComboBox.

Формула ячейки, используемая для заполнения именованного списка (я не думаю, что это действительно актуально)

=IFERROR(INDEX(Sheet2!$H$2:$H$501;MATCH(ROWS(Sheet1!$B$1:B1);Sheet1!$B$1:$B$503;0));"")

Мой ComboBox VBA выглядит следующим образом:

Private Sub ComboBox1_Change()
    ComboBox1.ListFillRange = "DropDownList"
    Me.ComboBox1.DropDown
    Range("H1").Value = 1
End Sub

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

Именованный диапазон (динамическая длина), гдеA дает мне 1/0 частичное совпадение с моим «поиском» в ComboBox, B дает мне счетчик того, сколько частичных совпадений я получаю, а C перечисляет значения, заполняющие раскрывающийся список из другой вкладки.

ДонНе думаю, что это полезно, но вот эти форумчане.Нет определенного листа означает Лист1.

A:

=--ISNUMBER(IFERROR(SEARCH(Sheet1!$D$1;Sheet2!H2;1);""))

B:

=IF(A1=1;SUMIF($A$1:A1;1);"")

C:

=Sheet1!$C$1:INDEX(Sheet1!$C$1:$C$503;MAX(Sheet1!$B$1:$B$503);1)

РЕДАКТИРОВАТЬ: В ответ на Ника, дальнейшие разъяснения.Я в основном ищу другой способ написания макроса, чтобы он не выполнялся после каждого изменения рабочего листа, даже если он не влияет на его динамический список.Я забыл упомянуть в главном потоке, но если мой ComboBox пуст (так что ничего не отфильтровано из столбцов от A до C и список имеет «максимальную емкость»), тогда моя Undo работает просто отлично, но как только она появляетсячто-то в ComboBox (или соответствующей ячейке) оттуда я не могу отменить.

1 Ответ

0 голосов
/ 08 мая 2019

Чтобы избежать обновления вашего листа при обращении к свойству списка, вы можете заменить событие combobox_change на combobox_click или, альтернативно, combobox_dropdownclick, который обновляет список в блоке только при нажатии самого блока или нажатии клавиши F4.

Если вы хотите использовать событие worksheet_change, вы можете сделать что-то вроде этого

Worksheet_change (ByVal Target as Range)
 If Not Intersect (Target, Range("your named range"))  Is Nothing Then
   Combobox1.ListfillRange = range("Your named range")

Это обновит комбобокс только в случае изменения целевого диапазона.

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

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