我有一个ComboBox,它的列表引用了一个命名范围,该范围基于与链接到ComboBox的文本(链接到一个单元格)的匹配来创建动态列表。该列表具有匹配量的长度,ComboBox具有刷新它的ComboBox_Change。
现在我的问题是,我不能Ctrl+Z文档中的任何东西,这使得它很难使用。我曾经在工作表中的任何更改都会触发列表的问题,但自从我将命名范围"zone“更改为它的工作表而不是整个Excel (甚至奇怪地在它自己的工作表中)后,这个问题似乎已经停止了。命名区域中使用的单元格确实引用了另一个工作表。
我昨天看到了一个链接,其中有人提到会发生这种情况,因为每次更改都会刷新框,列表应该被“缓存”为数组(Why is a (Excel VBA) combobox change event triggering every time one of its properties is referenced?)。如果我的列表长度一直在变化,而且我不能一次ctrl+shift+enter 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给出我在ComboBox中“搜索”的1/0部分匹配,B给出我得到的部分匹配的数量,C列出从其他选项卡填充下拉列表的值。
我不认为这是有帮助的,但这里是这些论坛。No determined表示Sheet1。
答:
=--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)编辑:回应Nick,进一步澄清。我基本上是在寻找一种不同的方式来编写宏,这样它就不会在每个工作表更改后执行,即使那些不影响它的动态列表的更改也是如此。我忘了在主线程中提到,但是如果我的ComboBox是空的(所以从A列到C列没有过滤出任何东西,列表是“最大容量”),那么我的撤销工作很好,但是一旦在ComboBox (或匹配的单元格)中有一些东西,我就不能使用撤销。
发布于 2019-05-08 23:18:50
为了避免在引用list属性时更新工作表,可以将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代码后撤消,并且我不建议尝试创建自定义撤消方法。我只需要拷贝一张纸,然后用那份拷贝来修补。
https://stackoverflow.com/questions/56042944
复制相似问题