首页 文章

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

提问于
浏览
6

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

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

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能够通过删除功能来修复文件”

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

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

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

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

5 回答

  • 2

    我之前在一些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

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

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

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

  • 0

    我已经通过删除WorkbookBeforeSave事件中的验证来解决了这个问题 . 但是,我正在使用C#

  • 5

    看来你的字符串长度为 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
    
  • 2

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

    问题解决了,它有效:)

相关问题