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 - 从函数中重新获得可变长度数组的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 用户定义函数 - 可变大小参数

从 vba 代码调用 Excel 的工作表函数

使用 VBA 限制 Excel 中的地理定位 API 调用。

易失性用户定义函数未按预期重新计算(VBA/Excel)

Vba excel从给定长度之间的字符串中提取文本

如何使重新打开文档时有效的 Excel VBA 函数?