在 Excel VBA 中,可以使用以下函数定义单元格验证:
myRange.Validation.add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= xlBetween, Formula1:=myListString
如果
myListString
长度超过 255 个字符,Excel 在打开文件时会报告错误,并在没有简洁信息的情况下尝试“修复”文件。所有验证、图表、按钮和形状在重新修复期间都会被删除,并且该文件之后不再真正有用。
有没有办法手动修复.xlsx文件?
谢谢 Ron Rosenfeld 的讨论和提示。
在列表类型的 Excel 验证中,包含范围名称或范围地址的字符串不得超过 255 个字符。 无法手动定义更长的字符串。然而,在 VBA 中,属性
formula1
的字符串长度不受限制。
具有此类超长验证的工作簿可以以任何格式存储而不会出现任何问题。
重新打开它们时,旧的 Excel 2003 格式 (
*.xls
) 仅显示空列表,而不是超长验证字符串。较新的格式(*.xlsx
、*.xlsm
和*.xlsb
)被报告已损坏,并通过删除许多项目进行粗暴修复,如问题中所述。
可以通过将损坏的
*.xlsx
、*.xlsm
文件内容解压到目录并编辑sheetn.xml 文件来修复它们。可以在那里编辑和缩短验证字符串。我使用 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>
标签的长度,重新压缩所有文件,您就可以顺利打开文件了。
选项:
我喜欢验证作为组合框的替代品,因为它们不需要任何 active-X 组件,也不需要额外的 form-elements。
但是,我建立了一个带有中央 AddIn 的电子表格系统,该系统从中央数据库获取列表条目。该列表设置为所有验证。然后使用用户定义的函数来获取与验证单元格中的选择相对应的值。
我没有在
Workbook_Open
上动态填充验证字符串,而是改为使用命名范围的方法。
插件有一个命名范围(比如
AddinList
),它使用用户定义的矩阵 VBA 函数获取其内容,并将列表作为数组返回(比如 public function myList() as variant
)。
在任何消费者工作簿中,都会参考外部插件名称定义另一个名称(例如
consumerList=addin.xla!AddinList
)。
最后,消费者工作簿中的任何验证都被定义为可能包含任何 =consumerList
条目的列表。
唯一的要求是,插件文件是打开的,如果消费者工作簿链接到插件,无论如何都是这样。
我也有同样的 xlsx 损坏问题。最后我知道了,谢谢你,这就是原因:通过 VBA 出现一个很长的 Formula1 验证问题。
问题是,我对公式有另一种方法,即使用 OFFSET 函数动态获取列表,即:
"=OFFSET(塔布拉斯!$G$2:$G$66,0,0,塔布拉斯!$AU$2)"
为了从列的第一个非空白单元格中获取列表。但这种方法会产生运行 VBA 错误。我尝试删除“=”,引用公式等。当我没有收到错误时,公式不起作用,只是文本......(无论我做什么改变,总是错误)
所以,我决定之前在变量(datosString)中构建列表 .添加类型:=xlValidateList,AlertStyle:=xlValidAlertStop,运算符:=xlBetween,Formula1:=datosString
然后我打开xlsx时得到了损坏的文件。
我将尝试从您的评论中产生的新想法,以使其发挥作用。 乔治