Добрый день, уважаемые. Вчера от безделья написал процедуру вывода уникальных значений из несвязанных диапазонов. Вроде все работает, но есть нюанс, который я не понимаю. Подскажите, почему с Option Base 0 данный код выводит значения начиная с второй ячейки, а с Option Base 1 с первой?
[vba]
Код
'Option Base 1
Private Sub UniqVal(ByVal uniq As Range, ParamArray rNotUniq())
'uniq - ячейка с которой начнется вывод уникальных значений 'rNotUniq - Диапазоны с которых берутся значения
Dim x, y, t$ Dim UniqArray Dim UniqCollection As New Collection On Error Resume Next
With UniqCollection For Each x In rNotUniq UniqArray = x.Value For Each y In UniqArray t = Trim(y) If Len(t) > 0 Then .Add t, t End If Next Next
ReDim UniqArray(.Count) For x = 0 To .Count UniqArray(x) = .Item(x) Next End With
uniq.Resize(UBound(UniqArray) + 1).Value = WorksheetFunction.Transpose(UniqArray) End Sub
[/vba]
А еще почему коллекция отказывается принимать числа, если их не перевести в текст?
Добрый день, уважаемые. Вчера от безделья написал процедуру вывода уникальных значений из несвязанных диапазонов. Вроде все работает, но есть нюанс, который я не понимаю. Подскажите, почему с Option Base 0 данный код выводит значения начиная с второй ячейки, а с Option Base 1 с первой?
[vba]
Код
'Option Base 1
Private Sub UniqVal(ByVal uniq As Range, ParamArray rNotUniq())
'uniq - ячейка с которой начнется вывод уникальных значений 'rNotUniq - Диапазоны с которых берутся значения
Dim x, y, t$ Dim UniqArray Dim UniqCollection As New Collection On Error Resume Next
With UniqCollection For Each x In rNotUniq UniqArray = x.Value For Each y In UniqArray t = Trim(y) If Len(t) > 0 Then .Add t, t End If Next Next
ReDim UniqArray(.Count) For x = 0 To .Count UniqArray(x) = .Item(x) Next End With
uniq.Resize(UBound(UniqArray) + 1).Value = WorksheetFunction.Transpose(UniqArray) End Sub
[/vba]
А еще почему коллекция отказывается принимать числа, если их не перевести в текст?SkyPro
[/vba] .Count у нас = 16 если Option Base 0, то UniqArray будет иметь элементы с индексами 0, 1, 2, ... 16 - всего 17 элементов (при этом UBound(UniqArray)=16) в цикле UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и элемент UniqArray(0) остается Empty. Вот этот Empty и записывается в яч. F1, а uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17.
А если Option Base 1, то UniqArray будет иметь элементы с индексами 1, 2, ... 16 - всего 16 элементов (при этом UBound(UniqArray)=16) в цикле UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и у UniqArray нет элемента с индексом 0. И uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17, при этом в F17 получаем #Н/Д, потому что у массива всего 16 эл-тов.
Ну, как бы имхо
Наверное, вот эту строку нужно смотреть: [vba]
Код
ReDim UniqArray(.Count)
[/vba] .Count у нас = 16 если Option Base 0, то UniqArray будет иметь элементы с индексами 0, 1, 2, ... 16 - всего 17 элементов (при этом UBound(UniqArray)=16) в цикле UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и элемент UniqArray(0) остается Empty. Вот этот Empty и записывается в яч. F1, а uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17.
А если Option Base 1, то UniqArray будет иметь элементы с индексами 1, 2, ... 16 - всего 16 элементов (при этом UBound(UniqArray)=16) в цикле UniqArray(0) = .Item(0) - тут возникает ошибка, т.к. у коллекции нет .Item(0) и у UniqArray нет элемента с индексом 0. И uniq.Resize(UBound(UniqArray) + 1).Value заполняет яч. F1:F17, при этом в F17 получаем #Н/Д, потому что у массива всего 16 эл-тов.
ReDim UniqArray(1 To .Count) For x = 1 To .Count UniqArray(x) = .Item(x) Next End With uniq.Resize(UBound(UniqArray)).Value = WorksheetFunction.Transpose(UniqArray)
[/vba]
Может так, если я правильно вопрос понял [vba]
Код
ReDim UniqArray(1 To .Count) For x = 1 To .Count UniqArray(x) = .Item(x) Next End With uniq.Resize(UBound(UniqArray)).Value = WorksheetFunction.Transpose(UniqArray)