Это вариант задачи о рюкзаке или транспортной задачи. Есть несколько алгоритмов (помимо тупого перебора) Выбор конкретно алгоритма зависит от входящих данных и от критичности конечного результата.
Я бы решал "жадным алгоритмом": 1. Отсортировать последовательность по убыванию 2. Посчитать сумму последовательности 3. Взять с начала списка максимально возможное количество элементов, чтобы их сумма не превышала сумму/3 4. Оставшиеся так же включить во вторую группу 5. оставшиеся - так же в 3ю
Если входящие данные более-менее однородные и не важно, по сколько элементов в группе, то это самое простое, если большая дисперсия - нужно что-то посложнее
ну если совсем просто, то так: J_start - первая проверяемая строка J_end - последняя I_start - первый столбец I_end - последний столбец (их определяйте как хотите, способов куча)
А дальше простой цикл снизу вверх
Код
For j = J_end to J_start step -1
For i = I_start to i_end
if cells(j,i) = "" then
rows(j).delete
exit for
end if
next i
next j
Если строк много, то сначала все в массив. Я это расписывать не буду
На второй вопрос - конечно можно. Запишите один раз от и до макрорекодером - проще всего понять будет.
Да я в других местах обычно так и делаю. Но тут спецефичная задача - файлов много, много всяких "но" + записи в базы ведутся + много комплексной доп. фигни. Проще всего было бы именно паузить макрос. Я чувствую, что придется так и тут сделать (вести какой-то лог сделанного, и перезапускать макрос с последнего этапа ручками)
Для примера, поясню. У нас, скажем, 100 файлов. В файле, скажем, по 10 колонок с данными. Не должно быть пропусков, и, например, в первом столбце должна быть дата. И тут какой-нибудь Вася при заполнении файла случайно ставит лишний пробел в конце даты в какой-нибудь 387й строке 33го файла. (Это пример!) Если пропускать файл из-за такой фигни и править руками и запускать заново - уйдет прорва времени (реально проще на дебаге остановить, исправить, и продолжить)
Всем добрый день. думаю что что-то такое могло уже обсуждаться, но честное слово, понятия не имею по каким ключевым словам это искать. Гугл я уже поносиловал, но пока безрезультатно. А дело в вот в чем Есть у меня макрос, который перебирает ворох файликов однотипных, считывает из них инфу и отправляет в базу. Файлики заполняют какие-то человеки, и, бывает, косячат (то заголовок потрут, то столбец добавят не туда, то еще что-то придумают). Хотелось бы, чтобы макрос проверял файл на предмет основных косяков и, если их обнаруживает, давал управление листом мне, я бы их прям на листе исправлял и продолжал выполнение. Делать предварительную проверку всех файлов, конечно, вариант, но это усложняет код и увеличивает время работы. InputBox'ами это не решится 100%. Я пока это делаю через дебаггер (макрос натыкается на ошибку, там MsgBox +Stop, я правлю ошибку и передвигаю каретку на начало считывающей процедуры). Хотелось бы понять, можно ли это сделать не прибегая к дебаггеру
Я пока нашел только вариант с какой-нибудь немодальной формой и бесконечным циклом, но он отдает гнильцой. Мне кажется, должно быть что-нибудь более вменяемое
Я бы макрос писал на подобие вот такого: ( на работоспособность не тестил, пишу именно идею)
Код
Sub Main
X_start = X1 '
X_end = X2
Циклов = N
call Cicle(X_start, X_end, Циклов)
end sub
Sub Cicle(Начало, Конец, Циклов)
For j = НАЧАЛО to КОНЕЦ
If Циклов = 1 then
тело макроса
Else
Call Cicle(X_start_2, X_end_2, Циклов-1)
end if
next j
End sub