首页 > 解决方案 > 根据标题名称将两列相乘

问题描述

我正在尝试根据标题名称将两列相乘(每次都可以更改位置-因此固定的单元格范围不起作用)。

到目前为止,我得到了以下作品

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 行(我需要它逐行计算)。

所需的输出应类似于:

输出

标签: excelvba

解决方案


请考虑为您的目的使用用户定义的函数。将函数的代码粘贴到标准代码模块中。

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不需要该行。


推荐阅读