Если вы используете функцию FilterXML()
в вер. 2013+ вы можете попробовать следующий подход, выполнив следующие действия:
- объявление источника и целевого диапазона (см. Разделы
[0]
и [1]
) - назначить все данные в используемом диапазоне для 1-мерного массива (см.
[2]
) - удалить пустые ячейки с помощью
FilterXML
(см. [3]
) - записать массив в целевой столбец (см.
[4]
)
Sub ListAllTo1Column()
'[0] set target range to memory and clear existing data
Dim tgt As Range: Set tgt = Sheet2.Range("A:A")
tgt = vbNullString ' clear target column (before declaring source range)
'[1] set source range to memory
Dim src As Range: Set src = Sheet1.UsedRange
'[2] get all data
ReDim arr(1 To src.Cells.Count)
Dim cell As Variant, i As Long
For Each cell In src
i = i + 1: arr(i) = cell
Next cell
'[3] remove empty cells
arr = WorksheetFunction.FilterXML("<t><s>" & Join(arr, "</s><s>") & "</s></t>", "//s[not(.='')]")
'[4] write results to target
'Debug.Print Join(Application.Transpose(arr), ", ")
tgt.Resize(UBound(arr), 1).Offset(1) = arr
End Sub
Некоторые подсказки `Filter XML function:
WorksheetFunction.FilterXML()
получает два аргумента:
- хорошо сформированная строка из xml" узлов "с начальные и закрывающие теги, в некотором роде сопоставимые с HTML;
- a
XPath query
строка, определяющая, какие узлы (то есть узел значения в VBA) вы хотите извлечь.
Итак arr = WorksheetFunction.FilterXML("<t><s>" & Join(arr, "</s><s>") & "</s></t>", "//s[not(.='')]")
- преобразует элементы массива с помощью функции
Join()
, чтобы окружить их тегами <s>...</s>
в своем первом аргументе и - определяет во втором аргументе строку поиска XMLPath для любых
s
узлов (на любом уровне иерархии между прочим из-за //s
), добавляя условие в скобках, чтобы не искать пустые значения через [not(.='')]
, где указывается аббревиатура точки .
до значения предыдущего узла перед скобкой.
Альтернативная оценка Excel 2019 TEXTJOIN()
- Изменить / 2020-04-28
Если вы выберете версию 2019, вы можете использовать следующий фрагмент кода
Dim tmp: tmp = Split(Evaluate("=TEXTJOIN("","",True,Sheet1!" & Replace(Sheet1.UsedRange.Address, "$", "") & ")"), ",")
' Debug.Print Join(tmp, "|")
tgt.Resize(UBound(tmp), 1).Offset(1) = Application.Transpose(tmp)