Массив не учитывается из строки, созданной в VBA

#excel #vba #excel-formula

Вопрос:

По какой-то причине динамическая строка, созданная из определенного диапазона, не учитывается в массиве для циклов. Ниже приведен мой код:

 Option Explicit
Dim AccrualFile As Workbook, AccrualSht As Worksheet
Dim AccrualFilePath As String
Dim UniqueNames As String, UniqueAccNames As String
Dim Lrows As Long, Lcols As Long


Sub Segregation()

AccrualFilePath = Application.GetOpenFilename(Title:="Please select Accrual Statement")

Set AccrualFile = Workbooks.Open(AccrualFilePath)
Set AccrualSht = AccrualFile.Sheets(1)

Lrows = AccrualSht.Range("B" amp; Rows.Count).End(xlUp).Row
UniqueNames = Application.WorksheetFunction.TextJoin(""""", """"", True, Application.WorksheetFunction.Unique(AccrualSht.Range("B2:B" amp; Lrows)))
UniqueAccNames = """""" amp; UniqueNames amp; """"""

Dim i As Long
Dim myarr() As Variant

myarr = Array(UniqueAccNames)



For i = LBound(myarr) To UBound(myarr)
    Debug.Print myarr(i)
Next

End Sub
 

Ценю вашу помощь!!

Спасибо.

Комментарии:

1. Вы перепутали строку, разделенную запятыми, со строками, разделенными запятыми. "foo, bar, baz" , это не то же самое, что "foo", "bar", "baz" .

2. Я тоже пробовал это, но это не работает. @BigBen

3. Пропустите textjoin и массив и просто используйте WorksheetFunction.Unique .

4. Он показывает ошибку TypeMistmatch amp; Runtime — 13, если я беру только уникальную формулу

5. @mrk777 Массив содержит только один элемент, потому что вы вводите в функцию только один элемент Array() . Вы сохраняете весь текст в одной строковой переменной UniqueNames . Если вы хотите создать несколько элементов из одной строки, попробуйте эту Split функцию. Но у @BigBen есть лучшее решение.

Ответ №1:

WorksheetFunction.Unique возвращает массив (2D)1 при передаче a Range .

 myarr = WorksheetFunction.Unique(AccrualSht.Range("B2:B" amp; Lrows))

Dim i As Long, j As Long
For i = LBound(myarr, 1) to Ubound(myarr, 1)
   For j = Lbound(myarr, 2) to Ubound(myarr, 2)
       Debug.Print myarr(i, j)
   Next
Next
 

1 За некоторыми исключениями, в том числе:

  • Когда вывод состоит из одного элемента, он возвращает массив 1D.

Комментарии:

1. Этот код отлично работает, но могу ли я использовать эти значения в качестве критериев фильтрации в самом цикле?

2. Я хотел бы использовать фильтр диапазона с этими именами одно за другим… И я думаю, что смогу это использовать