-1

我对 VBA 很陌生。

我正在尝试构建一个 UDF 函数来将单元格中的逗号分隔文本解析为行。我有一个工作正常的 Sub,但需要手动“运行”;我希望它成为一个函数。

假设我在单元格A1中有以下字符串逗号分隔字符串

M89-76,M64-62,M76-80

我想M...在单独的行单元格中列出每个。子代码实现了这一点,但需要手动运行;我需要一个子代码的 UDF,这样我就可以输入=myUDF(A1),并在单元格中返回 'sB1的列表M...B1B3

Sub TransposeRange()

  Dim rng As Range
  Dim InputRng As Range, OutRng As Range

  Set InputRng = Application.Selection.Range("A1")
  Set InputRng = Application.InputBox("Range(single cell) :", xTitleId, InputRng.Address, Type:=8)
  Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8)
  
  Arr = VBA.Split(InputRng.Range("A1").Value, ",")
  OutRng.Resize(UBound(Arr) - LBound(Arr) + 1).Value = 
  Application.Transpose(Arr)

End Sub
4

2 回答 2

1

如果您使用的是支持动态数组 (Office365)的版本,那么您的 UDF 可以将结果溢出到所需的多个单元格中。

Function MyUDF(r As Range) As Variant
    Dim s() As String
    s = Split(r.Value2, ",")
    MyUDF = Application.Transpose(s)
End Function

对于A放入=MyUDF(A1)CellB1的数据,结果会溢出

请注意,Application.Transpose字符串长度限制为 32765 个字符。如果输入的数据比A1那个长,结果将被截断。在这种情况下,您需要将转置(循环s,二维数组)编码

如果您没有动态数组,当作为数组公式输入到足够大的范围以保存结果时,该公式仍然有效(例如B1:B3

在此处输入图像描述

于 2021-11-29T00:06:06.573 回答
1

如果您有 FILTERXML(2013 年推出,感谢 TM),那么您可以使用公式执行此操作:

=FILTERXML("<t><x>" & SUBSTITUTE(A1, ",", "</x><x>") & "</x></t>", "//x")

您将字符串转换为 xml 格式的树,然后传入 xpath 选择器。这将根据需要溢出到尽可能多的行中。

你也可以使用这个。LET 让它变得更简单,但我将给出非参数化版本,因为如果你有 LET,你应该有 FILTERXML:

=TRIM(
  MID(
    SUBSTITUTE(A1, ",", REPT(" ", 100)), 
    IF(
      ROW(OFFSET(A1, 0, 0, LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1)) = 1,
      1, 
      (ROW(OFFSET(A1, 0, 0, LEN(A1)-LEN(SUBSTITUTE(A1,",",""))+1))-1)*100
    ), 
    100
  )
)

用任意长的空格替换逗号,然后使用 MID 选择子字符串,并使用 ROW 生成字符串中元素大小的索引数组。将其包裹在 TRIM 中以消除空格。

如果您需要使用 UDF 执行此操作,则可以执行以下操作:

Function splitIt(raw)
    splitIt = Application.Transpose(Split(raw, ","))
End Function

并像使用任何其他功能一样使用它。这在功能上与 Chris Nielsen 的解决方案相同。


将很快更新其他 Excel 版本的其他两个选项。

于 2021-11-29T17:16:13.310 回答