Здравствуйте форумчане. Случилась такая неприятность. Есть функция для записи массива в таблицу - она там подгоняет размеры таблицы, форматирование и т.п. Непосредственно запись массива в таблицу делает строчка
Донедавна все это успешно работало, а сейчас выдает такой вот результат (bug.png) При этом если тот же массив записать в цикле
Код
For i = LBound(rezult) To UBound(rezult)
For n = LBound(rezult, 2) To UBound(rezult, 2)
.DataBodyRange.Cells(i, n) = rezult(i, n)
Next n
Next i
то все записывается нормально и результат уже такой (correct.png) Это происходит только с одним массивом в книге.
Файл прикреписть не могу, так как массив получается из базы данных. Соответственно если его записать на лист и потом считывать, то ошибки не происходит. Есть идеи что может вызывать подобное поведение? Оффис 365.
Пробовал и value2 и Formula - результат тот же. Как сейчас оказалось - это не единственная таблица в книге, у которой такой глюк. В массиве все данные есть. Ну и опять таки - если тот же массив записать циклом, то ОК, только долго.
При чем, если выбрать данные только за сегодня - то они записываються, если за болший период - то такой глюк.
Dima S, здравствуйте Проверьте - нет ли On Error Resume Next (мешает опознать ошибку) Выгрузите НЕ в таблицу. Если нормально, то дело не в массиве, а в таблице и функциях работы с ней Если массив двумерный, то лучше указывать ОБЕ размерности: arr(r, 1) и arr(r, 2)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Все филтры очищены. При выгрузке просто на лист, не в таблицу, или в новую таблицу на новом листе, в новой книге - такая же фигня. Или что то не так с данными, или очередное обновление майкрософта что то сломало. При этом больше склоняюсь ко второму варианту, ибо за прошлые периоды тоже такой глюк, хотя раньше все работало и данные никто не менял.
Тут еще понимать бы как данные в массив попадают. Как вариант опять же - попробовать перезаписать массив самим собой, а потом выгрузить:
Код
For i = LBound(rezult) To UBound(rezult)
For n = LBound(rezult, 2) To UBound(rezult, 2)
rezult(i, n) = rezult(i, n)
Next n
Next i
.DataBodyRange.Cells(1,1).Resize(UBound(rezult) - LBound(rezult) + 1, UBound(rezult, 2) - LBound(rezult, 2) + 1).Value = rezult
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
' transpose array -----------------------------------
ReDim arr_transposed_data(1 To UBound(arr_data, 2) + 1, 1 To UBound(arr_data) + 1)
For i = LBound(arr_transposed_data) To UBound(arr_transposed_data)
For n = LBound(arr_transposed_data, 2) To UBound(arr_transposed_data, 2)
arr_transposed_data(i, n) = arr_data(n - 1, i - 1)
Next n
Next i
только эта функция уже годы работала без проблем.
Попробовал все советы выше - результат неизменный.
Такое поведение может быть следствием ранее возникшей ошибки (работы в режиме On Error Resume Next; неверное обращение к Windows API и т.д). Постарайтесь сократить количество данных и объем кода (но так, чтобы ошибка оставалась) до минимально возможного размера.
Ощущение что есть лимит на размер массива. Потому что если в sql выборке установить лимит на количество строк, то при количестве строк до 4 - все записывается, больше - пропуски. В других - более узких таблицах количество строк без пропусков еще больше.
Я вообще не понимаю что происходит, так как эти функции (запрос к БД и запись массива ни лист) - общие для всех листов в книге, но при этом одни листы записываются нормально, а другие нет.
упростил. получение массива из запроса опустим, ибо массив заполняется и исходный массив один и тот же для двух случаев. Все сводится к тому что
Код
tabl.DataBodyRange.Value = rezult 'Value2/Formula
не работает (то есть записывает только числовые и НЕКОТОРЫЕ СТРОЧНЫЕ значения)
Код
For i = LBound(rezult) To UBound(rezult)
For n = LBound(rezult, 2) To UBound(rezult, 2)
.DataBodyRange.Cells(i, n).Value = rezult(i, n)
Next n
Next i
записывает все как надо. массив rezult - один и тот же в обоих случаях. Если проблема в данных - то что такого может содержать элемент массива, чтобы "затереть" данные другого элемента?
Dima S написал: что такого может содержать элемент массива, чтобы "затереть" данные другого элемента?
черт возьми - таки может! длина строки некоторых ячеек из последних 4 столбцов превышала максимальный размер данных в ячейке - из-за этого такой странный эффект. убрал последние 4 столбца - все пишет.
Извините что морочил голову) Может кому то пригодится и такой опыт)