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

Dav*_*vid 6 excel vba excel-vba

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

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

  With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=list
    .IgnoreBlank = False
    .InCellDropdown = True
    .ShowInput = True
    .ShowError = True
  End With
Run Code Online (Sandbox Code Playgroud)

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

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

"Excel找到了不可读的内容.你想要恢复这个文件的内容吗?"

你说是的,然后Excel会给你

"Excel能够通过删除功能来修复文件"

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

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

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

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

Bao*_*dad 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
Run Code Online (Sandbox Code Playgroud)

你永远不会得到该公式字符串太长的错误.

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

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


Kaz*_*wor 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
Run Code Online (Sandbox Code Playgroud)