#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».
Пожалуйста, протестируйте его и отправьте несколько отзывов.