Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 引用特定命名列中的值_Vba_Excel - Fatal编程技术网

Vba 引用特定命名列中的值

Vba 引用特定命名列中的值,vba,excel,Vba,Excel,是否有excel公式/VBA脚本来引用具有特定列名的列中的单元格值 例如:将水果列中的值乘以该行水果价格列中的值 通常情况下,使用单元格引用很容易做到这一点,但我需要使用特定的列名,因为列可能位于不同工作表中的不同位置。我想把它编码成一个用户定义的函数,这样不管列在哪里,只要标题名相同,都可以使用它 谢谢你的帮助 如果正如我对列名的想象,您是指列的第一个单元格,则可以按照您所说的对用户函数执行搜索,然后执行以下操作: Public Function myOperation(ByVal colum

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

例如:将水果列中的值乘以该行水果价格列中的值

通常情况下,使用单元格引用很容易做到这一点,但我需要使用特定的列名,因为列可能位于不同工作表中的不同位置。我想把它编码成一个用户定义的函数,这样不管列在哪里,只要标题名相同,都可以使用它


谢谢你的帮助

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

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
这将返回,在那个单元格中,两个产品之间的同一行,我让你管理定制。请注意,如果您输入了一个不存在的名称,您可能会在一个无休止的循环中输入该名称,那么您将需要一个错误处理,请参阅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调用到单元格中

为了子孙后代的利益,我将把@fnostro的评论中的答案包括在内,这篇评论就在


这不是Excel中的工作方式。当然,您可以通过在函数中对该标题执行搜索,然后对其下方的单元格执行操作来实现这一点。但是为什么要设计一个带有漫游列标题的spreadsheed呢。通常,您会使用命名范围,它们表示工作簿中的固定位置。但是它们可以在任何地方,并且函数将始终使用RangeName,而不管它是在哪里定义的

但是,您可以使用搜索来完成此操作:

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未返回任何内容,则忘记包含错误处理程序。现已修复。

Excel中不是这样做的。当然,您可以通过在函数中对该标题执行搜索,然后对其下方的单元格执行操作来实现这一点。但是为什么要设计一个带有漫游列标题的spreadsheed呢。通常,您会使用命名范围,它们表示工作簿中的固定位置。但是它们可以在任何地方,并且无论在哪里定义,函数都将始终使用RangeName。谢谢。电子表格是从一个系统自动生成的,几个用户在它到达我面前插入列。这些列是随机插入的,因此不能使用命名范围。我只想选取两列中的值,而不管它们在图纸中的位置如何。Matteo NNZ:您的解决方案有效-但只适用于一行。向下复制函数会得到与列标题后第一行相同的结果。此外,水果的价格和价格是否可以硬编码到函数中?这些列标题不会更改。@MMJ我的代码将返回列编号。。。这就足够了吗?@MMJ,不要把评论写进别人的答案中,否则我不会收到任何通知,我碰巧看到了你的评论;现在就来看看,我已经用Application.Caller修改了ActiveCell,这正是您想要的,现在它应该可以像您期望的那样工作了。这太棒了!现在每一行分别计算。但我无法硬编码这些值。我删除了参数,所以第一行是:Public Function myOperation,只要删除了columnHeader 1和columnHeader 2的注释。我通过=myOperation调用函数我做错了什么?感谢您在这方面的大力帮助@请看编辑,我不认为你做错了什么。记住,如果答案有效,就接受它,并且你可以/应该对所有你觉得有用的内容进行投票,而不仅仅是你选择的答案。像老板一样完成!非常感谢你。正是我要找的!
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