在Excel VBA中,可以使用以下函数定义单元格验证:
myRange.Validation.add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= xlBetween, Formula1:=myListString
如果myListString
超过255个字符,Excel会在打开文件时报告错误,并尝试在没有简明信息的情况下“修复”文件。在修复期间删除所有验证,图表,按钮和形状,之后文件不是很有用。
有没有办法手动修复.xlsx文件?
答案 0 :(得分:1)
谢谢你,Ron Rosenfeld的讨论和提示。
在list-type的Excel验证中,保存范围名称或范围地址的字符串不得超过255个字符。
手动无法定义更长的字符串。但是,在VBA中,属性formula1
的字符串长度不受限制。
具有此类超长验证的工作簿可以以任何格式存储而不会出现任何问题。
重新打开它们时,旧的Excel 2003格式(*.xls
)只显示空列表而不是overlength-validation-string。较新的格式(*.xlsx
,*.xlsm
和*.xlsb
)报告为损坏,并且通过丢弃许多项目进行严格修复,如问题中所述。
可以通过将其内容解压缩到目录并编辑sheetn.xml文件来修复损坏的*.xlsx
,*.xlsm
文件。可以编辑和缩短验证字符串。我使用7zip解压缩文件内容,使用notepad ++来打印xml并编辑它,然后使用7zip重新压缩文件。
未压缩文件xl\worksheets\sheet1.xml
中的验证可能如下所示:
<dataValidations count="1">
<dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="A1">
<formula1>"C16 (S7),C24 (S10),C30 (S13),C35,C40,D30,D35,D40,D50,D60,D70,GL24h (BS11),GL24c,GL28h (BS14),GL28c,GL32h (BS16),GL32c,GL36h (alt),GL36c (alt),C20,GL20h,GL20c,GL22h,GL22c,GL26h,GL26c,GL30h,GL30c,GLT24,GLT30"</formula1>
</dataValidation>
</dataValidations>
减少<formula1>
- 标记的长度,重新压缩所有文件,您可以毫无困难地打开文件。
答案 1 :(得分:0)
选项:
我喜欢验证作为组合框的替换,因为它们不需要任何 active-X 组件,也不需要额外的 form-elements 。
但是,我建立了一个电子表格系统,其中一个 AddIn 从中央数据库获取列表条目。该列表设置为所有验证。然后使用用户定义的函数来获取与验证单元格中的选择相对应的值。
我没有在Workbook_Open
上动态填充验证字符串,而是改为使用命名范围的方法。
Addin有一个命名范围(比如AddinList
),它使用用户定义的矩阵-VBA函数获取其内容,将列表作为数组返回(比如说public function myList() as variant
)。
在任何消费者工作簿中,定义了另一个名称,指的是外部地址名称(例如consumerList=addin.xla!AddinList
)。
最后,消费者工作簿中的任何验证都被定义为可能包含任何=consumerList
条目的列表。
唯一的要求是,如果消费者工作簿链接到插件,那么插件文件是打开的,无论如何都是如此。