Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2009, 06:52   #1
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию Непонятное ограничение.

Уважаемые форумчане!
Столкнулся с проблемой, которую не могу объяснить. Для примера, во вложении на листе 1 есть таблица из 300 строк и 26 столбцов. В макросе "test" объявляется и заполняется массив, размерностью 26 х 1. Каждый элемент массива представляет собой сцепленные через пробел 300 значений соответствующего столбца, т.е. длинное строковое значение. (повторюсь, что это для примера. В реальном случае, массив формируется гораздо сложнее, но суть та же). Так вот, требуется вставить элементы полученного массива на лист 2 в столбец "A". В коде макроса два варианта. Если организовать цикл по всем элементам массива и вставлять в ячейки столбца по одному значению, то все работает (вариант 2 в коде). А если попытаться просто вставить массив в требуемый диапазон (вариант 1, в коде закомментирован), то получим ошибку. При чем, если убавлять количество строк (длину элементов массива), то наступит момент, когда ошибка исчезнет.
Массив формируется. Данные в ячейки вставляются. Вопрос: в чем (где) ограничение?
Вложения
Тип файла: rar Test.rar (13.1 Кб, 15 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 06.08.2009, 13:43   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

SAS888, это известная ошибка EXCEL 2003
http://support.microsoft.com/kb/818808/en-us
Она возникает при попытке присвоить рангу массив с длиной строки (элемента массива) больше 911 символов

Последний раз редактировалось Aent; 06.08.2009 в 13:47.
Aent вне форума Ответить с цитированием
Старый 06.08.2009, 14:28   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Спасибо за информацию. Был я по этой ссылке. Но что-то здесь не так.
В приведенном выше примере, при формировании массива, ошибки не возникает. И если просто перебором элементов массива вставлять их в ячейки листа (см. вариант с циклом For...Next в коде макроса), то ошибки также нет. Т.е. ошибка появляется в момент вставки массива в диапазон ячеек рабочего листа.
Для примера, попробуйте выполнить код:
Код:
Sub Test2()

    Dim a(1 To 5, 1 To 1), i As Integer
    a(1, 1) = String(1000, "A")
    a(2, 1) = String(1000, "B")
    a(3, 1) = String(1000, "C")
    a(4, 1) = String(1000, "D")
    a(5, 1) = String(1000, "E")
    
    For i = 1 To 5
        Cells(i, 1) = a(i, 1)
    Next
    
End Sub
Как видите, ошибки нет. Массив без проблем "переваривает" элементы, содержащие 1000 символов.
Но если в коде вместо цикла вывода элементов массива в ячейки использовать [A1:A5].Value = a, то будет ошибка.
Я делаю вывод, что ограничение на элемент массива в 911 символов не есть правильно.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 06.08.2009, 15:00   #4
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Может дело в свободной памяти? Либо версия Excel.
У меня 2007 и все работатет на УРА. 2003 нет, так что проверить не на чем...
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 06.08.2009, 15:32   #5
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

SAS888, это именно та ошибка. Она возникает при присваивании
массива а не элемента массива.
Код:
Sub test()
    Dim i As Long, j As Long, a(1 To 1, 1 To 1) As String
    a(1, 1) = String(912, "!")
    On Error Resume Next
    [A1].Value = a
    If Err.Number <> 0 Then
       Debug.Print "Ошибка при длине строки 912 при присваивании массива"
       Err.Clear
    End If
    [A1].Value = a(1, 1)
    If Err.Number = 0 Then
       Debug.Print "Нет ошибки при присваивании элемента массива с длиной строки 912"
       Err.Clear
    End If
    a(1, 1) = String(911, "!")
    On Error Resume Next
    [A1].Value = a
    If Err.Number = 0 Then
       Debug.Print "Нет ошибки при длине строки 911 при присваивании массива"
       Err.Clear
    End If
End Sub
То же самое с одномерным массивом
Код:
Public Sub test()
   Dim a(1 To 1) As String
   a(1) = String(912, "!")
   [A1] = a  'будет ошибка
   [A1]=a(1) 'не будет ошибки - присваивается не массив
   a(1) = String(911, "!")
   [A1] = a   'не будет ошибки
End Sub

Последний раз редактировалось Aent; 06.08.2009 в 16:17.
Aent вне форума Ответить с цитированием
Старый 07.08.2009, 04:45   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
возникает при присваивании массива а не элемента массива.
Совершенно верно. Так, что можно формировать массив с элементами, содержащими более 911 символов, и нет никаких проблем и ограничений по работе с таким массивом внутри VB. Ограничение лишь в том (для 2003), что нельзя присвоить диапазону ячеек такой массив. Однако, поэлементно можно.
Т.е. в подобных случаях, если существует возможность получить массив с такими элементами, то, для надежности, следует, наверное, отключить обработку ошибок, попробовать вставить массив в диапазон ячеек, и если получаем ошибку, то тогда вставляем не массив, а его элементы в цикле. Так?
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 07.08.2009, 13:20   #7
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

По всей видимости именно так и надо поступать.
Серьёзные проблемы возникают при использовании ADO. Скажем для метода CopyFromRecordset. Там вылазит та же самая ошибка.
Aent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что-то непонятное.. Busine2009 Microsoft Office Word 4 10.07.2009 21:44
Непонятное задание. Dmitry81 Помощь студентам 11 11.01.2009 16:27
Непонятное задание. Dmitry81 Microsoft Office Excel 2 10.01.2009 12:38
Непонятное условие SunKnight Паскаль, Turbo Pascal, PascalABC.NET 3 29.11.2008 23:01