
上面是一个简化的例子,但我想用我的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 split函数完成了文本操作,该函数产生了一个字符串数组,但是我遇到了一个难题,那就是如何将子字符串分配给相关的列。我的尝试可以在上面看到。我已经读了相当多的书,但我在VBA/Excel中仍然不太熟悉,还不能自己解决这个问题。在ListObject中比在table对象外更复杂吗?
遗憾的是,我不能从函数返回字符串数组,然后将其分配给多个单元格,因为Table对象不允许数组操作。我有一个工作,我将返回一个指定的元素,即第三个,我将调用每一列中的函数并输出一个相应的值。然而,该方法并不优雅,并且做了大量不必要的重复计算。
发布于 2020-04-01 14:16:52
试一试
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 Subhttps://stackoverflow.com/questions/60958151
复制相似问题