Страницы: 1
RSS
Состыковать заказы с платежами с помощью макроса
 
Добрый день!
Прошу помочь в решении проблемы.

Есть список заказов отсортированный по датам, и список платежей.
Задача состыковать заказы с платежами, начиная с верхнего. И соответственно, где необходимо, раздробить заказы, либо платежи.
Т.е. если заказ не покрывается целиком платежом, оставшаяся его часть "добивается" следующим платежом.
И если от платежа остается остаток- он покрывает следующий заказ( или часть заказа).
Прикладываю файл, там более наглядно.
Пыталась сделать с помощью формул, создавала двумерный массив( в строки-заказы, в столбцы-платежи), но данных много, заказов несколько тысяч, платежей несколько сотен-очень сильно тормозит и все равно требуется ручная обработка.
Возможно ли это сделать с помощью макроса?
 
Не пойму, почему нет откликов.
Задача сформулирована не ясно?
Или задача сложная?
Или неинтересная?
 
ветка ведь "Вопросы по Microsoft Excel", а не по задачам  :(  ... моё имхо: не продуман ни алгоритм, ни репрезентация данных и результата... может здесь будут отклики... успехов
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Постановка задачи левоватая. Если вам пофигу какой платеж за какой заказ, то не проще ли взять сумму платежей по контрагенту и тупо закрыть сумму заказов до какого-то случая: либо получить аванс на какой-то заказ, либо дать в долг один заказ...
Если автоматизировать бардак, то получится автоматизированный бардак.
 
JeyCi, спасибо за отклик  :)  .
вопрос или задача-это лишь формулировка. я макросами очень слабо владею, поэтому мне сложно оценить, труден ли мой вопрос(задача), соответственно, поэтому и представить алгоритм работы макроса не могу :(.
про форум Работа поняла, но попробую сама формулами.

wowick, так же спасибо за отклик.
не пофигу какой платеж за какой заказ! заказы и платежи отсортированы по датам( от старых к новым). так что заказы последовательно должны закрываться платежами, от первого к последнему.
 
Да, но этого не указано в файле. Также в файле не указано платеж от какого контрагента поступает... По-моему, тяжеловато продумывать логику для сортировки платежей не известно от кого, только по подходящим суммам, да и суммы эти могут не подходить, т.к. кто-то платит с авансом за следующую поставку, у кого-то заказ меньше, у кого-то больше. Это больше похоже на гадание. А вдруг повезет...
Вот в чем основная проблема.
 
ASKer_mk, попробую пояснить.
это сверка нашей организации( поставщика) с клиентом.
на протяжении какого-то времени клиенту отгружались заказы. клиент платил за эти заказы суммами не кратными заказам ни по количеству, ни по суммам.
на примере прикрепленного файла:
берем первый заказ А, сумма 5тысяч, первый платеж 2 тысячи. т.е. первым платежом мы закрываем только часть первого заказа. оставшуюся часть заказа добиваем частью второго платежа 3тысячи. От второго платежа остается 2тысячи, ими можно покрыть следующие заказы Б на 1200, В на 300, и часть Г на 200.
когда весть второй платеж расписан переходим к третьему, покрываем им часть заказа Г на 1тысячу и так далее.
постоянно перетекающие остатки заказов и платежей. тут нет гаданий.
подкорректировала файл, может так понятнее будет.
 
Вам шашечки или ехать? Если сумма заказов от контрагента 600 тыс. руб., а сумма платежей от него же 590 тыс. руб. То составляется акт сверки, который подписывают обе стороны, что за контрагентом числится долг в размере 10 тыс. рублей. И все платежи и все заказы на текущий момент времени (или на дату акта сверки) считаются закрытыми!  И нафиг не надо какой заказ каким платежом закрыт...
А с этого момента наведите порядок с платежами и заказами!
Если автоматизировать бардак, то получится автоматизированный бардак.
 
Ещё поясню, цель данной задачи вычислить фактическую отсрочку оплаты по каждому заказу.
затем сравним с отсрочкой по договору и насчитаем пени.
дак чтобы вычислить фактическую отсрочку надо все платежи последовательно прицепить к заказам.
 
Дарья_стат, приведенная Вами структура не отражает реальную структуру документа и потому не имеет смысла прилагать усилия для написания кода или формул, т.к. потом всё равно надо будет переделывать. Приложите пример согласно правил форума - Вам же лучше будет.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, прикладываю часть реального файла.
количество заказов может быть в несколько тысяч. Оплат -под тысячу.
 
кажется мне, где-то по форуму была ваша тема с использованием Словарей... если не ошибаюсь... а может и не ваша... в любом случае: алгоритм вижу таким - берём платежи в массив, из которого формируем словарь, берём заказы в массив, и по его размеру формируем 3-й массив для выгрузки... и по 2-му массиву пробегаем суммируя каждую последующую цену накопительным итогом, т е если очередное прибавление не превышает item (платёж) по ключу (#платежа), то прибавляем, иначе... (надо подумать - вставить ваш дроблёный заказ и выделить красным IndexColor шрифта- с ходу не видно где и как вы его дробите - из какой строки источника и как кидаете в итоговую таблицу - показали бы хоть цветом откуда - а то высчитывать ваши заказы может у многих нет времени - если вы себе не хотите помочь)... ключу присваиваем значение 2 и продолжаем по циклу считать заказы под сумму item данного ключа... каждый раз не забывая проверить if dic.exists (key)... пока не наткнёмся на отсутствие следующего ключа... т е if not dic.exists (key) то - Exit For... а потом выгрузка куда хотите 3-й массив, который собрали - в нужный пустой перекидывая значения из 2-го (там где бежали)... алгоритм как вариант как-то так может быть... Словари в помощь (scripting.dictionary) ... но писанины будет много (на скорую руку не получиться) - это, действительно, может стать работой - вашей или чьей-то... успехов... если никто не подскажет вариантов короче

Цитата
Дарья_стат пишет: Оплат -под тысячу.
P.S. хм, хотя если дробите - то массив выгрузки должен быть apriori больше массива исходного... значит, наверно, надо брать с запасом (каким - вам виднее)
Изменено: JeyCi - 28.11.2014 19:21:11
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Так?
 
JeyCi,большое Вам спасибо за неравнодушие и желание помочь!
не все Ваши рассуждения мне понятны( в силу моего слабого владения VBA), но наверняка они кому-нибудь пригодятся, натолкнут на нужный путь.
 
Ivan.kh, алилуя! Вы чудо!
да, то что надо!
на моем реальном диапазоне в 11тысяч заказов-не тянет. выдает ошибку 7, нехватка памяти.
а 3тысячи заказов обрабатывает без проблем.
разбить на три части не проблема, да и редко такие большие диапазоны бывают.
Спасибо огромное!
 
Ivan.kh,а без GoTo-спагетти-кода можно? Наверное, можно...

Код
For i = 1 To UBound(ArrZakaz, 1)
    kol = ArrZakaz(i, 3)
    For j = 1 To UBound(ArrOplaty, 1)
        If kol = 0 Then Exit For
        If ArrOplaty(j, 3) <> 0 Then
            If kol >= ArrOplaty(j, 3) Then
               ArrOtchet(p, 1) = ArrZakaz(i, 1)
               ArrOtchet(p, 2) = ArrZakaz(i, 2)
               ArrOtchet(p, 3) = ArrZakaz(i, 3)
               ArrOtchet(p, 4) = ArrOplaty(j, 1)
               ArrOtchet(p, 5) = ArrOplaty(j, 2)
               ArrOtchet(p, 6) = ArrOplaty(j, 3)
               kol = kol - ArrOplaty(j, 3)
               ArrOplaty(j, 3) = 0
               p = p + 1
            ElseIf kol < ArrOplaty(j, 3) Then
               ArrOtchet(p, 1) = ArrZakaz(i, 1)
               ArrOtchet(p, 2) = ArrZakaz(i, 2)
               ArrOtchet(p, 3) = ArrZakaz(i, 3)
               ArrOtchet(p, 4) = ArrOplaty(j, 1)
               ArrOtchet(p, 5) = ArrOplaty(j, 2)
               ArrOtchet(p, 6) = kol
               ArrOplaty(j, 3) = ArrOplaty(j, 3) - kol
               kol = 0
               p = p + 1
            End If
        End If
    Next j
Next i 
There is no knowledge that is not power
 
Johny, риторический вопрос :)
 
Цитата
Ivan.kh пишет: Johny , риторический вопрос
Дело не в том, что это риторический вопрос, а в том, что ОП будет применять этот спагетти-код. И как говорил наш преподаватель по информатике в институте, "не люблю ГоуТушников"!  :)
There is no knowledge that is not power
Страницы: 1
Наверх