Excel VBA 表单的命名范围不断变化

Excel VBA Named Range for Form Keeps Changing

我在 VBA 中创建了一个用户窗体,您可以在其中添加和删除记录,并且我正在使用命名范围来刷新显示源中数据的列表框。我遇到的问题 运行 是命名范围在我每次删除记录时都在递减。我 运行 遇到的主要问题是,如果第一行数据 ($A$2) 中的记录被删除,它会改变

我希望它保留的内容,这样当它从 A2 中删除记录时就不会出错: =OFFSET('Carrier List'!$A$2,0,0,COUNTA('Carrier List'!$A$1:$A$1000),11)

A2中删除一条记录后的变化: =OFFSET('Carrier List'!#REF!,0,0,COUNTA('Carrier List'!$A$1:$A$999),11)

我在几个函数中调用这个范围,即打开表单时、添加记录时、编辑记录时以及删除记录时。它只会在记录被删除时引起问题,但当发生这种情况时,它几乎会使应用程序陷入困境。

VBA我正在使用

打开表单时:

私人订阅 UserForm_Initialize()

Me.lstbxCurrCarrierLst.RowSource = "运营商列表"

结束子

对于添加、编辑、删除功能:

Me.lstbxCurrCarrierLst.RowSource = "运营商列表"

那么,有没有一种方法可以锁定字段范围以使其不发生变化,或者是否有另一种方法可以设置 RowSource 以使其在数据集发生变化时保持不变?

考虑在范围名称定义中使用 Index() 而不是 Offset()。使用 Index() 您可以指向第 2 行,您无需担心删除第 2 行。

第一个索引指向 A 列中的第 2 行,第二个索引使用由 CountA 函数标识的行。冒号运算符将两个单元格连接成一个范围。

=Index('Carrier List'!$A:$A,2):Index('Carrier List'!$A:$A,COUNTA('Carrier List'!$A:$A00))

编辑:我错过了原来的命名范围是 11 列宽,即从 A 列开始并延伸到 K 列。要在命名范围公式中执行此操作,只需将第二个 Index() 更改为在 K 列中工作,但保留 A 列中的 CountA。

=Index('Carrier List'!$A:$A,2):Index('Carrier List'!$K:$K,COUNTA('Carrier List'!$A:$A00))