Страницы: 1
RSS
Прогрессивное налогообложение. Реализация кодом, функциями листа, Power Query и другими инструментами, Progressive tax in VBA, WorksheetFunction, Power Query and other
 
Приветствую!
Предлагаю поучаствовать в реализации расчёта прогрессивного налогообложения (вики) на примере подоходного налога РФ
Скрин с вики про подоходный налог и таблица расчёта (есть в файле)
VBA
Файл: Прогрессивный налог.xlsb (16.57 КБ)
Изменено: Jack Famous - 06.08.2021 11:08:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Здравствуйте!
В Power Query
Согласен что опять примитивно :)  
 
Михаил Л, здравствуйте и спасибо за отличный вариант!
Цитата
Михаил Л: Согласен что опять примитивно
не помню, чтобы вы как-то зарекомендовали себя как автора примитивных решений, и тем более, не помню, чтобы я вам такое говорил  :D
По-моему, замечательное решение, вся аналитика, несложные формулы - мне всё нравится  ;)
Скрин
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
если для целочисленных, то
=SUMPRODUCT(LOOKUP(ROW(A;1:INDEX(A:A;A1));{0;20001;40001;60001;80001;100001};{12;15;20;25;30;35}%))
Изменено: БМВ - 09.08.2021 10:25:53
По вопросам из тем форума, личку не читаю.
 
У меня не вышло - можно в файле?))
Изменено: Jack Famous - 09.08.2021 10:40:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Разделители поменяй, на те что у тебя. ну и вариант повторяющий VBA
=(A1-LOOKUP(A1;{0;2;4;6;8;10}/1%%))*LOOKUP(A1;{0;20001;40001;60001;80001;100001};{12;15;20;25;30;35}%)+LOOKUP(A1;{0;20001;40001;60001;80001;100001};{0;24;54;94;144;204})*100
Естественно, не смотря на краткость первого варианта, он во много раз медленнее и чем больше сумма тем медленнее.
Скрытый текст
Изменено: БМВ - 09.08.2021 11:32:23
По вопросам из тем форума, личку не читаю.
 
БМВ, а как ты скорость замеряешь?)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
БМВ, а как ты скорость замеряешь?)
выделил, запустил
Скрытый текст
По вопросам из тем форума, личку не читаю.
 
БМВ, спасибо  :)
И, конечно, большое спасибо за разнообразные формульные реализации с тестами  :idea:  8)
Изменено: Jack Famous - 09.08.2021 11:43:33
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
del
Изменено: buchlotnik - 21.08.2021 17:12:57
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
зато правильнее - см вложение
да, проглядел я это. надо взглянуть.

ну да,
=IF(A1=20000;2400;(A1-LOOKUP(A1;{0;2;4;6;8;10}/1%%))*LOOKUP(A1;{0;20001;40001;60001;80001;100001};{12;15;20;25;30;35}%))+LOOKUP(A1;{0;20001;40001;60001;80001;100001};{0;24;54;94;144;204}*100)
и на сей раз математика опережает алгоритмы и по скорости и по краткости.
Изменено: БМВ - 09.08.2021 17:33:28
По вопросам из тем форума, личку не читаю.
 
Цитата
buchlotnik написал:
с "примитивным" - надо ж было
Ну это типа - решение в лоб
Да и вообще, если учитывать минимальный оклад - 12792 руб, то  можно решать упрощенно. Хотя если гражданин проработал меньше года, то все равно нужно учитывать все условия.
А вообще как происходить вычеты подоходного налога? Каждый месяц по минимальной ставке, а в конце года перерасчет? Кто-нибудь в курсе?

