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

我正在创build一个UDF,用于生成一个可以放入HighCharts的string。 所以基本上,我input两个范围的数据(数字或文本)到UDF和输出一个string或格式化对,看起来像这样[[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获取数据并向下search。 在哪里添加额外的列? 当我做= hcp(A2:A61,C2:C61)它开始在A和E.当我把= hcp(A2:A61,D2:D61)我得到A和G的结果。

同样的事情发生时,我改变它这个= hcp(B2:B61,C2:C61)我得到C和G …你看到的模式。

我不知道我的第二列是如何乘以2的?

第一个提示

在行Dim col1, col2, row1, row2 As Long – 只有row2声明为Long ,但其他variables是Variant

你应该使用Dim col1 As Long, col2 As Long, row1 As Long, row2 As Long 。 其他声明也一样。

第二个提示 :在Rng1.Cells(row1 + i - row1, col1)Rng1.Cells(row1 + i - row1, col1) – expression式row1 + i - row1总是等于i

第三个提示:在使用Rng1.Cells(row1 + i - row1, col1)它的工作方式就像从底部的偏移量i-1从右上angular的 col1-1col1-1左上angular单元格 Rng1

所以对于D2:D61范围col1将等于4 ,这意味着Rng1.Cells(1, col1)G2 (偏离底部1-1D2从右边4-1 ),这不是你期待。

试试这个function:

 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