макроциклы из каждой ячейки на основе 2 диапазонов - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь создать макрос с 2 полями ввода, через первое поле ввода пользователь выбирает диапазон, в котором он записан в каждой отдельной ячейке C или D (кредит или дебет) Через второй ввод пользователь выбирает диапазон, в котором он записан в каждой отдельной ячейке соответствующее количество.

Что мне делать, это следующее:
если соответствующая ячейка в диапазоне Credit / Debit стоит «D», соответствующая ячейка (я имею в виду сумму, соответствующую этому дебету) остается положительной, в противном случае она изменяется на отрицательную.

Например, если пользователь выбирает диапазон C / D в столбце J, а затем пользователь выбирает через 2-е поле ввода всю соответствующую сумму в столбце B, я хотел бы, чтобы, если J1 = "D", чтобы вернуть положительное значение в B1, иначе вернуть отрицательное значение в B1 и так далее для всех остальных строк ...

Я пытаюсь выполнить свой макрос, но он не работает должным образом. Я получаю сообщение об ошибке #NAME? ...

Пожалуйста, найдите ниже 2 скриншота (до и после выполнения макроса), а также код VBA

Если бы кто-то мог мне помочь, это было бы супер.

Sub ReturncorrectsignofamountaccordingtoDorC()    
    Dim c As Range
    Dim WorkRng2 As Range
    Dim WorkRng As Range

    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Please select the range D/C", xTitleId, WorkRng.Address, Type:=8)
    Set WorkRng2 = Application.Selection
    Set WorkRng2 = Application.InputBox("Please select the range of amounts", xTitleId, WorkRng.Address, Type:=8)

    For Each c In WorkRng2
        c.FormulaR1C1 = _
          "=IF(c.WorkRng.value=""D"",c.WorkRng2.value= c.WorkRng2.value, c.WorkRng2.value= -c.WorkRng2.value)"
    Next c
End Sub

enter image description here enter image description here

1 Ответ

0 голосов
/ 06 ноября 2018

Проблема в том, что вы смешиваете vba внутри строки. Вам нужно вытащить VBA и объединить:

 Range("A1").Formula = "=SUM(" & Range("A2").Address & ")"

Ссылки c.WorkRng.value также неверны. c - это объект диапазона, а не родительский элемент WorkRng

также формула, которую вы пытаетесь вставить, будет круговой и вызовет много проблем, просто умножьте значение на 1 или -1

Sub ReturncorrectsignofamountaccordingtoDorC()

    Dim c As Range
    Dim WorkRng2 As Range
    Dim WorkRng As Range

    Set WorkRng = Application.InputBox("Please select the range D/C", Type:=8)
    Set WorkRng2 = Application.InputBox("Please select the range of amounts", Type:=8)



    For Each c In WorkRng2
        c.Value = c.Value * IIf(c.Offset(0, WorkRng.Column - c.Column).Value = "D", 1, -1)
    Next c
End Sub

Лично я бы использовал вариантные массивы для ускорения:

Sub ReturncorrectsignofamountaccordingtoDorC()


    Do
        Dim WorkRng As Range
        Set WorkRng = Application.InputBox("Please select the range D/C", Type:=8)

        Dim WorkRng2 As Range
        Set WorkRng2 = Application.InputBox("Please select the range of amounts", Type:=8)

        If WorkRng.Cells.Count <> WorkRng2.Cells.Count Then MsgBox "Ranges must be same size"
    Loop Until WorkRng.Cells.Count = WorkRng2.Cells.Count

    Dim rng1 As Variant
    rng1 = WorkRng.Value

    Dim rng2 As Variant
    rng2 = WorkRng2.Value

    Dim i As Long
    For i = LBound(rng1, 1) To UBound(rng1, 1)
        rng2(i, 1) = rng2(i, 1) * IIf(rng1(i, 1) = "D", 1, -1)
    Next i

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