Могу ли я задать назначение текста для функции столбцов в виде массива?

#excel #vba

Вопрос:

Я хотел бы разделить набор данных с разделителями из исходного столбца на массив. Возможно ли это? Причина в том, что затем я хочу обрезать элементы данных, удалить дубликаты и подсчитать оставшиеся уникальные значения, прежде чем записывать их в пустые столбцы моей электронной таблицы.

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

1. диапазон. На странице TextToColumns указано, что она принимает любой допустимый объект диапазона в качестве места назначения. Он смотрит только на верхнюю левую ячейку и автоматически расширяется по мере необходимости.

2. Вам нужно будет использовать другой метод. Посмотрите на функцию VBA Split ; и/или Запрос питания

3. Если бы я сказал, что вам нужен фрагмент кода, способный возвращать количество уникальных элементов массива, полученных путем разделения значения каждой ячейки разделителем , будет ли это правильным пониманием? Я имею в виду вернуть его в ту же строку обработанной ячейки, в следующем столбце.

4. @Рон, Раскол звучит правдоподобно. Могу ли я прочитать набор данных с разделителями в массив, а затем использовать разделение?

5. @FaneDuru Да, ваше понимание верно (выделено жирным шрифтом). Однако я также хочу записать уникальные значения в ячейки в следующих столбцах в той же строке.

Ответ №1:

Пожалуйста, протестируйте следующий код:

 Sub CountUniquesElem()
  Dim sh As Worksheet, lastR As Long, delim As String
  Dim arr, arrSpl, arrFin, arrS, i As Long
  
  delim = "," 'use any used delimiter (now, comma)
  Set sh = ActiveSheet
  lastR = sh.Range("A" amp; sh.rows.count).End(xlUp).row
  arr = sh.Range("A2:A" amp; lastR).Value    'place the range in an array for faster iteration
  ReDim arrFin(1 To UBound(arr), 1 To 2) 'ReDim the final array to keep the processed range
  
  For i = 1 To UBound(arr)                'iterate between the array elements
     arrSpl = Split(arr(i, 1), delim)     'split the content by delimiter
     arrS = Split(UniquesEl(arrSpl), "|") 'split the unique string by "|"
     arrFin(i, 1) = CLng(arrS(0)): arrFin(i, 2) = arrS(1) 'load both columns of the final array
  Next i
  'drop the final array content:
  sh.Range("B2").Resize(UBound(arrFin), 2).Value = arrFin
End Sub

Private Function UniquesEl(ByVal arr) As String
    Dim strCont As String       ' replacing "10" referring to zero indexed as 10th digit
    strCont = Replace("<t><s>" amp; Join(arr, "</s><s>") amp; "</s></t>", "10", "0")
    arr = WorksheetFunction.FilterXML(strCont, "//s[not(preceding::*=.)]")
    UniquesEl = UBound(arr) amp; "|" amp; Join(Application.Transpose(arr), ",")
End Function
 

Приведенный выше код обрабатывает данные из столбца «A:A», начиная со второй строки, и возвращает в «B:C».

Пожалуйста, протестируйте его и отправьте несколько отзывов.