VBA用户定义函数返回奇怪或无结果

时间:2014-02-21 22:41:11

标签: excel vba highcharts user-defined-functions

我正在创建一个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 个答案:

答案 0 :(得分: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到右侧 左上角的 Rng1

因此D2:D61范围col1等于4,这意味着Rng1.Cells(1, col1)G2(偏向底部1-14-1开始向右D2,这不是你所期待的。

请尝试使用此功能:

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