Страницы: 1
RSS
Глюк - рандомное копирование массива на лист
 
Здравствуйте форумчане.
Случилась такая неприятность.
Есть функция для записи массива в таблицу - она там подгоняет размеры таблицы, форматирование и т.п.
Непосредственно запись массива в таблицу делает строчка
Код
            .DataBodyRange.Resize(UBound(rezult) - LBound(rezult) + 1, UBound(rezult, 2) - LBound(rezult, 2) + 1).Value = rezult
Донедавна все это успешно работало, а сейчас выдает такой вот результат (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.

Спасибо.
Изменено: vikttur - 21.09.2021 18:25:18
 
А Вы проверяли последовательно значения самого массива, перед выгрузкой? Он заполнен? Если да - попробуйте не Value, а Value2.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Мое сердце чует Unicode в исходных данных.... :)
Кому решение нужно - тот пример и рисует.
 
Пробовал и value2 и Formula - результат тот же.
Как сейчас оказалось - это не единственная таблица в книге, у которой такой глюк.
В массиве все данные есть.
Ну и опять таки - если тот же массив записать циклом, то ОК, только долго.

При чем, если выбрать данные только за сегодня - то они записываються, если за болший период - то такой глюк.
Изменено: Dima S - 21.09.2021 18:05:22
 
Dima S, здравствуйте
Проверьте - нет ли On Error Resume Next (мешает опознать ошибку)
Выгрузите НЕ в таблицу. Если нормально, то дело не в массиве, а в таблице и функциях работы с ней
Если массив двумерный, то лучше указывать ОБЕ размерности: arr(r, 1) и arr(r, 2)
Изменено: Jack Famous - 21.09.2021 18:03:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Выгрузка массива в диапазон может пройти некорректно если стоит автофильтр. Попробуйте перед выгрузкой Sheets(...).ShowAllData
 
попробуйте так:
Код
.DataBodyRange.Cells(1,1).Resize(UBound(rezult) - LBound(rezult) + 1, UBound(rezult, 2) - LBound(rezult, 2) + 1).Value = rezult
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Все филтры очищены.
При выгрузке просто на лист, не в таблицу, или в новую таблицу на новом листе, в новой книге - такая же фигня.
Или что то не так с данными, или очередное обновление майкрософта что то сломало.
При этом больше склоняюсь ко второму варианту, ибо за прошлые периоды тоже такой глюк, хотя раньше все работало и данные никто не менял.

P.S.

убрал все, оставил
Код
 tabl.DataBodyRange.Value = rezult

аналогичный результат (пропуски данных)
Изменено: Dima S - 21.09.2021 18:20:05
 
Тут еще понимать бы как данные в массив попадают. Как вариант опять же - попробовать перезаписать массив самим собой, а потом выгрузить:
Код
        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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Тут еще понимать бы как данные в массив попадают
из Рекордсета
Код
arr_data = .GetRows

потом arr_data транспонируется

Код
            ' 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


только эта функция уже годы работала без проблем.

Попробовал все советы выше - результат неизменный.
Изменено: Dima S - 21.09.2021 18:26:24
 
Такое поведение может быть следствием ранее возникшей ошибки (работы в режиме On Error Resume Next; неверное обращение к Windows API и т.д). Постарайтесь сократить количество данных и объем кода (но так, чтобы ошибка оставалась) до минимально возможного размера.
Владимир
 
Ощущение что есть лимит на размер массива.
Потому что если в sql выборке установить лимит на количество строк, то при количестве строк до 4 - все записывается, больше - пропуски.
В других - более узких таблицах количество строк без пропусков еще больше.


Я вообще не понимаю что происходит, так как эти функции (запрос к БД и запись массива ни лист) - общие для всех листов в книге, но при этом одни листы записываются нормально, а другие нет.
Изменено: Dima S - 21.09.2021 18:54:50
 
А как объяснить:
Цитата
При этом если тот же массив записать в цикл, то все записывается нормально
В любом случае два последовательных действия:
1. Данные заносятся в переменную типа Variant.
2. Из переменной данные переносятся на лист.

См. #11
Изменено: sokol92 - 21.09.2021 18:56:27
Владимир
 
упростил.
получение массива из запроса опустим, ибо массив заполняется и исходный массив один и тот же для двух случаев.
Все сводится к тому что

Код
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 - 21.09.2021 19:50:45
 
Цитата
Dima S написал:
что такого может содержать элемент массива, чтобы "затереть" данные другого элемента?
черт возьми - таки может!
длина строки некоторых ячеек из последних 4 столбцов превышала максимальный размер данных в ячейке - из-за этого такой странный эффект.
убрал последние 4 столбца - все пишет.

Извините что морочил голову)
Может кому то пригодится и такой опыт)
 
Да, интересно, спасибо за исследование!
Владимир
Страницы: 1
Наверх