Для сравнения с той же Америкой..
 
 
Цитата
Михаил Л написал:
А вообще как происходить вычеты подоходного налога? Каждый месяц по минимальной ставке, а в конце года перерасчет? Кто-нибудь в курсе?
где? Во времена прогрессивного ? каждый месяц считался для вычета сразу, помнится я забабахал итерационным алгоритмом, для расчета зарплаты при условии что фиксирована ставка нетто, но ему не поверили, хоть и считал корректно. А  считалось в основном просто. Есть начисление до, есть текущее, есть выплаченный до, есть то что по текущим рассчитано, разница - подоходный в текущем месяце с учетом всех переходящих ставок.
А за бугром вроде они отчитываются за период целиком. Заполнят декларацию и вычитают от туда все что можно вернуть..... Если интересно, то могу уточнить, друзья там.
Изменено: БМВ - 10.08.2021 07:34:50
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Во времена прогрессивного ?
Так это уже в прошлом) погуглил и вправду прошлое
Цитата
БМВ написал:
разница - подоходный в текущем месяце с учетом всех переходящих ставок
точно. При зарплате 10000р два месяца по 12%, третий и четвертый по 15% и т.д. А я озадачился)
 
del
Изменено: buchlotnik - 21.08.2021 17:11:56
Соблюдение правил форума не освобождает от модераторского произвола
 
переосмыслил алгоритм. скорость возросла , краткость увеличилась
=MOD(A1;20000)*INDEX({12;15;20;25;30;35}%;MIN(A1/20000+1;6))+INDEX({0;24;54;94;144;204}*100;MIN(A1/20000+1;6))
Скрытый текст

Пошли дальше, а нафига все эти умножить разделить?
=MOD(A1;20000)*INDEX({0,12;0,15;0,2;0,25;0,3;0,35};MIN(A1/20000+1;6))+INDEX({0;2400;5400;9400;14400;20400};MIN(A1/20000+1;6))
а что самое тяжкое - конечно сравнение, а его два , уберем , стало и короче и быстро, несмотря на то, что увеличилось количество математических операций.
=INDEX(MOD(A1;20000)*{0,12;0,15;0,2;0,25;0,3;0,35}+{0;2400;5400;9400;14400;20400};MIN(A1/20000+1;6))
Скрытый текст

Конечно не совсем честно сравнивать полностью расчетное и с использованием "таблицы" (0;2400;5400;9400;14400;20400) но всеж
Изменено: БМВ - 10.08.2021 08:56:22
По вопросам из тем форума, личку не читаю.
 
Миша-химик: * реализует продвинутые алгоритмы PQ
Дядя Миша: * играет формульными мускулами  :D  8)

Рад, что тема привлекла внимание таких спецов — столько вариантов, соревнование, обсуждение. Загляденье  :idea:
Продолжаем …
Цитата
P.S. БМВ: не совсем честно сравнивать полностью расчётное и с использованием "таблицы"
не скажу за соревнование, но для поколений оставить точно надо — кому-как удобно. Там за скоростями гнаться уже не будут, а вот за краткостью могут  ;)
Изменено: Jack Famous - 10.08.2021 09:28:49
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
не совсем честно
ну как - получился отличный "гибрид" - таблица (все-таки в изначальном условии она есть), но не с поиском, а с прямым обращением к вычисленной позиции.
Надо в PQ перенести - там тоже скорости сравнить
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
блин, все ноги не доходят это в Мерку запихнуть...
Тезка я тут заметил, что при приблизительно равных результатах, первая обрабатываемая формула всегда показывает чуть худший результат. Посмотри у себя. Ок?

Ну а по поводу таблички "брадиса" :-) так тут все на честном слове и то что порог в 20000 ровно в отличи от других шкал. То есть под конкретную шкалу решения работают.
Изменено: БМВ - 10.08.2021 09:36:55
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: при приблизительно равных результатах, первая обрабатываемая формула всегда показывает чуть худший результат
добавь паузу на секунду и/или несколько раз прогоняй по очереди (1е, 2е, 1е …) с получением среднего результата
Чтобы такого не было, а также, чтобы не внедрять высокоточный таймер, как сокол предлагал, я использую объёмы для отрыва хотя бы в секунду — так можно не бояться того, что процессы компа внесут ошибки в замеры
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
первая обрабатываемая формула всегда показывает чуть худший результат.
ага, и на запросах та же фигня - первый проверяемый пробуксовывает на первой итерации - в мыслях было первую попытку не засчитывать в итог, но до реализации пока не дополз
Цитата
Jack Famous написал:
несколько раз прогоняй по очереди (1е, 2е, 1е …)
с запросами не прокатит - именно потому что пробуксовывает первая итерация первого
а в чём глобальная причина? особенно про паузу интересно - чем она спасает?
Изменено: buchlotnik - 10.08.2021 10:00:06
Соблюдение правил форума не освобождает от модераторского произвола
 
