#excel #vba
#excel #vba
Вопрос:
некоторое время назад я начал писать макрос, который будет делать то же, что и на скриншоте (хороший), но пока он печатает так, как на этом скриншоте (плохой). Я долго боролся с этим и не знаю, что делать, после перезаписи макроса кажется, что что-то не так с циклом for (1 на этом рисунке), как и после прохождения, если он остается там (komz> kom). Также там, где на картинке 2, должно быть различие (komz = komz — kom) и дата сверху
Код перед:
Sub testro()
Const cSheet As String = "Procenty"
Const cRange As String = "A2:D71"
Const cel As Long = 4
Const cCol As Variant = "A"
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 3 * UBound(vntS), 1 To cel 1)
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)
If komz > kom Then
vntT(r, 1) = dz
vntT(r, 2) = komz 'debt
vntT(r, 3) = dw
vntT(r, 4) = kom 'payment
vntT(r, 5) = " komz>kom"
r = r 1
komz = komz - kom
vntT(r, 1) = dz
vntT(r, 2) = komz ' Debt
vntT(r, 3) = dw
vntT(r, 4) = kom ' payment
vntT(r, 5) = " .. komz > kom"
ElseIf komz < kom Then
komn = kom - komz
vntT(r, 1) = dz
vntT(r, 2) = komz
vntT(r, 3) = dw
vntT(r, 4) = kom
vntT(r, 5) = " .. A"
r = r 1
vntT(r, 3) = dw
vntT(r, 4) = komn ' Overpaid
vntT(r, 5) = " .. komz < kom"
r = r 1
ElseIf komz = kom Then
vntT(r, 1) = dz
vntT(r, 2) = komz ' debt
vntT(r, 3) = dw
vntT(r, 4) = kom ' payment
vntT(r, 5) = " .. komz = kom"
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
ПРАВКА 1: Теперь он печатается вот так на [картинке] [сейчас] Я отметил, что должно быть где, а также он должен как бы «проходить» через операторы if, чтобы определить, что нужно сделать
РЕДАКТИРОВАНИЕ 2: [Сейчас] [неизвестно] он печатается почти так же, как и раньше, что мне нужно сделать, это: если значение из 2-го столбца не выплачивается значением из 4-го, то из строки выводится значение, подлежащее выплате (1 на [снимке] [неизвестно], фактически остальная часть помещается под его датой (2 на [снимке] [неизвестно]), а затем в той же строке добавляется платеж после, он должен работать до тех пор, пока не будет выплачено значение из 4-го столбца. ценность полностью окупается
Код после:
Sub testro()
Const cSheet As String = "Procenty"
Const cRange As String = "A2:D71"
Const cel As Long = 4
Const cCol As Variant = "A"
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 3 * UBound(vntS), 1 To cel 1)
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)
If komz > kom Then
If CStr(vntT(r, 1)) = "" Then 'because of this if-statement, it will not overwrite previous values
vntT(r, 1) = dz
vntT(r, 2) = komz 'debt
End If
vntT(r, 3) = dw
vntT(r, 4) = kom 'payment
vntT(r, 5) = " komz>kom"
r = r 1
ElseIf komz < kom Then
komn = kom - komz
vntT(r, 1) = dz
vntT(r, 2) = komz
vntT(r, 3) = dw
vntT(r, 4) = kom
vntT(r, 5) = " .. A"
r = r 1
vntT(r, 3) = dw
vntT(r, 4) = komn ' Overpaid
vntT(r, 5) = " .. komz < kom"
r = r 1
ElseIf komz = kom Then
vntT(r, 1) = dz
vntT(r, 2) = komz ' debt
vntT(r, 3) = dw
vntT(r, 4) = kom ' payment
vntT(r, 5) = " .. komz = kom"
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
ПРАВКА3:
Изображения, удаленные ссылки в комментарии ниже (превышен лимит) Исходные значения [Значения сейчас] [1] значения, подчеркнутые красным, похожи на «ate», хотя они должны быть в тех же строках, что и синие
ПРАВКА 4: Вот [данные] [2] (не могу поместить это в текст здесь)
EDIT5: Ссылка на Google диск: https://drive.google.com/open?id=1k6FAibzbH3GbDVVst_P1Ln0IkolI-k3Y (папка) https://drive.google.com/open?id=19u8D0knPAyZwuxhzfFZo8VYeSeBXoTT6 (файл) Мне пришлось удалить некоторые изображения (снова превышен лимит, слишком низкая репутация)
Комментарии:
Ответ №1:
Вы забыли поставить r = r 1
после
komz = komz - kom
vntT(r, 1) = dz
vntT(r, 2) = komz ' Debt
vntT(r, 3) = dw
vntT(r, 4) = kom ' payment
vntT(r, 5) = " .. komz > kom"
Таким образом, он перезаписывает этот бит в следующем цикле.
РЕДАКТИРОВАТЬ: Надеюсь, теперь я это понимаю, и это то, что вам нужно: я думаю, что правильно, что вы перезаписываете свою строку, но для этого нужно перезаписать только последние три столбца. Поэтому я думаю, что в данном конкретном случае вам нужно проверить, есть ли уже значение в массиве в этой позиции, чтобы вы не перезаписывали его:
If komz > kom Then
If cstr(vntT(r,1)) = "" then 'because of this if-statement, it will not overwrite previous values
vntT(r, 1) = dz
vntT(r, 2) = komz 'debt
end if
vntT(r, 3) = dw
vntT(r, 4) = kom 'payment
vntT(r, 5) = " komz>kom"
r = r 1
РЕДАКТИРОВАТЬ (снова): Я поиграл с вашими данными, и, возможно, это то, что вам нужно?:
If komz > kom Then
If CStr(vntT(r, 1)) = "" Then 'because of this if-statement, it will not overwrite previous values
vntT(r, 1) = dz
vntT(r, 2) = komz 'debt
End If
vntT(r, 3) = dw
vntT(r, 4) = kom 'payment
vntT(r, 5) = " komz>kom"
r = r 1
vntT(r, 1) = dz
vntT(r, 2) = komz - kom
vntS(i 1, 2) = komz - kom
ElseIf komz < kom Then
Я не уверен, что это правильный способ обработки платежей, но он наиболее близок к вашему исходному образцу, где все работало хорошо.
Комментарии:
1. Ну, это все еще не хорошо, не то, что я хотел, в EDIT1 написано, что вы можете видеть, как это сейчас, и я написал, как это должно быть
2. Посмотрите на другой if-оператор, где все идет правильно. Там вы заполняете только ‘vntT` от 3 до 5. Здесь вы заполняете от 1 до 5, а также
komz
в столбце 2, но, я думаю, это должно быть в столбце 4, потому что это переменная, которую вы изменили.3. Ну, в столбце 4 должно быть другое значение, не то, которое было изменено, а как следующий платеж, и эта строка также должна проходить через ifs, чтобы определить, что следует сделать. Это должно выглядеть так, как в теге good выше, где я сделал это вручную
4. Ок, значит, вам действительно нужно перезаписать часть строки, но только не первые две ячейки?
5. Ну, я думаю, что основная проблема с этим заключается в том, что я просто не могу это толком объяснить : ( … Все должно идти так же, как на скриншоте с тегом good, я подумал, что добавление значения, такого как balance и, возможно, цикл until, должно сработать, но не знаю, как это сделать на самом деле….