VBA 用户定义函数返回奇怪或没有结果
Posted
技术标签:
【中文标题】VBA 用户定义函数返回奇怪或没有结果【英文标题】:VBA User Defined Function returning strange or no results 【发布时间】:2014-02-21 22:41:11 【问题描述】:我正在创建一个 UDF,用于生成可以放入 HighCharts 的字符串。所以基本上,我将两个数据范围(数字或文本)输入到 UDF 中,并输出一个字符串或格式化的对,如下所示 [[ DataX, DataY], [DataX1, DataY1], ...]
在第一个范围内一切正常,但在第二个范围内却给了我垃圾结果。
这是我的代码:
Function HCP(Rng1 As Range, Rng2 As Range) As String
' this function will take columns of data and properly format them for highcharts
Dim Str1, Str2, retVal As String
Dim leng, i, j As Integer
Dim col1, col2, row1, row2 As Long
Dim temp1, temp2 As Range
Str1 = "["
Str2 = "]"
col1 = Rng1.Column
col2 = Rng2.Column
row1 = Rng1.Row
row2 = Rng2.Row
leng = Rng1.Rows.Count
For i = 1 To leng
If i < leng Then
Set temp1 = Rng1.Cells(row1 + i - row1, col1)
Set temp2 = Rng2.Cells(row2 + i - row2, col2)
retVal = retVal & "[" & temp1 & "," & temp2 & "],"
Else
retVal = retVal & "[" & temp1 & "," & temp2 & "]"
End If
Next i
retVal = Str1 & retVal & Str2
HCP = retVal
End Function
我使用这个公式调用函数:=hcp(D2:D61,O2:O61)
结果对我来说没有意义。第一个数据范围的起始行太低。我得到了几个空值,然后过了一会儿,我开始从第 29 列中的工作表的另一部分获取数据。我猜它是从第 29 列中的空单元格开始的,但我不知道为什么会这样。
这里有另一个线索可能有助于深入了解这一点。如果我使用公式 =hcp(A2:A61,B2:B61) ,则该公式将从 A 和 C 向下获取数据。它在哪里添加额外的列?当我执行 =hcp(A2:A61,C2:C61) 时,它从 A 和 E 开始。当我输入 =hcp(A2:A61,D2:D61) 时,我得到 A 和 G 结果。
当我将其更改为 =hcp(B2:B61,C2:C61) 我得到 C 和 G 时,也会发生同样的事情......你看到了模式。
我看不到第二列上它是如何乘以 2 的?
【问题讨论】:
【参考方案1】:第一个提示:
在Dim col1, col2, row1, row2 As Long
行中 - 只有row2
声明为Long
,但其他变量为Variant
。
您应该改用Dim col1 As Long, col2 As Long, row1 As Long, row2 As Long
。其他声明也一样。
第二个提示:在行中Rng1.Cells(row1 + i - row1, col1)
- 表达式row1 + i - row1
总是等于i
第三个提示:当您使用Rng1.Cells(row1 + i - row1, col1)
时,它的工作原理类似于将i-1
偏移到底部,将col1-1
偏移到右侧从左上角的单元格 em> Rng1
.
因此对于D2:D61
,范围col1
将等于4
,这意味着Rng1.Cells(1, col1)
将是G2
(从D2
偏移到底部1-1
和右侧4-1
) 这不是您所期望的。
试试这个功能:
Function HCP(Rng1 As Range, Rng2 As Range) As String
' this function will take columns of data and properly format them for highcharts
Dim retVal As String
Dim i As Integer
'if ranges doesn't contains one column and same rows count - return #VALUE error
If Rng1.Rows.Count <> Rng2.Rows.Count Or _
Rng1.Columns.Count <> 1 Or Rng2.Columns.Count <> 1 Then
HCP = CVErr(xlErrValue)
Exit Function
End If
For i = 1 To Rng1.Rows.Count
retVal = retVal & "[" & Rng1.Cells(i, 1) & "," & Rng2.Cells(i, 1) & "],"
Next i
'remove last comma
If retVal <> "" Then retVal = Left(retVal, Len(retVal) - 1)
HCP = "[" & retVal & "]"
End Function
【讨论】:
非常感谢!这很有帮助。完美运行!肯定吸取了教训。以上是关于VBA 用户定义函数返回奇怪或没有结果的主要内容,如果未能解决你的问题,请参考以下文章
Access VBA - 换行符的查找和替换文本在我的 Word 文档中返回奇怪的块