我想将背景颜色不同于 -4142 的单元格中的值放入一个数组中,以便稍后我可以将这些值插入到下拉列表中。
我在这个问题的答案中找到了代码: 在 VBA 中附加动态数组。
我明白了
error 13 incompatible types
在队列中
myArray(X) = cell.Address
我不知道该消息是否是英文,因为我的VBA是另一种语言,但错误号是13。
Sub SelectByColor()
Dim cell As Range
Dim rng As Range
Dim LR As Long
Dim myArray() As Double, X As Long
X = 0
'For understanding LR = Last Row
LR = Range("B:B").SpecialCells(xlCellTypeLastCell).Row
ReDim Preserve myArray(X)
Set rng = Range("B2:B" & LR)
For Each cell In rng.Cells
If cell.Interior.ColorIndex <> -4142 Then
myArray(X) = cell.Address
X = X + 1
If X < N Then ReDim Preserve myArray(0 To X)
mystr = mystr & cell.Address & ","
End If
Next cell
mystr = Left(mystr, Len(mystr) - 1)
MsgBox mystr
MsgBox myArray(X)
End Sub
mystr
是为了查看代码是否会获取正确的值,确实如此,但它没有附加到数组中。
(a) 您会收到运行时错误,因为您声明数组来保存数字,但您试图将地址(=字符串)写入其中。单元格地址(例如 $A$1)无法转换为数字,因此 VBA 会抛出错误 13。
(b) 用作数据验证的值列表可以由一系列单元格或(硬编码)值列表创建。但是,范围需要是连续的,这不符合您的要求。
所以你需要的是一个值列表。值需要用“,”分隔。您可以像在代码中一样创建一个数组,然后使用
Join
函数来完成此操作。但是,数组必须是 String 或 Variant 类型,它不适用于 Double。
由于我不喜欢在循环中使用
Redim Preserve
(非常低效),因此我通过使用最大可能值(LR)调整数组大小来更改逻辑,然后仅使用单个 Redim 来删除之后未使用的条目值已填充。
ReDim myArray(LR)
Dim X As Long, rng as Range, cell as Range
Set rng = ActiveSheet.Range("B2:B" & LR)
For Each cell In rng.Cells
If cell.Interior.ColorIndex <> -4142 and not isError(cell.value) Then
myArray(X) = cell.Value
X = X + 1
End If
Next cell
Redim Preserve myArray(X) ' Remove unused entries
设置验证:
With Selection.Validation ' <-- Replace Selection with the Range where you want to apply the validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Join(myArray, ",")
End With