2014-09-24 43 views
2

Excel specifications and limits說最大字符數:獲取一個單元格可以包含

Total number of characters that a cell can contain: 32,767 characters

有沒有一種方法以編程方式得到這個數字?

我在問,因爲一般情況下,如果可行的話硬編碼常量應該避免。這個數字可能會被Office版本改變(它在20032013之間沒有變化,但誰知道微軟爲我們存儲了什麼)。

這是很容易獲得工作表的最大行數:

Sheet1.Rows.Count ' returns 65,536 in Office 2003 and 1,048,576 in Office 2007-2013 

但顯然,讓一個單元格可以包含的字符的最大數量就沒有那麼簡單。

請注意,將太多字符寫入單元格不會導致錯誤;它會靜靜地失敗並截斷字符串 - 因此,適當的錯誤處理在這裏不是一個選項。

+0

我懷疑它在Excel中是硬編碼的,因此不會暴露在註冊表中的任何地方。那就是說,你有沒有試過註冊表搜索? – 2014-09-24 11:42:06

+0

我認爲這個限制強烈地與公式欄中的字符數限制有關。公式欄可能是像System.Controls.Textbox這樣的API控件之一,它接受System.Int32的.MaxLength屬性,它可以以某種方式解釋32,767個字符的限制。 – 2014-09-24 11:42:35

回答

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) 

這裏的一個變種我們在哪裏取expone幾個步驟(更大和更大的步驟,其尺寸每次增加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太大,那麼你寫了一個很長的字符串到這個單元格,這很慢。
  • 確保最後一次迭代永遠不會超出內存限制(我的系統上約有1.3億個字符)。 (可能會添加錯誤處理來處理這種可能性。)

stepFactor介於2到8之間的值應該穩健且快速。

+1

啊直接的運行時錯誤:'WorksheetFunction.Rept(「A」,32767&+ 1)'因此可能假設內部函數受限於單元格的相同方式 – 2014-09-24 11:52:44

+0

'Space $(A_BIG_NUMBER)'和'Len'方法是(A_BIG_NUMBER「爲0.88秒= 1.3億,看起來像我的系統上限,大於」內存不足「,更大的」超出字符串空間「)。缺點是最大允許的'A_BIG_NUMBER'可能因系統而異,具體取決於內存。我猜想在對數刻度和錯誤陷阱的幾個猜測,我們會安全的。 – 2014-09-24 12:01:41

+0

當軟件不像這樣公開基本的常量時,它總是很煩人的,尤其是像Excel那樣,它有一個豐富的對象模型 – 2014-09-24 12:02:57

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

難道你不能從32767('sIn = space $(32767)')開始並從那裏出發? – 2014-09-24 11:24:24

+1

是的,如果我們確信微軟不會*最大限度地減少*! – 2014-09-24 12:02:41

相關問題