Мне было очень трудно понять, что ты пытался сделать.В конце концов мне пришлось попробовать заменить ваши переменные kom, komz, komr, komn на английские имена (извиняюсь, я ирландец, а английский - мой единственный язык)
Я могу быть совершенно неправ, но мои предположения были;
komz ... the TotalDebtBefore (the Debt Brought Forward)
kom .... the amount due or paid now - the installment
komr ... the RemainingDebt (Carried Forward)
komn ... An Overpaid Balance
С этими значениями я мог бы разобраться в вашем коде
Sub TestRev2()
Const cSheet As String = "Procenty"
Const cRange As String = "A2:D71"
Const cel As Long = 4
Const cCol As Variant = "A"
' My best Guess of variable meanings
' DebtBFwd = k o m z - x9
' InstallmentAmt = k o m - x10
' DebtCFwd = k o m r - x3
' OverPaid = k o m n - x3
Dim vntS As Variant
Dim vntT As Variant
Dim i As Long, r As Long
Dim emptyRow As Long
Dim kom As Double, komz As Double, kredyt As Double
Dim roz As Double, komr As Double, komn As Double
Dim dz As Date, dw As Date
vntS = ThisWorkbook.Worksheets(cSheet).Range(cRange).Value
ReDim vntT(1 To 2 * UBound(vntS), 1 To cel)
kredyt = 0
r = 1
For i = 1 To UBound(vntS)
dz = vntS(i, 1)
komz = vntS(i, 2)
dw = vntS(i, 3)
kom = vntS(i, 4)
vntT(r, 1) = dz
vntT(r, 2) = komz
vntT(r, 3) = dw
vntT(r, 4) = kom
r = r + 1
If komz > kom Then
komr = komz - kom
vntT(r, 1) = dz
vntT(r, 2) = komr ' DebtCFwd ?
vntT(r, 3) = dw
vntT(r, 4) = kom ' InstallmentAmt ?
r = r + 1
End If
If komz < kom Then
komn = kom - komz
vntT(r, 3) = dw
vntT(r, 4) = komn ' Overpaid Amt ?
r = r + 1
End If
If komz = kom Then
vntT(r, 1) = dz
vntT(r, 2) = komz ' DebtBFwd ?
vntT(r, 3) = dw
vntT(r, 4) = kom ' InstallmentAmt ?
' Following Line Added
r = r + 1
End If
Next
With ThisWorkbook.Worksheets(cSheet)
emptyRow = .Columns(cCol).Find("*", , xlFormulas, xlWhole, xlByColumns, xlPrevious).Row + 1
.Cells(emptyRow, cCol).Resize(UBound(vntT), UBound(vntT, 2)) = vntT
.Cells(emptyRow, cCol) = kredyt
End With
End Sub
Короче говоря, вы, кажется, пропускаете строку
r = r + 1
Когдаkomz = kom
Прав ли я или нет в отношении значения ваших переменных, вам нужно, чтобы r = r + 1
Your If, иначе использование скрывало эту проблему.Поэтому я переставил их, потому что эти IF никогда не могут перекрываться
Если это не единственная причина проблем, теперь я хорошо понимаю ваш код
================================================================== Приложение - После вашего третьего редактирования
Итак, ЕСЛИ ВАША ЛОГИКА (в коде) является ПРАВИЛЬНОЙ (а может и не быть), проблема заключается в этом разделе кода и можеттолько 1 из 2 строк
If komz > kom Then
komr = komz - kom
vntT(r, 1) = dz
vntT(r, 2) = komr ' DebtCFwd ?
vntT(r, 3) = dw
' Either the next line is wrong
vntT(r, 4) = kom ' InstallmentAmt ?
r = r + 1
End If
If komz < kom Then
komn = kom - komz
vntT(r, 3) = dw
' Or this next line is wrong
vntT(r, 4) = komn ' Overpaid Amt ?
r = r + 1
End If
Я добавил 2 дополнительных комментария, чтобы показать, какие строки могут быть причиной неправильного 4-го столбца
Однако, если вы мне объяснитезначение 4 переменных, kom, komn, komr и komz, я могу помочь решить логику - что, я подозреваю, также может быть неправильным
=========================================================================Приложение 2. Позволяя Коду сообщать вам, что он делает
Сначала вам нужно увеличить размер массива vntT на 1 столбец следующим образом
ReDim vntT(1 To 3 * UBound(vntS), 1 To cel + 1) ' Added the + 1 at end
Затем нам нужно поместить сообщения вэтот дополнительный столбец массива вв следующих местах:
vntT(r, 1) = dz
vntT(r, 2) = komz
vntT(r, 3) = dw
vntT(r, 4) = kom
vntT(r, 5) = " .. A"
r = r + 1
If komz > kom Then
komr = komz - kom
vntT(r, 1) = dz
vntT(r, 2) = komr ' DebtCFwd ?
vntT(r, 3) = dw
vntT(r, 4) = kom ' InstallmentAmt ?
vntT(r, 5) = " .. komz > kom"
r = r + 1
End If
If komz < kom Then
komn = kom - komz
vntT(r, 3) = dw
vntT(r, 4) = komn ' Overpaid Amt ?
vntT(r, 5) = " .. komz < kom"
r = r + 2
End If
If komz = kom Then
vntT(r, 1) = dz
vntT(r, 2) = komz ' DebtBFwd ?
vntT(r, 3) = dw
vntT(r, 4) = kom ' InstallmentAmt ?
vntT(r, 5) = " .. komz = kom"
' Following Line Added
r = r + 1
End If
В приведенном выше тексте есть 4 новые строки кода, каждая из которых записывает данные (msgs) в vntT (r, 5). Это поможет вам понять, где код работает неправильно.
====================================================
Окончательное дополнение
Ниже приведен код, в котором исходные данные выбираются ... помещая их в переменные
For i = 1 To UBound(vntS)
dz = vntS(i, 1)
komz = vntS(i, 2)
dw = vntS(i, 3)
kom = vntS(i, 4)
Итак, массив vntS содержит исходные данныеи массив vntT содержит выходные данные - что неправильно в некоторых случаях
Возможно, вам понадобится новая переменная, чтобы выбрать другую дату или вычислить новое значение, прежде чем вы поместите это в выходной массив
Как я сказал в комментариях, я не знаю полного бизнес-кейса, который вы пытаетесь реализовать, и у меня нет данных.