Пропуск пустой ячейки в цикле For

Автор kroush, 3 января 2024, 01:33

0 Пользователи и 1 гость просматривают эту тему.

kroush

Добрый день. Всех с наступившим Новым годом!!! :beer:

Есть таблица, Которая в соответствии с датой заполняется из других листов. Заполняется Лист "ПО недельно" на основании листов "Месяцев". Дело в том, что каждая новая неделя нового месяца может начинаться с предыдущей даты месяца (как в примере) так и заканчиваться другим месяцем. Ячейка B3 как раз и является отправной точкой для сравнения.  В Листе "По недельно" есть пустые строки, которые отсутствуют в других листах с которыми идет сравнение. Не могу сообразить как осуществить пропуск данной ячейки и переход к следующему for. Сильно не пинайте, я пока только учусь.

Возможно это сравнение можно решить и формулой, но никак не получалось.

economist

#1
Таблицей лист "По недельно" назвать нельзя, вы сами запутаетесь в ней, все крайне неопрятно. Непонятно где исходные данные, а где "отчеты" по ним.

Если нужен отчет понедельно - ну так и используйте номера недель года (это общепринято) и на Лист5 сделайте нормальный справочник на 10 лет вперед:

№Недели НачНед КонНед МесяцНачНедели МесяцКонНедели     

После этого все заголовки таблицы листа "По недельно" нужно сделать на формулах, а на на макросах. Для них найдется работа потом.

Обычно подобные вещи неизбежно приходят к Сводным таблицам, которые прекрасно умеют группировать любые данные по дням, неделям года и месяцам вообще без макросов. Освоить их можно за пару дней, в отличие от макросов, на которые уйдет пару лет.   

 
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bigor

Цитата: kroush от  3 января 2024, 01:33можно решить и формулой
Формулой, как понял. В А2 выбираете месяц, в В3 смотрите дату
Поддержать наш форум можно здесь

kroush

Цитата: economist от  3 января 2024, 12:13Таблицей лист "По недельно" назвать нельзя, вы сами запутаетесь в ней, все крайне неопрятно. Непонятно где исходные данные, а где "отчеты" по ним.

Спасибо за замечание, учту в дальнейшем. Это все черновые варианты, с работы нет возможности выкладывать файлы.

Цитата: bigor от  3 января 2024, 17:48
Цитата: kroush от  3 января 2024, 01:33можно решить и формулой
Формулой, как понял. В А2 выбираете месяц, в В3 смотрите дату


Спасибо, я создавал отдельный лист и через впр вытаскивал (даже сам не понял как получилось:)), в Вашем примере намного проще.

Предыдущую идею, автоматического заполнения этого листа согласно других листов и сравнения дат и месяцев (каждый лист новый месяц) и переноса осуществил с помощью формул, правда громоздкие формулы получились-много сравнений и условий, но все работает. Спасибо за помощь в другом топике
Попробую объяснить, в приложенном файле есть 5 недель. По каждой недели считается сумма часов. Так вот, если сумма часов по каждой недели не равна, мне надо их выравнять с допустимой разницей между неделями в 6-7 часов (В иделе стремимся к 0). В файле, на листе пример, во второй табличке ниже все наглядно показано как должно получиться. И есть еще нюанс все переносы часов должны осуществляться в пределах месяца. Например если это январь то с 01.01 по 31.01, т.к. в таблице могут быть захвачены дни из других месяцев. Пример работаем с январем и пятую неделю (где захватывает февраль как раз не трогаем)
В данном случае не принципиально макросом это сделать или формулами.
Если данную задачу очень сложно реализовать, подскажите в каком направлении копать. Я пытался найти большую неделю, номера столбцов строк....Но знаний не хватает

kroush

Добрый день.
В питоне есть такого вида рекурсия
def countdown(num):
    if num <= 0:
        print("Старт!")
    else:
        print(num)
        countdown(num-1)

countdown(5)

#5
#4
#3
#2
#1
#Старт!

как такое осуществить на Basic?

economist

#5
Вызовите из Basic UDF на Python (тот что внутри OpenOffice|LibreOffice) и получите значение(я):
Sub my_py_UDF(arg1)
script = "my_py_UDF.py"
script = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory").createScriptProvider("")._
getScript("vnd.sun.star.script:" & script & "$backuper?language=Python&location=share")
my_py_UDF = script.invoke(arg1, array(), array())
End sub
   

Py-файл м.б. в 3-х разных местах, включая даже сам odt/ods-файл (делается с с раширением APSO). Для кода выше файл лежит в ...\share\Scripts\Python (хорошее место, но в нек-х версиях перезатираемое при переустановке OpenOffice|LibreOffice). Логично реализовать на символьных ссылках. 

