Страницы: 1
RSS
Ошибки при чтении массивов
 
Добрый день. Подскажите пожалуйста не возникало ли у кого таких ситуаций, которые опишу я ниже.
При записи некоторого большого диапазона в массив, неважно в каком файле, данные баги замечаю не первый раз.
Например:
Код
Dim Arr(), i&, s$
Arr()=Range("A1:P34000").value
For i=1 to 34000
If s=arr(i,2) then Бла бла
Next

Код от балды.
Но суть такая, что при чтении его циклом, когда в нём что-то ищем и находим. При выводе этого найденного значения под индексом i выводится другой результат +-1 от значения i.
Т.е. нашли нужное в строке i=5 а выводит значение под i=6 или i=4 хотя пишет, что i=5.
Я встречаю такой баг уже не первый раз. При обработке массива выводится не то значение, которое по факту. И если запустить ещё раз, то всё нормально. От чего это зависит я не понимаю. Можно работать месяц и всё нормально, а потом раз и вот оно не тот результат. А можно раз 100 запустить массив и раза 2 не то выдаст.
То ли это какой-то баг при записи в память, то ли что-то другое, но точно не в коде. Так как нет ничего сверхестественного. Обычный цикл по массиву.
Я один такой или у кого-то такое тоже проявлялось. Хочу подметить, что такое только при записи диапазона в массив.
Изменено: Alemox - 10.12.2018 10:14:18
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, доброго утра! Первый раз такое вижу/слышу. А вы ТОЧНО уверены, что выводит именно не то? Если да, то это очень тревожный момент…

Попробуйте объявить массив через Variant и/или цикл сделать For Each. Проблема при этом сохраняется? Ещё может у вас Option Base стоит и границы массива не стандартные, отсюда и разброс в +-1 (хотя метод Range.Value от этого не зависит) — уж очень не хочется думать о том, что подобные "ошибки с выводом" могут иметь место быть
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, По поводу  Option Base тут не играет роль. Я говорю про то что тут В разных проектах и не только на моём компе. Вот вчера опять один из клиентов прислал видео того как выводит разные варианты из одного и того же массива. До этого у коллег на работе в другом совершенно файле такая же ерунда. Бывало даже такое, что массив неверно выдаёт до тех пор пока не закроешь файл и не откроешь его заново.
Тут именно что при присвоении диапазона большого с листа в массив.
Изменено: Alemox - 10.12.2018 10:46:29
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, можно Вас попросить осветить конфигурацию систем, на которых происходит подобная ошибка? (ОС и офис - версия и разрядность) Так сказать, чтобы понимать "группу риска". Спасибо.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
W7 x86 Максимальная
Office 2010 x86
Это мои характеристики.
Но у коллег компы
W7 Professional x64
Office 2013 x64
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Ни разу не встречался с подобным.
 
Alemox,
Цитата
Jack Famous: Попробуйте объявить массив через Variant и/или цикл сделать For Each
отпишитесь — измениться ли что-либо
Цитата
Юрий М: Ни разу не встречался с подобным
+ не слышал о подобных проблемах (Win7 Домашняя базовая, SP1, x64)
Изменено: Jack Famous - 10.12.2018 11:12:15
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ну, коли такого не было ни у кого, тогда буду сам пытаться понять и отследить почему так происходит. Хотя как тут отследишь, если оно проявляется редко.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Вдруг где-то рядом?

Я вчера тему создавал. Тоже непонятная ошибка при работе с диапазоном.
StoTisteg тоже жаловался, но я еще не разбирался в его проблеме и решении.
 
Alemox, Вы можете сделать пример (макрос + возможно, файл), который демонстрирует появление ошибки на Вашей системе и системах других пользователей?
Желательно описать как запустить макрос, чтобы добиться появления ошибки. (например, открыть только этот файл и запустить макрос, или открыть какой-то файл, после открыть файл с макросом и выполнить макрос, или открыть какой-то файл, закрыть его, открыть файл с макросом и выполнить его)
Я вряд ли смогу помочь решить сложившуюся ситуацию, но если свидетельства появления ошибки будут поступать от многих пользователей, то, возможно, можно будет привлечь внимание специалистов от MS.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, Хорошо вырезку из файла сделаю с макросом.
А может быть такое, что команда Instr отлавливает некорректно? Т.е. бзик какой-то происходит? Может при открытии файла кодировка какая не прогружается или ещё что? Так как все эти косяки вылазят когда пользуешься командой Instr или сравниваешь какое-то значение с значением массива.
Изменено: Alemox - 10.12.2018 12:59:28
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox: Instr
у неё 4 аргумента, но часто (при точном сравнении) её записывают в коротком виде Instr(где_ищем, что_ищем). Таким образом, опуская первый аргумент (с какого символа искать), можно поймать ошибку: если "где_ищем" будет являться числом, то функция неправильно определит где_ищем, как первый аргумент и кирдык - я так попался разок и теперь записываю как положено Instr(1,strWhere, strFind), разумеется, если нужно искать с 1 символа - то есть по всей строке  ;)
Изменено: Jack Famous - 10.12.2018 14:11:41
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Не в этом плане я всегда в Instr все аргументы прописываю. Не оставляю ничего по умолчанию. Как-то сразу себя приучил записывать всё, чтобы видно было.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, тогда жду примера и, если будет время, обязательно гляну.

P.S.: ещё при определённых комбинациях проверка If Len(x) Then и If Instr(1,txt,x) Then вместо If Len(x)>0 Then и If Instr(1,txt,x)>0 Then могут выдать ошибку. НО это уже из области гадания — уверен, что мэтры ещё вагон таких нюансов могут выкатить, исходя из своего опыта…
Изменено: Jack Famous - 10.12.2018 14:57:14
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх