2014-02-21 71 views
1

我正在创建一个UDF,用于生成一个字符串,我可以将其放入HighCharts。因此,基本上,我将两个范围的数据(数字或文本)输入到UDF中,并输出一个字符串或格式化的对,如下所示[[DataX,DataY],[DataX1,DataY1],...]VBA用户定义函数返回奇怪或无结果

事情对第一个范围来说工作得很好,但第二个范围给我垃圾结果。

这里是我的代码:

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:1061)

结果并没有道理给我。第一个数据范围开始一行太低。我得到几个什么都没有值,然后过了一段时间,我开始从第29列表的另一部分获得数据。我猜测它是从第29列的空单元格开始的,但我不知道为什么会这样。

这里有另一条线索可能有助于了解这一点。如果我使用公式= hcp(A2:A61,B2:B61),则公式从A和C获取数据并向下搜索。它在哪里添加额外的列?当我做= hcp(A2:A61,C2:C61)它开始于A和E.当我放入= hcp(A2:A61,D2:D61)时,我得到A和G结果。

当我将其更改为this = 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从右侧左上方的单元格Rng1

所以对于D2:D61范围col1将等于4,这就是意味着Rng1.Cells(1, col1)G2(偏移至底部1-1和向右4-1D2),它不是你期待什么。

试试这个函数:

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 
+1

太谢谢你了!这非常有帮助。完美的作品!明白我的教训。 – Crimpy