我对 Excel 完全陌生,但我想制作一个宏,在其中可以填写两列以及行的起始和结束号码,它会这样做:
=(A1*B1+A2*B2+A3*B3...)/((SUM of column B)/N))
其中N
是行数。
我该如何在 Excel 中实现这个功能?
答案1
首先,如果您使用标准单元格地址,事情就会变得简单得多!
一般来说,单元格是通过“A1”地址来引用的,但在虚拟专用网络(Visual Basic for Applications)也可以使用 [行,列] 坐标来引用它们。例如Cell(1, 2)
“B1”。
您可以使用以下任一方式计算值公式或自定义虚拟专用网络(宏)。公式通常是更简单的选择 - 但使用公式肯定有好处虚拟专用网络在某些情况下。
使用公式
示例数据的布局如下:
柱子A和乙都填有要相乘的数字。
单元格“C2”包含用于计算该值的公式。
=(SUMPRODUCT(A:A;B:B)/SUM(B:B))/(COUNTA(B:B)-1)
SUMPRODUCT
将列的值相乘A和乙对每一行进行求和。SUM
将列中找到的所有数字相加乙。COUNTA
计算列中非空单元格的数量乙(我们必须扣除标题)。
查找 Microsoft Office 上的功能支持页面了解更多信息。
使用 VBA
您可以使用以下方法实现相同的目的(甚至更多!)虚拟专用网络。
打开维基百科(Visual Basic 编辑器)使用Alt+F11或开发人员选项卡。
创建一个新的标准代码模块。
将以下代码粘贴到模块中。您可以对其进行调整以更好地满足您的需求。
Option Explicit
Sub Test()
Dim targetSheet As Worksheet
Dim valueColumnA As Long
Dim valueColumnB As Long
Dim headerSize As Long
Dim lastRow As Long
Dim currentRow As Long
Dim value As Double
'''---Config---'''
Set targetSheet = ThisWorkbook.Sheets(1)
valueColumnA = 1
valueColumnB = 2
headerSize = 1
lastRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
'''---Logic---'''
'Multiply the columns for each row and sum them up
For currentRow = headerSize + 1 To lastRow
value = value _
+ targetSheet.Cells(currentRow, valueColumnA).value _
* targetSheet.Cells(currentRow, valueColumnB).value
Next
'Divide by sum of numbers found in valueColumnB
value = value / Application.WorksheetFunction.Sum( _
targetSheet.Columns(valueColumnB))
'Divide by number of rows
value = value / (lastRow - headerSize)
Debug.Print value
End Sub
堆栈溢出有很多关于虚拟专用网络。