Уважаемые гуру форума, помогите, пожалуйста, исправить ошибку, возникающую в цикле. Скорее даже не ошибку, код отрабатывает как ему указано, скорее недоработку условий цикла. Итак, имеются 3 листа (Приход, Расход, Выплаты комитентам) по данным которых мне требуется получить сумму задолженности перед комитентом. Пытаюсь сделать (по кнопке "
Новый")я это так: Сначала по данным расхода формирую массив (договор и кол-во) всех возвращенных товаров (по которые не требуется проводить выплаты):
Код |
---|
With CreateObject("Scripting.Dictionary"): .CompareMode = 1 'формирование словаря по данным исходного массива
Arr_VK = Sheets("Выплаты комитентам").Range("B8:D" & Sheets("Выплаты комитентам").Cells(Rows.Count, 4).End(xlUp).Row).Value
y = Sheets("Приход").Range("B2:J" & Sheets("Приход").Cells(Rows.Count, 3).End(xlUp).Row).Value
x = Sheets("Расход").Range("B2:H" & Sheets("Расход").Cells(Rows.Count, 5).End(xlUp).Row).Value
For i = 1 To UBound(x) 'отбираем данные расхода
temp = Split(x(i, 1), "|")(1) 'договор
If x(i, 6) = "В" Then
.Item(temp) = .Item(temp) + x(i, 3)
End If
Next i
ReDim Arr_R(1 To .Count, 1 To 2) 'формируем массив
For Each k In .Keys
j = j + 1
Data = Split(k, "|")
Arr_R(j, 1) = CStr(Data(0)) 'договор
Arr_R(j, 2) = Split(.Item(k), "-")(0) 'итоговое кол-во
Next k
...
|
здесь все ОК. Далее я пытаюсь сравнить данные Прихода с полученным массивом и при нахождении совпадающего договора, вычитать из общего кол-ва кол-во возвращенного:
Код |
---|
...
.RemoveAll
For i = 1 To UBound(y) 'отбираем данные прихода
temp = y(i, 1) & "|" & y(i, 3) 'номер договора|комитент
For j = 1 To UBound(Arr_R)
If y(i, 1) = Arr_R(j, 1) Then 'если совпадает номер договора
If y(i, 6) - Arr_R(j, 2) > 0 Then 'если исходное кол-во было больше возвращенного
.Item(temp) = .Item(temp) + (y(i, 6) - Arr_R(j, 2)) * y(i, 8): Exit For 'в словарь: договор|комитент + (кол-во - возврат)*цену
End If
Else
.Item(temp) = .Item(temp) + y(i, 6) * y(i, 8): Exit For 'в словарь: договор|комитент + кол-во*цену
End If
Next j
Next i |
и вот тут и начинается моя недоработка. В принципе, при пошаговой проверке, я вижу место ее возникновения:
Код |
---|
If y(i, 1) = Arr_R(j, 1) Then |
Если при сверке данных листа и массива "возвратный" договор стоит первым, то
для него код отработает правильно, а если нет, то в соответствии с моим кодом отработает действие по ELSE. А требуется (в моем понимании) следующее: Если номер договора НЕ СОВПАДАЕТ, то сначала должен отработать цикл на проверку этого номера среди
всего массива Arr_R и только потом, в случае ненахождения, отработать действия по ELSE. А вот как это сделать я не могу понять. В итоге данные в столбце G (выгрузка прописана ниже в коде) должны совпадать с данными столбца D.
P.S. В принципе, все вышеописанное, является попыткой оптимизировать рабочий код (кнопка "Текущий") в котором по ходу выполнения формируются и сравниваются 4 массива (а в моей попытке я пытаюсь свести это количество к 2-м). Отсюда возникает дополнительный вопрос: А будет ли этот новый код (в случае исправления ошибки) оптимизацией, или
грамотнее оставить текущий вариант? Заранее спасибо всем откликнувшихся.