引用特定命名列中的值

时间:2015-01-19 17:04:53

标签: excel vba excel-vba

是否有excel公式/ VBA脚本来引用具有特定列名称的列中的单元格值?

例如:将“#fruit”列中的值乘以此行中“fruit of fruit”列中的值。

通常这可以通过单元格引用轻松完成,但我需要使用特定的列名称来完成,因为列可能位于不同工作表中的不同位置。我想将其编码为用户定义的函数,因此只要标题名称相同,就可以使用它而不管列的位置。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果我想象“列名”是指列的第一个单元格,您可以按照说法搜索用户函数,然后执行操作:

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

在这种情况下,您需要在公式中键入一个单元格:

=myOperation("# of fruit", "price of fruit")

这将在该单元格中返回两者之间的产品在同一行(我让您管理自定义)。请注意,您将需要一个错误处理(如果您输入一个非现有名称,您有可能无限循环进入,请参阅Christmas007答案,了解如果查找实际上找到了什么,如何陷阱)。

修改

我已将ActiveCell替换为Application.Caller,以使公式动态响应函数所在的调用者单元格。

硬编码值的功能如下:

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()调用它进入单元格。

答案 1 :(得分:0)

为了后人的缘故,我将在他的评论中加入@ fnostro的答案,这些评论就是......

  

&#34;这不是Excel中的事情。当然,你可以通过在函数内为该标题执行搜索然后对其下面的单元格进行操作来实现。但是为什么要设计一个带有漫游列标题的传播。通常,您将使用命名范围,它们将代表工作簿中的固定位置。但它们可以在任何地方,并且函数将始终使用RangeName,无论它在何处被定义。&#34;

但是,您可以使用搜索来执行此操作:

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将成为您对该列的引用。

编辑:如果.Find返回Nothing,则忘记包含错误处理程序。现在修好了。