注意:这不是常规的“数据验证如何工作”的帖子,所以请忍受。
我正在尝试对表中的列进行动态级联数据验证-即让每个单元格例如D列具有一系列(数据验证列表下拉)选项,用户选择其中一个,然后E列旁边的单元格显示所有可能的相关选项(使用D列中的选择作为查找从某些查找表中查找键),用户也可以选择其中之一,等等。
我知道如何使用公式来创建级联选项列表,从而使用命名范围等设置此类级联数据验证。但是,这些依赖于用于输入可用选项的每个输入单元格的预先配置的已知命名范围或表,因此仅适用于单个(或完整的)输入单元格,而不适用于整个表列中的所有输入单元格需要能够扩展(添加行等)。
我已经尝试过在每个下拉列表前加一列,以显示该行上的适用选项(使用公式-可以正常工作,但需要显示多个x选项时,可以使用大小除外),但这是唯一真正的用户友好方式解决方案是只过滤实际下拉列表中的选项。
我可以在每个下拉列中保留x个帮助器列,以存储这些列表的所有可用选项(x是我希望所有组合的列表都可以使用的最大选项数量),并使用一些RANK公式来提取连续范围内的所有可能选项,然后使用公式来确定要在下拉列表的公式中使用多少列。但是,其中一些列表很长,我要在表中添加多个这样的结构,因此这将很快成为性能上的大麻烦。我已经在此表中使用了多达400列(其中包含许多复杂的公式),而Excel已经开始抱怨它了;为这些怪物帮助程序查找列添加额外的几百个选项是不可能的。
因此,我已经放弃使用纯公式,而去了可信赖的旧VBA。我已经有一个运行良好的系统,其中:
当一切都很好并且完成后,我对结果感到非常满意,我用所有可能的选项替换了配置中的测试数据,并且保存后文档刚刚被破坏。在打开恢复后,某些下拉列表现在将“ N / A”作为其下拉列表配置。在对工作表的XML进行一些挖掘之后(您一定喜欢这个.xlsm zip文件结构而不是.xls),我发现这些硬编码的下拉列表限制为最多255个字符……这使该选项对我立即无用。 >
我可以使用隐藏的帮助程序选项列2.0;现在,我不需要其中的复杂查找公式,但可以让VBA在其中列出所有可用的选项,然后让下拉公式基于所用的列范围。但是就像我说的那样,我已经在表的大小上给Excel施加了足够的压力,因此添加几百个列确实不是一个选择,无论它们多么简单。我还可以为每个下拉列提供一个单独的“便笺式”工作表,然后让VBA在其中写入选项(工作表X代表下拉列X,在工作表X的第2行中为单元格X2编写选项),但这仅仅是太难看了,我现在无法接受。
另一个选择是放弃Excel的下拉验证列表,并用Forms或ActiveX组合框控件动态覆盖它们(单元格选择事件= VBA在其上覆盖组合框控件,调整其可用选项,将其链接单元格设置为源表单元格,并将重点放在该位置)。无论如何,它们在用户友好性上都非常优越并且看起来很完美,但是我已经在过去几年中开发的另一个广泛的Excel应用程序中使用了这样的系统,并且它仅引起奇怪的间歇性Excel挂断,崩溃和文件损坏,此后我不得不取消系统并再次恢复为常规数据验证。
最后一个选择是添加一个VBA数据输入用户表单,如果用户例如试图更改这些值,但是为什么要首先放置一个Excel表呢……那么我最好还是在.Net等程序中为其制作一个常规的Windows应用程序。
任何其他开箱即用选项的见解都将受到高度赞赏! (悉达思,你在吗?:))
似乎没有令人满意的选择,因此我创建了一个复杂的VBA解决方案。万一其他人也需要添加这样的解决方案,我在下面添加了一般设计(没有代码,因为在这里列出的内容太多了);
总而言之,这是一个很好的解决方案,但是很可惜,我想知道一旦将文件实际用于表中并添加了许多行,它将如何执行...
然后,我发现对表的行进行排序时,数据进行了很好的排序,但是现在唯一的数据验证公式并不遵循数据...并且也不会触发Change事件来纠正任何内容。 ..以及从缓存工作表返回到表中的单元格引用也不会遵循它们所代表的单元格...谢谢Microsoft !!!
因此设计现在已更新为:
=INDIRECT(<cell before this column>)
。使用这个易变的公式,结果是Excel要求即使有人仅暗示触摸这些下拉列表,也要保存更改...
一定喜欢那个Excel。
答案 0 :(得分:0)
哈哈,每次阅读时想到的东西,都会在下面两句话中读到。因此,如果您考虑所有规则,则硬编码的下拉列表是您的最佳解决方案。我曾经遇到过这种情况,并且使用了硬编码的下拉列表和范围的组合。我检查了硬编码的字符串是否大于255个字符,并且在发生这种情况时,我将这些值放在一个单独的工作表中的某个范围中,并在其中引用。如果您只有几个下拉菜单,其中字符串太大,那么我认为这将使它尽可能轻。