Табличные значения Excel Vba, кто-нибудь знает, как записать в эти ячейки правильные значения? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть проблема с этим кодом, пока он печатается так: screenshot Он должен рассчитать разницу от 2 ячеек 2-й и 4-й, если 2-й больше, и распечатать его во 2-й строкениже исходного значения (как это происходит в строке 78), а затем запишите значение (которое находится ниже в исходной таблице) в 4-м столбце, пока 2-е значение не будет «погашено», а затем выполните это с остальной частью файла.Пока мой код выглядит так:

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 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
            vntT(r, 3) = dw
            vntT(r, 4) = kom
            r = r + 1
        ElseIf komz < kom Then
            komn = kom - komz
            vntT(r, 3) = dw
            vntT(r, 4) = komn
            r = r + 1
        ElseIf komz = kom Then
            vntT(r, 1) = dz
            vntT(r, 2) = komz
            vntT(r, 3) = dw
            vntT(r, 4) = kom
        End If
    Next

    With ThisWorkbook.Worksheets(cSheet)
        emptyRow = .Columns(cCol).Find("*", , xlFormulas, _
                xlWhole, xlByColumns, xlPrevious).Row + 1
        'emptyRow = WorksheetFunction.CountA(.Columns(cCol)) + 1
        .Cells(emptyRow, cCol).Resize(UBound(vntT), UBound(vntT, 2)) = vntT
        .Cells(emptyRow, cCol) = kredyt
    End With
End Sub

РЕДАКТИРОВАТЬ: вот как это должно выглядеть (здесь я сделал это вручную) скриншот хорошо РЕДАКТИРОВАТЬ 2: вот как это выглядит перед макросом снимок экрана до EDIT3: снимок экрана сейчас EDIT4: изменен Вот снимок экрана после того, как я сделал то, что вы написали выше: В строке, подчеркнутой черным цветом, где находится 9.11.2015 и 828 должны быть 30.11.2015 и 312,11, и эту строку следует проверять с помощью операторов if, когда они выплачиваются, если проверяет значение ниже и т. Д.

1 Ответ

0 голосов
/ 26 февраля 2019

Мне было очень трудно понять, что ты пытался сделать.В конце концов мне пришлось попробовать заменить ваши переменные 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 содержит выходные данные - что неправильно в некоторых случаях

Возможно, вам понадобится новая переменная, чтобы выбрать другую дату или вычислить новое значение, прежде чем вы поместите это в выходной массив

Как я сказал в комментариях, я не знаю полного бизнес-кейса, который вы пытаетесь реализовать, и у меня нет данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...