Excel找到了不可读的内容 - 数据验证

时间:2013-06-10 11:20:56

标签: excel excel-vba vba

我在打开工作簿时填充了一些组合框 - 数据源来自数据库。

我使用以下代码使用数据验证填充我的组合框: -

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

其中list是一个逗号分隔的字符串,我是从数据库记录集构建的。

一切正常。当我稍后重新打开工作簿时出现问题。我收到错误

“Excel发现不可读的内容。您要恢复此文件的内容吗”

你说是,Excel然后给你

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

一些组合框的数据验证已经消失

我怀疑从某些互联网搜索中我用于数据验证的字符串太长了?

我不能选择将记录集值添加到隐藏工作表中,并将数据验证源设置为隐藏工作表上的范围,因为组合框是动态的,并根据用户选择进行切换和更改。我真的只需要能够将数据验证设置为我在用户交互中的各个点建立的字符串。

如果是字符串太长的情况,是否可以附加到数据验证,还是有其他技巧可以用来解决这个问题?

5 个答案:

答案 0 :(得分:5)

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

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

如果公式字符串太长,你永远不会收到错误。

我将所有验证引用的命名区域放在一个工作表中,并将其隐藏起来。然后我的代码操作那些命名范围,然后更新验证下拉菜单中的值。

在更新命名范围时动态更新命名范围的大小可能会很棘手,但对于VBA而言并不是太难,特别是如果您从数据库返回集合,则可以获得记录计数。另一种方法是使用ActiveX控件路径,但我喜欢数据验证下拉列表的干净,原生外观。

答案 1 :(得分:2)

刚遇到此问题(工作簿开放时数据验证公式长度的限制),并且OP不希望使用辅助范围。

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

我的用例是始终刷新外部源的数据,因此在保存工作簿之前始终删除所有导入的数据和验证是可行的选择。

答案 2 :(得分:2)

我通过删除WorkbookBeforeSave事件中的验证来解决此问题。但是,我使用的是C#

答案 3 :(得分:1)

似乎你的字符串长度为Validation formula1 parameter。我给你的建议如下(附加信息作为代码中的注释):

'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

答案 4 :(得分:0)

有一种解决方法,在使用之前将用于条件格式的字符串保存在工作簿中的某个位置。当您使用它们时,将它们引用到您保存它们的范围而不是字符串。请记住条件格式中的longs字符串是导致它的原因 做一个函数,当关闭工作簿时清除有问题的条件格式和另一个打开时将它们重新打开的函数

问题解决了,它起作用了:)