Excel specifications and limits说:
单元格可包含的字符总数: 32,767 个字符
有没有办法以编程方式获取此数字?
我问,因为一般情况下,如果可行的话,应该避免使用硬编码常量。这个数字可能会被Office版本改变(它在2003和2013之间没有变化,但谁知道微软为我们存储了什么)。
在工作表中获取最大行数非常容易:
Sheet1.Rows.Count ' returns 65,536 in Office 2003 and 1,048,576 in Office 2007-2013
但显然,获取单元格可以包含的最大字符数并不是那么简单。
请注意,向单元格写入太多字符不会导致错误;它将默默地失败并截断字符串 - 因此正确的错误处理不是一个选项。
答案 0 :(得分:2)
在循环中,将字符逐个附加到单元格内容。每次读取单元格内容,检查是否存在添加的最后一个字符。如果不是那么那就是限制。
上行:工作并且100%可靠。
下行:真的很慢。由于对工作表进行了大量读写操作,因此需要10-15秒才能完成。
显然,这可以通过使用好的猜测(例如32,767)作为初始条件并使用狩猎和放大来优化。平分搜索算法而不是递增1.然而,如果答案远离初始猜测,则可能仍需要约1秒才能运行 - 而不是您想要重复调用的东西。
Function MaximumNumberOfCharactersACellCanContain(r As Range)
'NB: Range r will be overwritten.
Dim sIn As String
Dim sOut As String
Dim i As Long
Application.ScreenUpdating = False
Do
i = i + 1
sIn = sIn & Chr(97 + (i - 1) Mod 26)
r.Cells(1, 1).Value = sIn
sOut = r.Cells(1, 1).Value
If Right(sOut, 1) <> Right(sIn, 1) Then Exit Do
'If Len(sOut) <> Len(sIn) Then Exit Do
Loop
Application.ScreenUpdating = True
MaximumNumberOfCharactersACellCanContain = i - 1
End Function
使用示例:
MsgBox MaximumNumberOfCharactersACellCanContain(Range("A1"))
答案 1 :(得分:1)
替代方法:循环追加一个块,直到指定的长度不是预期的
Const INT_MAX As Integer = 32767
Dim i As Long
ActiveCell.Value = ""
Dim buff As String: buff = Space$(INT_MAX)
Do
i = i + 1
ActiveCell.Value = ActiveCell.Value & buff
If Len(ActiveCell.Value) <> (i * INT_MAX) Then
MaxLen = Len(ActiveCell.Value)
Exit Function
End If
Loop
甚至
ActiveCell.Value = Space$(A_BIG_NUMBER)
MaxLen = Len(ActiveCell.Value)
这是一个变体,我们采用指数步骤(越来越大的步骤,其大小每次增加一个因子stepFactor
)。
Function MaximumNumberOfCharactersACellCanContain(r As Range, _
Optional ByVal stepFactor As Double = 2)
Dim n As Double
Dim nActual As Long
Dim l As Long
n = 1
Do
n = n * stepFactor
nActual = CLng(n)
r.Cells(1, 1).Value = Space$(nActual)
l = Len(r.Cells(1, 1).Value)
If l <> nActual Then
MaximumNumberOfCharactersACellCanContain = l
Exit Function
End If
Loop
End Function
使用示例:
Debug.Print MaximumNumberOfCharactersACellCanContain(Range("A1"), 8)
stepFactor
的选择是:
stepFactor
太大,那么您要在单元格中写一个很长的字符串,这很慢。 stepFactor
介于2到8之间应该是健壮且快速的。