按颜色对单元格进行排序并将其地址放入数组中

问题描述 投票:0回答:1

我想将背景颜色不同于 -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
是为了查看代码是否会获取正确的值,确实如此,但它没有附加到数组中。

arrays excel vba range preserve
1个回答
1
投票

(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
© www.soinside.com 2019 - 2024. All rights reserved.