VBA验证列表错误

时间:2012-07-13 07:40:30

标签: excel list validation excel-vba vba

我对vba编程很新。我需要一些编码帮助,在我尝试使用Google搜索解决方案后,我无法找到解决方案。

目前我有一个名为类别映射的自定义类型。该类型将用于包含我想要作为vadliation列表的选项放置的项目。它看起来如下:

Public Type categoryMapping
    messageKey As Long
    description As String
End Type

categoryMapping的一个例子是存储性别代码,6000代表男性,6001代表女性。

显示验证列表 因为我已经将它们存储在一个数组中,所以显示它们并不容易。我所做的如下:

'Validation drop down list for the whole row
If Has_Elements(mapping) Then
    Dim code As String
    Dim options() As categoryMapping

    code = ""
    options = mapping

    Dim j As Integer
    For j = LBound(options) To UBound(options)
        code = code & options(j).messageKey & ": " & options(j).description & ","
    Next j

    With Range(Rows(7).Address).Validation    'TODO: Need to refactor
        .Add Type:=xlValidateList, _
        AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, _
        Formula1:=code
        .InCellDropdown = True
        .InputMessage = "Please choose from of the following"
        .ShowInput = True
    End With
End If

是否更容易显示它们,因为我已经将所有要显示的项目放入数组中?我可以直接调用数组吗?

使用细胞 从上面的代码可以看出,我已经使用整行的地址来包含验证列表,因为实际上我想要的是整行,除了包含验证列表的头单元格。

With Cells(7,1).Validation    'TODO: Need to refactor
    .Add Type:=xlValidateList, _
    AlertStyle:=xlValidAlertStop, _
    Operator:=xlBetween, _
    Formula1:=code
    .InCellDropdown = True
    .InputMessage = "Please choose from of the following"
    .ShowInput = True
End With

我尝试使用上面的代码来做,但它失败了。有没有办法去做呢?

结合多次验证删除

由于上面提到的问题,我需要输入代码来删除某些列的验证列表,如下所示:

'Delete the unneccessary validation
'TODO: refactor the code so that write in 1 line
Range(Columns(1).Address).Validation.Delete
Range(Columns(2).Address).Validation.Delete
Range(Columns(3).Address).Validation.Delete
Range(Columns(4).Address).Validation.Delete

是否有一些方法可以将所有删除验证合并到一个语句中?

显示选项的一部分

从上面可以看到,当我的用户从验证列表中选择一个选项时,会显示整个字符串。

例如,如果我有“6000:男性”& “6001:女性”作为选项,我选择男性,我希望“6000”出现而不是“6000:男性”。有办法吗?

重新打开后验证数据不存在

生成验证列表后,我关闭程序并重新打开它,有一个错误,说“Excel在'file name.xls'中找到了不可读的内容。你想恢复这个工作簿的内容吗?如果你相信此工作簿的来源,单击是。

当我单击是时,我的Excel打开但我的所有验证列表都消失了!我得到以下作为错误消息。

  

   -    error064240_01.xml    在文件'file_name'中检测到错误    -    已移除的功能:来自/xl/worksheets/sheet2.xml.part的数据验证        

我猜测错误的发生是因为验证列表中的选项没有存储在工作表中,但它存储在程序存储器中,因此当我关闭程序时,内存丢失了。

如果我的猜测是正确的,有什么方法可以解决这个问题吗?我正在考虑创建另一个包含验证列表中所有数据的工作表,让我的单元格验证列表引用它们,但是有更好的方法将它们存储在同一个工作表中吗?

1 个答案:

答案 0 :(得分:1)

不可读的内容是因为您将验证列表存储在内存中的数组中。一旦关闭工作表,该数组就会超出范围并且不再存在。不是将它存储在数组中,而是将列表写入某个工作表,我通常会创建一个名为lists的新工作表。

您单元格的实际验证不会使用VBA。只需创建一个动态命名范围(使用offset()和counta()从列表工作表中的相关列填充验证列表。然后使用您的VBA代码将上面的数组写入该列。(http://chandoo.org/wp/2010/09/13/dynamic-data-validation-excel/

至于在验证和下拉列表中显示不同的文本,这听起来比它的价值更麻烦。是否可以只调整您的单元格,使其只显示前4位数字?