Если удобство Python в работе со строками привычно и неоспоримо, то гляньте это: https://forumooo.ru/index.php?msg=57859, 50-ть строковых методов в Calc.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bigor

Цитата: kroush от  9 января 2024, 04:02как такое осуществить на Basic?
а чем это отличается от обычного цикла?

Поддержать наш форум можно здесь

economist

Цитата: bigor от  9 января 2024, 08:51а чем это отличается от обычного цикла?

По сути ничем, "красотой". Практической ценности в Р. мало, читаемость кода от нее страдает, отладка затруднена, "изобилие" практических примеров использования Р. сведется к поиску чисел Фибоначчи и т.п. чисто учебным задачам.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

kroush

Цитата: economist от  9 января 2024, 13:02
Цитата: bigor от  9 января 2024, 08:51а чем это отличается от обычного цикла?

По сути ничем, "красотой". Практической ценности в Р. мало, читаемость кода от нее страдает
Спасибо, учту сделаем циклом

mikekaganski

Рекурсия реально полезна только в языках, умеющих tail-call elimination (т.е. превращающих рекурсию в цикл самостоятельно) - функциональные языки типа erlang. Если этого нет, то рекурсия - гарантия рано или поздно получить переполнение стека.
С уважением,
Михаил Каганский

kroush

#10
А можно сделать цикл не от меньшего к большему, а наоборот. Например: у меня есть Массив 0 12 12 12, мне надо вначале проверить на 13, если не нашлось проверить на 12 ит.к. далее до 8. Дело в том, что в массиве могут числа от 3 до 13, и проверку надо осуществить до числа 8.

Цитата: kroush от  7 января 2024, 00:17Попробую объяснить, в приложенном файле есть 5 недель. По каждой недели считается сумма часов. Так вот, если сумма часов по каждой недели не равна, мне надо их выравнять с допустимой разницей между неделями в 6-7 часов (В иделе стремимся к 0). В файле, на листе пример, во второй табличке ниже все наглядно показано как должно получиться. И есть еще нюанс все переносы часов должны осуществляться в пределах месяца. Например если это январь то с 01.01 по 31.01, т.к. в таблице могут быть захвачены дни из других месяцев. Пример работаем с январем и пятую неделю (где захватывает февраль как раз не трогаем)

Осуществил проверку на меньшую и большую неделю, и вставку в необходимые ячейки.
Сейчас  пытаюсь сделать
Цитата: kroush от  7 января 2024, 00:17И есть еще нюанс все переносы часов должны осуществляться в пределах месяца. Например если это январь то с 01.01 по 31.01, т.к. в таблице могут быть захвачены дни из других месяцев.

bigor

А не проще, найти среднее количество часов в неделю за месяц, и затем уже приближаться к нему по каждой неделе
Поддержать наш форум можно здесь

kroush

Цитата: bigor от  9 января 2024, 22:07А не проще, найти среднее количество часов в неделю за месяц, и затем уже приближаться к нему по каждой неделе
В принципе так и делается, просто много дополнительных условий.
Смысл какой, график работы строится исходя из 2 рабочих 2 выходных, но с нас требуют табелировать и вызывать сотрудников согласно среднему количеству часов в неделю. Но никому не захочется работать по плавающему графику. Например: когда 3 рабочих по 12 6 8, выходной, потом 12, потом 6, потом выходной и т.к. далее. График работы делается сразу на два месяца. Но никто не застрахован от больничных или еще каких непредвидимых не выходов. Соответственно основной график (по которому все работаем) меняется в течении месяца. Так вот чтобы каждый раз вручную не высчитывать сколько кому поставить, для подгона по среднему количеству часов в неделю, и была придумана такая система. Чтобы сумма часов работы за месяц (по ней З/П) не менялась, а часы раскидывались равномерно на месяц с как раз с учетом средненедельной.

В принципе все что хотел реализовать сделал, остался только вопрос
Цитата: kroush от  9 января 2024, 20:24А можно сделать цикл не от меньшего к большему, а наоборот. Например: у меня есть Массив 0 12 12 12, мне надо вначале проверить на 13, если не нашлось проверить на 12 ит.к. далее до 8. Дело в том, что в массиве могут числа от 3 до 13, и проверку надо осуществить до числа 8.


bigor

Поддержать наш форум можно здесь

kroush

Цитата: bigor от 10 января 2024, 06:30For I=12 to 8 step -1
....
Next
Спасибо, получилось.
А как можно реализовать msgbox чтобы он выводил с новой строки. И нигде не нашел отличие Print и msgbox (Только в print если нажать отмена макрос остановится, а в msgbox добавить кнопки и действия к ним)
Пример:
Msgbox "Нет данных" С новой строки в этом же сообщении "введите имя" ?
В Python есть \n. А здесь не работает:(