excel VBA - 从函数中重新获得可变长度数组
Posted
技术标签:
【中文标题】excel VBA - 从函数中重新获得可变长度数组【英文标题】:excel VBA - refurn variable length array from function 【发布时间】:2016-06-21 03:41:52 【问题描述】:我想在 UDF 函数中模拟内置“文本到字段”的结果。 我需要这样做,因为我的原始数据来自网络查询,我需要在单独的页面上使用结果并绘制这些结果。 对于绘图,我需要将缺失值解析为空单元格,因为这是 excel 图表将缺失值显示为间隙的唯一选项。
由于两个限制,您不能使用内置函数执行此操作;
1) 它不能将解析后的字段定位到另一张纸上。
2) 尝试将数据值复制到目标工作表以在那里解析它们失败,因为 text-to-fields 解析引用表达式,而不是它引用的值。
3) 我无法在原始数据表上解析,然后将解析后的字段复制到目标表,因为没有表达式可以复制空单元格,它被转换为零值。 (毕竟,导致空单元格的表达式会自行擦除!)
所以我需要一个 DIY 字段解析器,并且在任何情况下,使用公式比对内置函数进行宏化(即使它可以工作)更好地满足我的整体需求。
我的字段如下所示:
calm
S 10
S 10 G 20
我希望它们像文本到字段一样进行解析,这将为数字提供数字,为文本提供字符串,并为缺少的字段提供 empty(即较短的读数。)
所以我使用了这段代码;
Function Explode(texte As String, Optional ByVal delimiter As String = " ") _
As String()
' mimic the text-to-fields,
' but allow inter-sheet references
Explode = Split(texte, delimiter)
End Function
但是要使用它,我必须将函数调用单元格预定义为数组的一部分,该数组是固定大小的,我不知道如何让它返回可变数量的已解析字段到固定大小大批。我想从上面的示例数据中得到:
但我得到的是:
请注意,空单元格必须是空的 - 不仅仅是看起来是空的(不是 "" 字符串)。
编辑: 我怀疑我可能不得不创建一个 sub 来设置解析字段的值并清除剩余单元格中缺少的字段(我总是最多有四个字段)而不是返回它们,但我不是很精通VBA。例如,获取两个单元格引用的东西,一个用于源引用,另一个用于解析字段的目标列表。然后从我可以嵌入工作表中的 function 调用它。基于副作用的编程...
【问题讨论】:
当某些行比其他行短时,很难看到如何使用 UDF 逐行执行此操作:任何给定的行本身都需要知道它“应该”有多少个字段“ 具有。您几乎需要传入一个附加参数来确定输出中应包含多少个值。 您能否提供一些示例数据或者更好的可下载测试存根? 你不能从函数中返回 Empty,所以恐怕你的 UDF 永远不会做你想做的事。您可以使用Application.Caller.Count
简单地调整输出数组的大小,以实现其价值。
@Rory - 我意识到我不能返回空,但想知道我是否可以返回一个较短的数组,因此只需将目标中的剩余单元格留空(之前会清除它们)。跨度>
@Tim - 如果我理解您的评论,输入文本决定了要返回的字段数,无需显式指定参数。
【参考方案1】:
您可以使用 Redim Preserve 使您的函数返回一个固定的数组大小。
=Explode($A$1,50,",")
Function Explode(texte As String, ArraySize As Integer, Optional ByVal delimiter As String = " ") _
As String()
Explode = Split(texte, delimiter)
ReDim Preserve Explode(ArraySize- 1)
End Function
【讨论】:
以上是关于excel VBA - 从函数中重新获得可变长度数组的主要内容,如果未能解决你的问题,请参考以下文章