0

我有一个 ComboBox,其列表引用了一个命名范围,该范围根据与 ComboBox 的链接文本(与单元格链接)的匹配创建一个动态列表。列表有匹配数量的长度,ComboBox 有一个 ComboBox_Change 来刷新它。

现在我的问题是,我不能 Ctrl+Z 文档中的任何内容,这使得它很难使用。我曾经也有一个列表trigerrin的问题与工作表中的任何更改,但这似乎已经停止,因为我将命名范围“区域”更改为它的工作表而不是整个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

Range("H1") 与此无关,它是重置计数,以便我的“下一个”和“上一个”图片查找按钮重置。

命名范围(动态长度),其中 A 给我 1/0 部分匹配我在组合框中的“搜索”,B 给我我得到多少部分匹配的计数,C 列出填充另一个选项卡的下拉列表的值.

不要认为它有帮助,但这里是那些论坛。没有确定的工作表意味着 Sheet1。

A :

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

乙:

=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(或匹配的单元格)中的某些内容无法使用撤消。

4

1 回答 1

0

为了避免在引用列表属性时更新工作表,您可以将combobox_change事件替换为combobox_clickcombobox_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 代码后您无法撤消,我不建议您尝试创建自定义撤消方法。我只是复制工作表并使用该副本进行修补。

于 2019-05-08T15:18:50.470 回答