2014-09-24 3 views
2

Excel specifications and limits говорит:Получить максимальное количество символов, которые клетка может содержать

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

Есть ли способ, чтобы получить этот номер программно?

Я спрашиваю, потому что в общем случае следует избегать постоянных констант кодирования, если и когда это возможно. Возможно, это число изменится по версии Office (оно не изменилось между и 2013, но кто знает, что у Microsoft есть для нас).

Это довольно легко, чтобы получить максимальное количество строк на листе:

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

, но, по-видимому, получить максимальное количество символов, которые клетка может содержать не так просто.

Обратите внимание, что запись слишком большого количества символов в ячейку не приведет к ошибке; он будет автоматически терпеть неудачу и усекать строку - поэтому правильная обработка ошибок здесь не является вариантом.

+0

Я подозреваю, что он жестко закодирован в Excel и поэтому не отображается в любом месте реестра. Тем не менее, вы пробовали поиск в реестре? –

+0

Я думаю, что предел сильно связан с пределом символов в строке формулы. Панель формул, вероятно, является одним из элементов управления API, таких как System.Controls.Textbox, который принимает свойство 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 слишком велико, то вы пишете очень длинную строку в ячейке, и это довольно медленно.
  • Убедившись, что последняя итерация никогда не ударит по потолку с памятью (~ 130 миллионов символов в моей системе). (Возможно, обработка ошибок справляется с этой возможностью.)

stepFactor где-то между 2 и 8 должно быть надежным и быстрым.

+1

Ошибка немедленного запуска: 'WorksheetFunction.Rept (« A », 32767 & + 1)' поэтому, возможно, предполагается, что внутренние функции ограничены таким же образом, что ячейка равна –

+0

Подход 'Space $ (A_BIG_NUMBER)' и 'Len' (0.88 с для 'A_BIG_NUMBER' = 130 миллионов, который выглядит как верхний предел моей системы, более крупный дает« вне памяти », еще больше« из строкового пространства »). Недостатком является то, что максимально допустимый 'A_BIG_NUMBER' может варьироваться в зависимости от системы в зависимости от памяти. Думаю, с некоторыми догадками в логарифмической шкале и захвате ошибок мы будем дома в безопасности. –

+0

Его всегда раздражает, когда программное обеспечение не раскрывает такие фундаментальные константы, как это, особенно когда Excel имеет богатую объектную модель. –

2

В цикле добавьте символы один за другим к содержимому ячейки. Каждый раз, прочитав содержимое ячейки, проверьте, присутствует ли последний добавленный символ. Если это не так, это предел.

Потенциал: работает и на 100% надежно.

Даунсайд: Действительно медленный. Это займет 10-15 секунд, из-за большого количества операций чтения-записи на/из листа.

Очевидно, что это можно было бы оптимизировать, используя хорошее предположение (например, 32,767) в качестве исходного условия и используя алгоритм поиска bisect & вместо увеличения на 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)') и идти оттуда? –

+1

Да, если мы уверены, что Microsoft не будет * уменьшать * этот максимум! –

Смежные вопросы