Таблица (ListObject) Назначение значений с использованием UDF - PullRequest
0 голосов
/ 31 марта 2020

Source Data

Выше приведен упрощенный пример, но я хочу достичь с помощью UDF - принять строку в столбце с сопоставлением и разделитель, который будет использоваться для разбиения. жало разделяется на подстроки и присваивается последовательно столбцам Q1, Q2, Q3, Q4. Возможно, будет сгенерировано менее 4 подстрок, но никогда не будет больше 4.

Function DECONS(Subject As String, Delim As String) As String
' takes an input string "Subject" and seperates it using "Delim" as the deliminator
' If the desired element exceeds the number of unique substrings the function returns a blank result
' Hardcoded for max 4 substrings

' initializes temporary variables
Dim i As Long
Dim r() As String

' uses built in VBA function to split the passed string using the deliminating character
r = Split(Subject, Delim)

' increases the size of r() to 4 elements and fills extra elements with blancks
For i = UBound(r) + 1 To 3
ReDim Preserve r(i)
r(i) = ""
Next i

' my sad attempt at what I want to acheive
Dim loT As ListObject
Set loT = ThisWorksheet.ListObjects("TT")

For i = 1 To 4
loT.ListColumn(i + 1).Range.Value = r(i - 1)
Next i

End Function

Я сделал манипулирование текстом, используя функцию разделения VBA, которая выдает массив строк, но я Я бью стену о том, как назначить подстроки для соответствующих столбцов. Моя попытка видна выше. Я немного читал, но в VBA / Excel я все еще не достаточно удобен, чтобы понять это самостоятельно. Является ли это более сложным, когда в ListObject, чем за пределами объекта таблицы?

К сожалению, я не могу вернуть массив строк из функции, а затем назначить его нескольким ячейкам, поскольку объект Table не допускает операций с массивами. У меня была работа, где я возвращал указанный элемент, ie 3-й, и я вызывал функцию в каждом столбце и выводил одно соответствующее значение. Однако метод не элегантен и выполняет много ненужных повторных вычислений.

1 Ответ

0 голосов
/ 01 апреля 2020

Попробуйте

Sub DECONS(Delim As String)
    Dim objList As ListObject
    Dim vDB As Variant, vSplit
    Dim vR(), n As Integer, r As Long
    Dim i As Long
    Set objList = ActiveSheet.ListObjects("TT")
    vDB = objList.DataBodyRange.Columns(1)

    r = UBound(vDB, 1)
    ReDim vR(1 To r, 1 To 4)
    For i = 1 To r
        vSplit = Split(vDB(i, 1), "\")
        n = 0
        For Each v In vSplit
            n = n + 1
            vR(i, n) = v
        Next v
    Next i
    'Range("b2").Resize(r, 4) = vR
    objList.DataBodyRange.Columns(2).Range("a1").Resize(r, 4) = vR
End Sub
...