引用特定列中的值
是否有一个Excel公式/ VBA脚本引用具有特定列名称的列中的单元格值?
例如:在该行的“水果的价格”列中的值与“水果的价格”的值相乘。
通常这很容易通过单元格引用完成,但是我需要使用特定的列名称来完成,因为列可能位于不同的工作表中的不同位置。 我想将它编码到一个用户定义的函数中,只要标题名称相同,就可以使用它,而不pipe列的位置如何。
谢谢你的帮助!
如果像我想象的那样,“列名”是指列的第一个单元格,则可以按照您所说的执行对用户函数的search,然后执行操作:
Public Function myOperation(ByVal columnHeader1 As String, ByVal columnHeader2 As String) As Long 'note: if you want to hardcode the values, you just need to remove the arguments from the brackets above and uncomment the following two lines of code: 'columnHeader1 = "# of fruits" 'columnHeader2 = "price of fruit" cnt1 = 1 cnt2 = 1 Do While ActiveSheet.Cells(1,cnt1).Value <> columnHeader1 cnt1 = cnt1 + 1 Loop Do While ActiveSheet.Cells(1,cnt2).Value <> columnHeader2 cnt2 = cnt2 + 1 Loop myOperation = ActiveSheet.Cells(Application.Caller.Row, cnt1).Value*ActiveSheet.Cells(Application.Caller.Row,cnt2).Value End Function
在这种情况下,你需要input一个单元格的公式:
=myOperation("# of fruit", "price of fruit")
这将返回,在这个单元格,两者之间的产品在同一行(我让你pipe理自定义)。 请注意,你将需要一个error handling(如果你input一个不存在的名字,你有风险进入一个无限循环,参考Christmas007回答如何陷阱,如果查找实际上发现了什么)。
编辑
我用Application.Caller
replace了ActiveCell
,使公式dynamic地响应函数所在的调用者单元格。
这就是硬编码值函数的样子:
Public Function myOperation() As Long columnHeader1 = "# of fruits" columnHeader2 = "price of fruit" cnt1 = 1 cnt2 = 1 Do While ActiveSheet.Cells(1, cnt1).Value <> columnHeader1 cnt1 = cnt1 + 1 Loop Do While ActiveSheet.Cells(1, cnt2).Value <> columnHeader2 cnt2 = cnt2 + 1 Loop myOperation = ActiveSheet.Cells(Application.Caller.Row, cnt1).Value * ActiveSheet.Cells(Application.Caller.Row, cnt2).Value End Function
并用一个简单的=myOperation()
调用到单元格中。
为了后代的缘故,我将把@ fnostro的回答放在他的评论上。
“这不是在Excel中完成的事情,当然你可以通过在你的函数中执行一个search,然后在下面的单元格中执行search,但是为什么你要devise一个带有漫游列标题的数据呢?使用命名范围,它们将代表工作簿中的一个固定的位置,但它们可以在任何地方,函数总是使用RangeName而不pipe它被定义在哪里。
不过,您可以使用search来做到这一点:
Sub Macro1() Dim ColNum As Long, LastCol As Long LastCol = Cells(1, Columns.Count).End(xlToLeft).Column If Not Range(Cells(1, 1), Cells(1, LastCol)).Find("# of Fruit", LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then ColNum = Range(Cells(1, 1), Cells(1, LastCol)).Find("# of Fruit", LookIn:=xlValues, LookAt:=xlWhole).Column Else MsgBox "'# of Fruit' Not Found" End If End Sub
然后, ColNum
将成为您对该专栏的参考。
编辑:忘记包含一个error handling程序,如果.Find
返回Nothing
。 现在修好了