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 用户定义函数返回奇怪或没有结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 将用户定义的函数输入到列中

在 VBA 中访问选择组合框列返回“函数未定义”-错误

Access VBA - 换行符的查找和替换文本在我的 Word 文档中返回奇怪的块

Access VBA - 为声明为 long 的函数返回某种空白/空值

如何从 VBA 函数返回自定义类型

Excel VBA中的ThisCell属性如何使用?