我正在尝试编写一个函数,根据预先确定的计数将列中的多行文本合并为一个单元格。我的目标是生成一个灵活的功能,以帮助编译/插入大量数据。我写的代码返回#NAME?我无法弄清楚错误在哪里。我的代码如下:
Function vmrg(countref As Integer, datref As Integer) As String
If IsEmpty(ActiveCell.Offset(0, -countref)) Then % check if cell containing count is blank
vertmerge = "N/A" % if blank, state N/A
Else
Dim datlst(0 To ActiveCell.Offset(0, -countref).Value - 1) As String
Dim i As Integer
For i = 0 To ActiveCell.Offset(0, -countref).Value - 1
datlst(i) = ActiveCell.Offset(i, -datref).Text %fill array with data
End
vertmerge = datlst(0)
For i = 1 To ActiveCell.Offset(0, -countref).Value - 1 % merge array to a single string
vertmerge = vertmerge & ", " & datlst(i)
End
End
End Function
我有matlab和一些C ++经验,但这是我第一次使用VBA,所以我的语法在某些方面可能是奇怪的而在其他方面则是错误的。理想情况下,我想引用存储数据和计数信息的单元格,但是现在我希望纠正我的语法并设置一个跳跃点来进一步开发这个函数。任何建议都表示赞赏。
代码Rev_1:我还有#NAME的输出?但我想我已经纠正了(?)一些问题
Function vertmerge(countref As Range, datref As Integer) As String
If IsEmpty(countref) = True Then
vertmerge = "NA"
Else
Dim datlst(0 To countref.Value - 1) As String
Dim i As Integer
For i = 0 To countref.Value - 1
datlst(i) = countref.Offset(i, datref).Text
Next i
vertmerge = datlst(0)
For i = 1 To countref.Value - 1
vertmerge = vertmerge & ", " & datlst(i)
Next i
End
End Function
答案 0 :(得分:0)
你在这里做了一些危险的事情!
首先 - 您正在从函数内部引用“ActiveCell”;但你没有IDEA功能运行时哪个单元将处于活动状态!相反,将目标单元格作为参数传递:
=vmrg("B6", 5, 6)
并将您的函数原型更改为
Function vmrg(r as Range, countref as Integer, datref as Integer)
现在您可以使用
引用与r相关的内容r.Offset(1,2)
等
下一步 - 您永远不会向vmrg
分配任何内容。在VBA中,函数返回值的方式是(在这种情况下)
vmrg = 23
您正在将事物分配给名为vertmerge
的变量 - 但这不是您的函数的名称。至少添加
vmrg = vertmerge
回来之前。那可能会这样做。如果没有完整的电子表格样本,我无法帮助您。