Умножение двух столбцов на основе имени заголовка - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь умножить два столбца на основе имени заголовка (могу менять положение каждый раз, поэтому фиксированный диапазон ячеек не работает).

Пока что я получил следующий кусок

Dim ws As Worksheet
Dim lrow As Long
Dim Amount, Bill, USD As Range
Dim Rngheaders As Range

Set ws = ThisWorkbook.Sheets("CSV Data PR")
Set Rngheaders = ws.Range("1:1")
lrow = ws.Cells(Rows.Count, 1).End(xlUp).Row - 1

Set Amount = ws.Rows(1).Find(What:="Amount")
Set Bill = ws.Rows(1).Find(What:="Bill.qty")
Set USD = ws.Rows(1).Find(What:="In USD")

ws.Range(USD.Address).Offset(1, 0).Resize(lrow) = Range(Amount.Address).Offset(1, 0) * Range(Bill.Address).Offset(1, 0)

Это работает, за исключением того факта, что он вычисляет только строку 2 (мне нужно, чтобы он вычислял строку за строкой).

Желаемый вывод должен выглядеть примерно так:

Output

Ответы [ 3 ]

2 голосов
/ 07 марта 2019

Пожалуйста, рассмотрите возможность использования пользовательской функции для ваших целей.Вставьте код функции в стандартный модуль кода.

Function BillTotal(R As Long) As Double
    ' 07 Mar 2019
    ' returns -1 in case of error

    Dim Amt As Long
    Dim Qty As Long

    Application.Volatile
    On Error Resume Next
    Amt = Application.WorksheetFunction.Match("amount", Rows(1), 0)
    If Err.Number = 0 Then
        Qty = Application.WorksheetFunction.Match("bill.qty", Rows(1), 0)
    End If
    If Err Then
        BillTotal = -1
    Else
        BillTotal = Val(Cells(R, Amt).Value) * Val(Cells(R, Qty).Value)
    End If
End Function

В ячейку, в которой вы хотите получить результат, напишите вызов функции следующим образом.

=BillTotal(Row())

В качестве альтернативы выможно использовать ту же функцию, чтобы реализовать вашу оригинальную идею.Просто вызовите его в цикле For ... Next и запишите результат в ячейку, определенную R и C, где номер строки R предоставляется циклом, а C может быть получен из функции MATCH, как показано в моей функции.При использовании таким способом строка Application.Volatile не потребуется.

2 голосов
/ 07 марта 2019

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

Dim ws As Worksheet
Dim lrow As Long
Dim AmountCol as Long
Dim BillCol as Long
Dim USDCol as Long
Dim Rngheaders As Range
Dim x as long

Set ws = ThisWorkbook.Sheets("CSV Data PR")
Set Rngheaders = ws.Range("1:1")
lrow = ws.Cells(Rows.Count, 1).End(xlUp).Row

AmountCol = Rngheaders.Find(What:="Amount").Column
BillCol = Rngheaders.Find(What:="Bill.qty").Column
USDCol = Rngheaders.Find(What:="In USD").Column

For x= 2 to lrow
     ws.Cells(x,USDCol) = ws.Cells(x, AmountCol) * ws.Cells(x, BillCol)
Next x
1 голос
/ 07 марта 2019

Попробуйте этот код:

Dim ws As Worksheet
Dim lrow As Long
Dim Amount As Range
Dim Bill As Range
Dim USD As Range
Dim Rngheaders As Range
Dim counter As Integer

Set ws = ThisWorkbook.Sheets("CSV Data PR")
Set Rngheaders = ws.Range("1:1")
lrow = ws.Cells(Rows.count, 1).End(xlUp).Row - 1

Set Amount = ws.Rows(1).Find(What:="Amount")
Set Bill = ws.Rows(1).Find(What:="Bill.qty")
Set USD = ws.Rows(1).Find(What:="In USD")


For counter = 1 To lrow
    USD.Offset(counter, 0).Value = Amount.Offset(counter, 0).Value * Bill.Offset(counter, 0).Value
Next counter

Я установил тип переменной диапазонов Сумма, Билл и USD

Поскольку они уже являются диапазонами, вы можете обращаться к ним напрямую.Не нужно использовать Range(USD.Address)

Кроме того, вы не используете эту строку: Set Rngheaders = ws.Range("1:1")

Попробуйте и дайте мне знать, если это работает.Я не мог проверить это.

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