Как добавить массив в выпадающий список в ячейке из словаря сценариев?

У меня есть дамп данных из другого приложения. Я хочу получить уникальные значения из единственного столбца в дампе данных (который имеет переменную длину). Как только у меня появятся уникальные значения, я хочу, чтобы они были вызваны в.incelldropdown из проверки данных. Я выяснил большую часть этого, за исключением последней части, где я получаю сообщение об ошибке при запуске: Ошибка приложения времени выполнения: "1004" Ошибка приложения или объекта. Увидеть ниже:

Sub TitleRange()

Dim sheet As Worksheet
Dim LastRow As Long
Dim StartCell As Range
Dim RangeArray As Variant


Worksheets("Raw").Select
Set sheet = Worksheets("Raw")
Set StartCell = Range("A2")

'Find Last Row
 LastRow = Cells(Rows.Count, "A").End(xlUp).Row

'Select Range & load into array
 RangeArray = sheet.Range("A2:A" & LastRow).Value



Dim d As Object
Set d = CreateObject("Scripting.Dictionary")


Dim i As Long
For i = LBound(RangeArray) To UBound(RangeArray)
d(RangeArray(i, 1)) = 1
Next i

Dim v As Variant
For Each v In d.Keys()
'd.Keys() is a Variant array of the unique values in RangeArray.
'v will iterate through each of them.
Next v


'This code below gives me a problem
Worksheets("PR Offer Sheet").Select
Range("C1").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=d.Keys()
.InCellDropdown = True

End With

Отладчик говорит, что проблема в d.Keys() из сценариев. Однако я попытался преобразовать в строку, используя Join (d.Keys(), ",") и вызывая эту новую переменную в проверке данных, которая выдает ту же ошибку. Я бегу это на Excel 2010.

Я думал, что это также может быть проблемой, что вариантный массив является 2D, и он должен быть 1D, но это не так. В недоумении и надежде кто-то может помочь.

Лучший,

Энтони

2 ответа

Это работает для меня. xlValidateList ожидает список, разделенный запятыми (или диапазон). Я также удалил ненужные операторы Select и Activate и замедлил код.

Sub TitleRange()

Dim sheet As Worksheet
Dim LastRow As Long
Dim RangeArray As Variant
Dim i As Long
Dim d As Object

Set sheet = Worksheets("Raw")

With sheet
    'Find Last Row
    LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
    'Select Range & load into array
    RangeArray = .Range("A2:A" & LastRow).Value
End With

Set d = CreateObject("Scripting.Dictionary")

For i = LBound(RangeArray) To UBound(RangeArray)
    d(RangeArray(i, 1)) = 1
Next i

With Worksheets("PR Offer Sheet").Range("C1").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(d.Keys, ",")
    .InCellDropdown = True
End With

End Sub

Это похоже на работу:

Sub MAIN2()
    Dim it As Range, r As Range, x0, s As String
        With CreateObject("scripting.dictionary")
            For Each it In Sheets("Raw").Columns(1).SpecialCells(2).Offset(1)
                x0 = .Item(it.Value)
            Next

            s = Join(.Keys, ",")

        End With
        With Worksheets("PR Offer Sheet").Range("C1").Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=s
                .InCellDropdown = True
        End With
End Sub
Другие вопросы по тегам