将函数输出分配给变量Excel的错误VBA

问题描述:

我正在使用从Microsoft复制的函数,该函数需要一个列号并重新分配列字母。我需要这样做来创建一个公式。我一整天都在研究,无法确定我错误的原因(我也试图将其作为子过程来完成)。该功能位于其自己的模块中。我测试了它和它的作品罚款:将函数输出分配给变量Excel的错误VBA

Function ConvertToLetter(ByRef iCol As Integer) As String 
    Dim iAlpha As Integer 
    Dim iRemainder As Integer 
    iAlpha = Int(iCol/27) 
    iRemainder = iCol - (iAlpha * 26) 
    If iAlpha > 0 Then 
    ConvertToLetter = Chr(iAlpha + 64) 
    End If 
    If iRemainder > 0 Then 
    ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64) 
    End If 
End Function 

这是给我的错误代码是:

For groups = 1 To i ' level 1 grouping 
    For iCol = 24 To 136 
     rCol = ConvertToLetter(iCol) 
     Cells(Start(groups) - 1, rCol).Formula = "=COUNTA(" & rCol & Start(groups) & ":" & rCol & Finish(groups) & ")" 
    Next 
Next 

我试图函数代入公式本身:

Cells(Start(groups) - 1, ConvertToLetter(iCol)).Formula = "=COUNTA(" & ConvertToLetter(iCol) & Start(groups) & ":" & ConvertToLetter(iCol) & Finish(groups) & ")" 

的调试器使其通过第一个函数调用,但不是第二个。我收到的错误是“期待变量或过程,而不是模块”的类型。在第二种情况下,我得到了其他的错误,而我的头很模糊,我不记得他们。

任何帮助,非常感谢。我已经用完了想法。非常感谢!

+0

你在使用这么大的功能:)看到这个链接是一个1行代码http://stackoverflow.com/questions/10106465/excel-column-number-from-column-name/10107264#10107264现在阅读其余的问题:) – 2013-04-04 19:07:57

+0

当你调试行'Cells(Start(groups) - 1,rCol)。Form'...'Start(groups)'的值是多少?'Start()'做了什么? – 2013-04-04 19:10:55

+0

什么是“开始(组)”? – Floris 2013-04-04 19:17:28

你几乎不必列转换为文字。首先考虑使用FormulaR1C1

For groups = 1 To i ' level 1 grouping 
    For iCol = 24 To 136 
     lLast = Finish(groups) - Start(groups) + 1 
     Sheet1.Cells(Start(groups) - 1, iCol).FormulaR1C1 = _ 
      "=COUNTA(R[1]C:R[" & lLast & "]C)" 
    Next iCol 
Next groups 

如果你不喜欢R1C1,您可以用地址更直接

For groups = 1 To i ' level 1 grouping 
    For iCol = 24 To 136 
     Set rStart = Sheet1.Cells(Start(groups), iCol) 
     Set rEnd = Sheet1.Cells(Finish(groups), iCol) 

     rStart.Offset(-1, 0).Formula = _ 
      "=COUNTA(" & rStart.Address & ":" & rEnd.Address & ")" 

    Next iCol 
Next groups 
+0

我不知所措。非常非常感谢你,非常非常感谢!有效。而且你为我节省了时间(因为我花了几天的时间试图弄清楚这一点)。要回答其他问题,“组”变量与起始(组)和结束(组)一起使用,以将电子表格分组到隐藏列的3个分组和键级别。它根据前几栏中的颜色代码和内容计算出组的开始和结束位置。非常感谢你,所以非常感谢。 – Aerogal31 2013-04-05 13:00:59

以下函数将列号转换为字母:它利用了.Address方法来大大简化生活。

Function convertToLetter(colnum) 
mycell = [A1].Offset(0, colnum - 1).Address 
convertToLetter = Mid(mycell, 2, Len(mycell) - 3) 
End Function 

但现在,我看你的代码 - 当您使用Cells功能,你应该用数字,而不是字母调用它。所以你有另一个问题!

尝试以下操作:

For groups = 1 To i ' level 1 grouping 
    For iCol = 24 To 136 
     rCol = ConvertToLetter(iCol) 
     Cells(Start(groups) - 1, iCol).Formula = "=COUNTA(" & rCol & Start(groups) & ":" & rCol & Finish(groups) & ")" 
    Next 
Next 

注意我在发言的Cells(Start(groups)-1, iCol) =部分使用iColrCol。它可能不是唯一的错误...

+0

弗洛里斯,感谢您的解决方案。正如我向Siddarth表示的那样,虽然我决定采用迪克的建议,但当其他人检查这篇文章时,他们会意识到将列号转换为字母的准确解决方案。再次感谢您的时间和精力。我可以欣赏优雅的代码,而你的是。 – Aerogal31 2013-04-05 13:14:02

+0

我很欣赏恭维。你应该“接受”迪克的答案,如果那是最好回答你的问题的答案 - 或者如果你认为它对其他人更有用,那么接受我的答案。无论哪种方式,点击这个小复选标记就是你告诉这个页面的未来访问者你的意见的方式。您也可以通过提供其他答案来展示“这不是一个糟糕的解决方案”。你至少需要15点的声望。 – Floris 2013-04-05 13:23:05

您使用的功能是错误的。检查这个例子

Sub Sample() 
    Dim iCol As Integer 
    For iCol = 131 To 134 
     Debug.Print iCol; ConvertToLetter(iCol) 
    Next iCol 
End Sub 


Function ConvertToLetter(ByRef iCol As Integer) As String 
    Dim iAlpha As Integer 
    Dim iRemainder As Integer 
    iAlpha = Int(iCol/27) 
    iRemainder = iCol - (iAlpha * 26) 
    If iAlpha > 0 Then 
     ConvertToLetter = Chr(iAlpha + 64) 
    End If 
    If iRemainder > 0 Then 
     ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64) 
    End If 
End Function 

输出

131 D[ 
132 D\ 
133 D] 
134 D^ 

使用此代码,这是我从我提到的链接回升。

rcol = Split(Cells(, iCol).Address, "$")(1) 

代替

rCol = ConvertToLetter(iCol) 
+0

当我需要转换时,我会。你的解决方案不仅是正确的,而且(从编码人员的角度来看 - 尽管一个人非常“古老”,而且大概20年没有专业编码),更加优雅。现在我要与迪克的解决方案。感谢您发布信息,因为遵循此链接的其他人会发现将列号转换为字母的更好(即正确的)解决方案。 – Aerogal31 2013-04-05 13:09:36