我正在创建一个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的呢?
答案 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-1
从4-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