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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2009, 10:27   #1
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
Вопрос Изменение размеров цикла

Уважаемые знатоки!
Подскажите пожалуйста, как динамически изменять размеры цикла?
Например. Есть данные порядка 10 000 записей (134 значения в записи). Данные считываются циклом и записываются в массив. Но если 132 или (и) 133 значение <> 0, то добавляются по 8 значений.

132 = 0
133 = 1
Значений 142(134+8)

132 = 1
133 = 2
Значений 158(134+24)

Вот такая проблема. Как это организовать в цикл?
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 16.03.2009, 10:47   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Например, так:
Код:
For i = 1 To 10000
    res = i * 2
    If res > 15000 Then Exit For  ' преждевременный выход из цикла по условию
    ' код
Next
Ну или так:
Код:
i = 1: res = 4
While res <= 15000 ' цикл сам завершится при невыполнении условия
    i = i + 1: res = i * 2
    ' код
Wend
Хотите получить более подробный ответ - напишите код своего цикла, и объясните, по выполнению какого условия цикл должен прекращаться.
EducatedFool вне форума Ответить с цитированием
Старый 16.03.2009, 10:57   #3
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

For i = 1 To infoDBS(27)
j = 1
For j = 1 To 131
tempFile(i, j) = Rez((Mid(StrConv(vesFile, vbUnicode), poz, Polya(2, j))))
poz = poz + Polya(2, j)
Next j
Next i

Вот код. Обычные два цикла. Один листает записи, другой значения. Но вся проблема в том, что мне нужно не просто прервать цикл. А в зависимости от значения полей 132 и 133:
- либо продолжить считывать следующие n(131)*8 полей
- либо пропустить одну часть и считывать n(132)*8 полей
- либо перейти к следующей записи.
p.s.
Rez() - это моя функция преобразования значений.
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 16.03.2009, 11:11   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код абсолютно непонятен.

Начиная с того, что такое infoDBS(27), и заканчивая считыванием n(131)*8 полей (непонятно, какой код отвечает за считывание)

При таких исходных данных (как приведённый Вами код) написать правильный цикл вряд ли будет возможно.
EducatedFool вне форума Ответить с цитированием
Старый 16.03.2009, 11:25   #5
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

For i = 1 To 5000
j = 1
For j = 1 To 131
tempFile(i, j) = Rez((Mid(StrConv(vesFile, vbUnicode), poz, 2))) 'Значение из списка
Next j
Next i

В данном цикле считали 131 значение 1 записи.
Далее если 132 значение <> 0, значит считываем следующие 8 значений
(если 132 = 1 то 8 значений, если 132 = 2 то 16 значений и т.д.)
Соотвтетственно после всех этих значений идет поле 133 (на самом деле 132 оно при 131 = 0, а если нет то оно сдвигается на 8 позиций)
С 133 полем то же самое, если <> 0 то 8 позиций.

Попробую привести пример в значениях.
Пример 1
поле 132 = 1
поле 132_1 = 22
поле 132_2 = 1
поле 132_3 = 0
...
поле 132_8 = 0
поле 133 = 0
конец

Пример 2
поле 132 = 0
поле 133 = 2
поле 133_1(1) = 13
поле 133_2 = 2
...
поле 133_8(1) = 1

поле 133_1(2)=14
поле 133_1(2)=1
...
поле 133_1(2)=1
конец

Вот примерно так.
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 16.03.2009, 13:05   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

тут не видно, где данные считываются из файла. задача описана туманно.

я так понимаю, из файла считывается 133 байта данных, 131 байт - переводится в массив, а дальше по состоянию 132 и 133 байтов принимается решение, о том сколько еще байт относятся к данной записи, или начинать читать новую. если считан весь файл в переменную - обрабатывайте последовательно ее, а если файл читается порциями по 133 байта, то анализируйте 132 и 133 байт и решайте что делать дальше.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.03.2009, 13:21   #7
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

А зачем как считываются данные?
Весь файл считан как:

Dim vesFile() As Byte
Open "filename" For Binary As #1
fSize = LOF(1)
ReDim vesFile(1 To fSize)
Get #1, 1, vesFile()
Close #1

Весь файл считан в переменную. И потом идет его обработка.
В том то и дело! Не могу сообразить как мне проверить эти байты.
Они же находятся не в конце строки... И потом после первого условия следует второе. А позиция второго условия скачет в зависимости от первого...

Вот и не могу придумать как это реализовать...
Можно сделать все! Было бы время, да деньги...

Последний раз редактировалось mchip; 16.03.2009 в 13:24.
mchip вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Builder Изменение размеров компонентов на форме во время исполнения программы Bair C++ Builder 3 18.12.2008 13:43
Изменение размеров pinksky Microsoft Office Excel 3 18.04.2008 15:52
Изменение размеров элементов romets Win Api 2 18.02.2008 23:28
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10
Изменение размеров столбцов в DBGrid Elena БД в Delphi 1 15.05.2007 11:41