我正在使用我从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) & ")"
调试器使它通过第一个函数调用,但不是第二个&第三。我收到的错误是“期望变量或程序,而不是模块”的类型。在第二种情况下,我得到了其他错误,而我的头脑是如此模糊,我无法回想起它们。
非常感谢任何帮助。我已经没想完了。非常感谢!
答案 0 :(得分:2)
您几乎不需要将列转换为字母。首先考虑使用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
答案 1 :(得分:1)
以下函数将列号转换为字母:它利用.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
注意我在语句的iCol
部分使用了rCol
而不是Cells(Start(groups)-1, iCol) =
。这可能不是唯一的错误...
答案 2 :(得分:1)
您正在使用的功能有问题。检查此示例
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)