Excel, Vba, значение ячеек, как преобразовать код, чтобы он был таким, как на скриншоте?

#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. i.stack.imgur.com/8ni9e.png

2. i.stack.imgur.com/Qw92U.png

Ответ №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, должно сработать, но не знаю, как это сделать на самом деле….