【问题标题】:Error on Assigning Function Output to Variable Excel VBA将函数输出分配给变量 Excel VBA 时出错
【发布时间】:2013-03-27 00:30:15
【问题描述】:

我正在使用从 Microsoft 复制的函数,该函数采用列号并重新分配列字母。我需要这样做来创建一个公式。我已经研究了一整天,无法查明错误的原因(我也尝试将其作为子过程来完成)。该功能在其自己的模块中。我测试了它,它工作正常:

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) & ")"

调试器通过了第一个函数调用,但没有通过第二个和第三个函数调用。我收到的错误是“期望变量或过程,而不是模块”的类型。在第二种情况下,我得到了其他错误,我的脑袋很模糊,我想不起来了。

非常感谢任何帮助。我已经没有想法了。非常感谢!

【问题讨论】:

  • 你在用什么这么大的功能 :) 看到这个链接 这是一个 1 行代码 stackoverflow.com/questions/10106465/… 现在阅读剩下的问题 :)
  • 调试行的时候Cells(Start(groups) - 1, rCol).Formula...Start(groups)的值是多少,Start()有什么作用?
  • 什么是Start(groups)
  • I am using a function that I copied from Microsoft 可以分享一下链接吗?
  • @siddharthRout - 链接是 support.microsoft.com/kb/833402 。写那个例子的人真的应该看看我的替代解决方案......

标签: vba excel


【解决方案1】:

您几乎不需要将列转换为字母。首先考虑使用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,可以直接使用Address

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

【讨论】:

  • 我不知所措。非常非常非常非常感谢!!!!!!有效。你救了我几天(因为我确实花了几天时间试图弄清楚这一点)。要回答其他问题,“组”变量与 start(groups) 和 end(groups) 一起使用,将电子表格分组为 3 级分组和隐藏列的键。它根据前几列中的颜色代码和内容确定组的开始和结束位置。再次非常感谢大家。
【解决方案2】:

您使用的功能有问题。检查这个例子

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)

【讨论】:

  • 当我需要转换时,我会。您的解决方案不仅是正确的,而且(从编码人员的角度来看 - 尽管一个非常“老”并且可能在 20 年内没有专业编码的人),更优雅。现在我将采用迪克的解决方案。感谢您发帖,因为其他关注此链接的人会找到更好(即正确)的解决方案来将列号转换为字母。
【解决方案3】:

以下函数将列号转换为字母:它利用.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) = 部分使用了iCol 而不是rCol。这可能不是唯一的错误......

【讨论】:

  • 弗洛里斯,感谢您的解决方案。正如我向 Siddarth 指出的那样,虽然我决定接受 Dick 的建议,但当其他人检查此帖子时,他们会欣赏将列号转换为字母的准确解决方案。再次感谢您的时间和精力。我可以欣赏优雅的代码,而你的也是。
  • 感谢您的称赞。如果这是最能回答您的问题的答案,您应该“接受”迪克的答案——或者如果您认为它对其他人更有用,请接受我的答案。无论哪种方式,单击那个小复选标记是您告诉该页面的未来访问者您的意见的方式。您还可以投票替代答案以显示“这也不是一个糟糕的解决方案”。为此,您至少需要 15 个声望。
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
相关资源
最近更新 更多