Excel发现不可读的内容 – 数据validation

我在打开工作簿时填充了一些combobox – 数据源来自数据库。

我使用以下代码使用数据validation填充我的combobox: –

With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=list .IgnoreBlank = False .InCellDropdown = True .ShowInput = True .ShowError = True End With 

其中list是从数据库logging集构build的逗号分隔的string。

这一切工作正常。 稍后重新打开工作簿时会出现问题。 我得到一个错误

“Excel发现不可读的内容。你想恢复这个文件的内容”

你说是和Excel然后给你

“Excel能够通过删除function来修复文件”

而从一些combobox的数据validation已经消失

我怀疑从一些互联网search,我使用我的数据validationstring太长?

我不能将logging集值添加到隐藏工作表,并将数据validation源设置为隐藏工作表上的范围,因为combobox是dynamic的,并且可以根据用户select进行切换和更改。 我真的只需要能够将数据validation设置为我在用户交互中的各个点build立的string。

如果这是一个string太长的情况下可以追加到数据validation或有另一个技巧,我可以用来解决这个问题?

我之前在我的一些Excel项目中操作了validation列表。 将validation设置为“允许:列表”时,可以将数据源设置为工作簿级命名范围。 在这个例子中,我定义了一个命名范围“listrange”:

 With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=listrange" .IgnoreBlank = True .InCellDropdown = True .ShowInput = True .ShowError = True End With 

你永远不会得到该公式string太长的错误。

我把我所有的validation引用的命名范围放在一个工作表中,并隐藏它。 然后,我的代码操纵那些已命名的范围,从而更新可用的validation下拉菜单中的值。

dynamic更新被更新的命名范围的大小可能会非常棘手,但是对于VBA来说,这并不难,特别是如果您从数据库返回集合,那么您可以获得logging数。 另一种方法是去ActiveX控制路线,但我喜欢数据validation下拉菜单的干净,本地的外观和感觉。

我已经通过在WorkbookBeforeSave事件中删除我的validation来解决此问题。 不过,我正在使用C#

看来你是正确的Validation formula1 parameter的string长度。 我的build议如下(附加信息作为注释放在代码中):

 'Split your list into array, or if data are Array before you _ create List variable you could combine some of earlier steps _ of your code List = Split(List, ",") 'paste your list into hidden sheet as of A1 direction bottom, _ we need to transpose our Array to do so Sheets("hidden").Range("a1").Resize(UBound(List) + 1, 1) = Application.Transpose(List) With Selection.Validation .Delete 'here we need to change definition of formula .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ Formula1:="=Hidden!A1:A" & UBound(List) + 1 .IgnoreBlank = False .InCellDropdown = True .ShowInput = True .ShowError = True End With 

刚刚遇到这个问题(限制数据validation公式长度在工作簿打开),并像OP不希望去与辅助范围。

我的解决方法是删除Workbook_BeforeSave处理程序中的validation。

我的用例是总是刷新外部数据源的数据,因此在保存工作簿之前总是删除所有导入的数据和validation是一个可行的选项。

有一种方法,在使用它之前,将用于条件格式化的string保存在工作簿中的某处。 当您使用它们时,请将它们引用到您保存它们的范围内,而不是从string中。 在条件格式中记住longsstring是什么原因导致它执行一个函数,当closures工作簿消除有问题的条件格式和另一个function,当打开把它们放回

问题解决了,它工作一个治疗:)