我对 vba 编程很陌生。我需要一些编码帮助,在我尝试谷歌搜索解决方案后我无法找到解决方案。
目前我有一个自定义类型,称为类别映射。该类型将用于包含我想要作为 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 的数据验证
我猜测发生错误是因为验证列表中的选项未存储在工作表中,而是存储在程序内存中,因此当我关闭程序时,内存丢失了。
如果我的猜测是正确的,有没有办法解决这个问题?我正在考虑创建另一个包含验证列表中所有数据的工作表,并让我的单元格验证列表引用它们,但是有更好的方法将它们存储在同一个工作表中吗?