Dynami c Код, который применяет код построчно в VBA - PullRequest
0 голосов
/ 18 февраля 2020

Excel Sheet

enter image description here

У меня есть следующий код, который соответствует одной строке в листе. Мой вопрос, как написать это так, чтобы он непрерывно применял код за строкой, пока мы не достигнем последней строки? Затем, как бы я написал динамический c код, в котором, если бы я добавил новые строки, он распознал, чтобы применить код к этим новым строкам.

Для контекста, этот код делает то, что он принимает пользовательский ввод, вычитает это значение с марта до тех пор, пока не будет больше пользовательского ввода для вычитания или если марш имеет значение 0. Если марш равен 0 и мы не вычли весь пользовательский ввод, мы переходим к февралю и делаем то же самое, и так до тех пор, пока мы не достигнем января.

Sub variance_sub()

    Dim reduce As Double, c As Range, diff As Double

    reduce = InputBox("what is the Variance required? (Pressure use a positive number)")

    Set c = ActiveSheet.Range("T7") 'march cell



    If reduce = 0 Then
        MsgBox "No further action required"
    ElseIf reduce > 0 Then      'This is for a pressure'
        Do
            If c.Value >= reduce Then
                c.Value = c.Value - reduce
                reduce = 0
            Else
                diff = reduce - c.Value
                c.Value = 0
                reduce = diff
            End If
            If c.Column > 1 Then Set c = c.Offset(0, -1) 'move left if we can
        Loop While reduce > 0 And c.Column >= 18
    Else
        c.Value = c.Value + reduce
    End If

End Sub

1 Ответ

0 голосов
/ 19 февраля 2020

Что-то вроде:

Sub variance_sub()

    Dim reduce As Double, c As Range, diff As Double, rng As Range

    reduce = InputBox("what is the Variance required? (Pressure use a positive number)")
    'get range to process
    With ActiveSheet
        Set rng = .Range("T7:T" & .Cells(.Rows.Count, "T").End(xlUp).Row) 'march cell
    End With

    'loop through range
    For Each c In rng.Cells   

        If reduce = 0 Then
            Debug.Print "No further action required" 'probably don't want msgbox
        ElseIf reduce > 0 Then      'This is for a pressure'
            Do
                If c.Value >= reduce Then
                    c.Value = c.Value - reduce
                    reduce = 0
                Else
                    diff = reduce - c.Value
                    c.Value = 0
                    reduce = diff
                End If
                If c.Column > 1 Then Set c = c.Offset(0, -1) 'move left if we can
            Loop While reduce > 0 And c.Column >= 18
        Else
            c.Value = c.Value + reduce
        End If

    Next c 

End Sub
...