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-1
到col1-1
的左上angular单元格 Rng1
。
所以对于D2:D61
范围col1
将等于4
,这意味着Rng1.Cells(1, col1)
将G2
(偏离底部1-1
和D2
从右边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