【问题标题】:VBA Vlookup within loop循环内的VBA Vlookup
【发布时间】:2015-03-24 04:05:16
【问题描述】:

用户在输入框中输入用户名(“输入用户名”),这些用户名出现在从第 4 行开始的第一列中(在代码中指定为单元格 (4+k-1,1))。他输入的用户名数量对应于他指出在特定日期活跃的用户数量,在第一个输入框中指定(“在这个日期有多少用户活跃?”)。

现在,我希望下一列 (cells(4+k-1,2)) 执行 vlookup 或类似函数,该函数在第一列(同一行)中获取用户名,并在不同的工作表(相同的工作簿!)。问题是,无论我尝试什么,我都找不到使这项工作有效的代码。我最简单的尝试在代码中呈现如下,并返回消息“运行时错误1004:应用程序定义或对象定义错误”。

Sub Makro4()
    Dim dates As Date
    dates = InputBox("Enter the date of activity in the format dd/mm/yyyy:.")  ' User chooses date

    Dim n As Integer
    Dim k As Integer

    n = InputBox("Number of users active on this date:.")

    For k = 1 To n + 1                                       'Inserts rows accoring to number of users active on specified date
        Rows(4).Insert Shift:=xlDown, _
              CopyOrigin:=xlFormatFromLeftOrAbove
    Next

    For k = 1 To n
        Cells(4 + k - 1, 1) = InputBox("Enter username")
        Cells(4 + k - 1, 2) = Application.WorksheetFunction.VLookup(ActiveWorkbook.Sheets("Users by date").Range(4 + k - 1, 1), ActiveWorkbook.Sheets("Userlist").Range("B:j"), 9, False)
    Next

    Range(Cells(4, 3), Cells(4 + n - 1, 3)) = dates ' blank row between each date

End Sub

【问题讨论】:

  • 那么问题出在哪里?
  • 我尝试了一百种不同的方法,但是如果我运行我粘贴在这里的代码,那么在“单元格 (4+k-1,2) =....”我收到错误消息“运行时错误 1004:应用程序定义或对象定义错误”。我粘贴了这个特定的代码,因为它很容易理解,你可以看到我的问题出现在哪里,这与我其他一些失败的尝试不同(这是我写过的第一个宏......)

标签: excel vba loops find vlookup


【解决方案1】:

试试这个(未经测试,但可以编译)

注意事项:

1) 始终尝试使用工作表对象来限定 Range()Cells() 的每次使用

2) 如果您删除了WorkSheetFunction,那么您可以测试返回值以查看它是否是错误,而不是让 vlookup 在不匹配时触发运行时错误

Sub Makro4()
    Dim dates As Date
    dates = InputBox("Enter the date of activity in the format dd/mm/yyyy:.")  ' User chooses date

    Dim n As Integer
    Dim k As Integer
    Dim usr, v
    Dim shtUBD As Worksheet, shtUsers As Worksheet

    Set shtUBD = ThisWorkbook.Sheets("Users by date")
    Set shtUsers = ThisWorkbook.Sheets("Userlist")

    n = InputBox("Number of users active on this date:.")

    For k = 1 To n + 1 'Inserts rows accoring to number of users active on specified date
        shtUBD.Rows(4).Insert Shift:=xlDown, _
              CopyOrigin:=xlFormatFromLeftOrAbove
    Next

    For k = 1 To n
        usr = InputBox("Enter username")
        'If you drop the "WorkSheetFunction" then you can test the
        '  return value using IsError(), else it will raise an
        '  error if there's no match found for the username...
        v = Application.VLookup(usr, shtUsers.Range("B:J"), 9, False)

        With shtUBD.Rows(4 + k - 1)
            .Cells(1).Value = usr
            .Cells(2).Value = IIf(IsError(v), "?User?", v)
        End With
    Next
    ' blank row between each date
    shtUBD.Range(shtUBD.Cells(4, 3), shtUBD.Cells(4 + n - 1, 3)) = dates

End Sub

【讨论】:

  • 非常感谢蒂姆!很有魅力。那里也有一些很棒的提示和代码。非常感谢!
  • 请问,当您说“Dim usr, v”时,这是否向 VBA 表明 v 在 usr 右侧的列中?编辑:实际上我认为您在“With”功能事物(Cells(1)和Cells(2))中指定了这一点,对吗?编辑 2:我是个菜鸟
  • 不——它只是说“创建两个未指定类型的变量,分别命名为usrv”,两者都默认类型为Variant,并且顺序并不重要。
【解决方案2】:

我认为您的问题出在VLOOKUP 函数中的第一个Range 描述中。如果您想使用行号/列号,请使用Cells 来描述范围。

为了避免自己对此进行大量打字实验,这应该可以解决您的直接问题:

With ActiveWorkbook.Sheets("Users by date")
    For k = 1 To n
        Cells(4 + k - 1, 1) = InputBox("Enter username")
        Cells(4 + k - 1, 2) = Application.WorksheetFunction.VLookup(.Cells(4 + k - 1, 1), ActiveWorkbook.Sheets("Sheet3").Range("B:j"), 9, False)
    Next
End With

【讨论】:

  • 干杯巴里这也有效!我一定已经尝试了一百万这样的事情而没有到达那里!我有一种感觉,我经常敲击键盘而不是输入一些真实的用户名,这将是错误 - 正如蒂姆所说,我本可以避免。非常感谢,我的第一个宏看起来很棒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多