Код
Sub testspeed()
Application.Calculation = xlCalculationManual
For Each Cell In Selection
Application.Wait Now() + CDate("0:0:1")
t = Timer
For i = 1 To 10000
    Cell.Calculate
Next
Debug.Print Cell.Formula, (Timer - t) * 1000
Next
Application.Calculation = xlCalculationAutomatic
End Sub

Как не смешно но спасает пауза
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: Как не смешно но спасает пауза
а что смешного? Логично же всё  ;)
Удобная процедурка с другим принципом
Изменено: Jack Famous - 10.08.2021 10:18:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Логично же всё
логично - это когда этому есть объяснение. Какие там процессы должны завершится или разогнаться чтоб все начало считать нормально?
По вопросам из тем форума, личку не читаю.
 
БМВ, ядра должны подышать после выполнения и размяться - перед  :D
Всё, как у людей
Изменено: Jack Famous - 10.08.2021 10:32:51
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
ядра должны подышать после выполнения и размяться
ну да , ты еще скажи договорится кто из  двух, что у моего пк в наличии, будет что делать :-) .
По вопросам из тем форума, личку не читаю.
 
 
Налоговый базаси, сум.
 
Ставка   налога, %
 
Первый 42 000 000
 
0
 
Следующий 42 000 000
 
0,2
 
Следующий 42 000 000
 
0,25
 
Следующий 42 000 000
 
0,3
 
Следующий 42 000 000
 
0,35
 
Следующий 42 000 000
 
0,4
 
Следующий 42 000 000
 
0,45
 
Следующий 84 000 000
 
0,5
 
Следующий 126 000 000
 
0,55
 
Выше 504 000 000 сум
 
0,6
Здраствуйте. В этом ситуацие какой формула или макрос совподает. Спасибо  
 
Ulugbek Tulakov, Даже с поправкой на неродной русский язык я вас от туда сюда не для этого направлял.
По вопросам из тем форума, личку не читаю.
 
Ulugbek Tulakov, Вам следует создать СВОЮ тему на форуме "Вопросы по Microsoft Excel".
И будет нужен Ваш небольшой файл с примером.
 
Я в миру ответил.
ну на всякий случай
=(B15-LOOKUP(-B15;-{99999;504;378;294;252;210;168;126;84;42}*10^6;{504;378;294;252;210;168;126;84;42;0}*10^6))*LOOKUP(-B15;-{99999;504;378;294;252;210;168;126;84;42}*10^6;{0,6;0,55;0,5;0,45;0,4;0,35;0,3;0,25;0,2;0}%)+LOOKUP(-B15;-{99999;504;378;294;252;210;168;126;84;42}*10^6;{1932;1239;819;630;462;315;189;84;0}*1000)
и тоже, но короче
=(B15-LOOKUP(-B15;-42*{10000;12;9;7;6;5;4;3;2;1}*10^6;{504;378;294;252;210;168;126;84;42;0}*10^6))*LOOKUP(-B15;-42*{10000;12;9;7;6;5;4;3;2;1}*10^6;{60;55;50;45;40;35;30;25;20;0}%%)+LOOKUP(-B15;-42*{10000;12;9;7;6;5;4;3;2;1}*10^6;{1932;1239;819;630;462;315;189;84;0}*1000)
и еще короче
=(B15-LOOKUP(INT(B15/42/10^6);{0;1;2;3;4;5;6;7;9;12})*42*10^6)*5*INDEX({0;4;5;6;7;8;9;10;11;11;12;12;12};MIN(INT(B15/42/10^6)+1;13))%%+LOOKUP(-B15;-42*{10000;12;9;7;6;5;4;3;2;1}*10^6;{1932;1239;819;630;462;315;189;84;0}*1000)
Изменено: БМВ - 22.08.2021 10:42:07
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх