【问题标题】:VLookup function in VBA - Return a department value based on name valueVBA 中的 VLookup 函数 - 根据名称值返回部门值
【发布时间】:2019-08-17 08:13:00
【问题描述】:

我希望根据名称值返回部门值。名称列表是从第三方供应商导入的,每次都会随机排序,因此我无法将部门值设置为指定单元格。我有一个数据范围(dim rng),其中有一个名称和 A 列以及 B 列中的一个部门。我希望与该名称关联的部门在新工作表上以相同的方式返回。我已附加我的代码,但出现应用程序定义或对象定义错误,我不知道为什么。

Sub find()

Dim namerng As Range
Dim rng As Range
Dim depti As Integer
Dim dept As String

Set namerng = Range("A1:A250") 'range of names
Set rng = Sheet1.Range("A1:B250") 'range of names in col A and dept in col B

    For depti = 3 To 250
     dept = "=IfError(Vlookup(namerng,rng,2,FALSE), "")"
     Range("B" & depti) = dept

    Next

End Sub

【问题讨论】:

  • 你在哪一行得到错误?
  • 另外,如果您将 VBA 引用添加到 Excel 的字符串方程中,您需要添加变量,例如 "=IfError(Vlookup(" & "namerng & "," & rng & ",2,FALSE), """")"(请注意额外的引号将它们添加到字符串中。如果您做了Debug.Print "=IfError(Vlookup(namerng,rng,2,FALSE), "")",输出将是=IfError(Vlookup(namerng,rng,2,FALSE), "))
  • 我在 Range("B" & depti) = dept 行上遇到错误
  • 添加 debug.print 使程序运行,但部门 B 列中没有值
  • 我相信如果您使用dept = "=IfError(Vlookup(" & namerng.Address & "," & rng.Address & ",2,FALSE), """")",它应该会运行并插入方程式。但是,我不相信这个等式是你想要的。现在,存在循环引用(一切都发生在同一张纸上),VLOOKUP 只接受第一个参数的一个值,而不是多个单元格的范围。

标签: excel vba range vlookup


【解决方案1】:

您似乎缺少一些代码来尝试实现您想要的东西,因此以下一些是假设。

Sub find()

    Dim namerng As Range 'List of Randomly Organized Names Only
    Dim Lookuprng As Range 'List of Names and Departments
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet

    Set sh1 = ThisWorkbook.Worksheets(1) 'List of Randomly Organized Names Only
    Set sh2 = ThisWorkbook.Worksheets(2) 'List of Names and Departments

    'List of Names and Departments
    sh1.Activate
    Set Lookuprng = sh1.Range(Cells(1, 1), (Cells(Rows.Count, 2).End(xlUp)))

    'List of Randomly Organized Names Only  ******NEED TO SPECIFY WHERE THESE NAMES ARE COMING FROM, I used Sheet1
    sh2.Activate
    Set namerng = sh2.Range(Cells(1, 1), (Cells(Rows.Count, 1).End(xlUp)))

    'Put correct department with name
    namerng.Offset(0, 1) = Application.VLookup(namerng, Lookuprng, 2, False)

End Sub

【讨论】:

  • 非常感谢您的评论!这对我来说效果很好,除了一些调整之外,因为你是对的,我从我的代码中选择了一个选择部分来发布,所以我有更多的事情需要考虑。再次感谢您!
  • 不客气。如果我的回答对您有用,请单击复选标记将其标记为答案。
  • 刚刚做到了!抱歉还是这个网站的新手哈哈
【解决方案2】:

根据您对问题的描述以及您要解决的问题,我认为以下代码应该可以按需要工作。

Sub find()

Dim rng As Range
Dim depti As Integer
Dim dept As String

Set rng = Sheet1.Range("A1:B250") 'range of names in col A and dept in col B

    For depti = 3 To 250
     dept = "=IfError(Vlookup(A" & depti & ",'" & Sheet1.Name & "'!" & rng.Address & ",2,FALSE), """")"
     Range("B" & depti) = dept
    Next

End Sub

备注

我删除了namerng 变量,因为更新后的方程不需要它。由于 VLookup 仅将单个值作为第一个参数,因此该值应取决于循环变量的值,与目标范围相同。

我还对引号进行了转义,使函数有效,并添加在 sheet1.name 中,以便范围地址指向正确的工作表(带单引号,以防工作表名称有空间)。

注意事项:按照这种编码方式,公式将插入到代码运行时处于活动状态的任何工作表上。这意味着如果Sheet1 处于活动状态,则部门将被循环公式覆盖。

【讨论】:

  • W-hit 的答案看起来会填写实际的部门值,而我的将填写一个返回它们的 excel 方程。 (stackoverflow.com/a/55366184)
  • 非常感谢您的回复!这使程序运行,但不会从我需要的第二张表中提取值。但是我认为这是我的问题,因为我在表格中的公式一直搞砸了,将来看到这个的任何人都可以用它来帮助他们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多