如果在Cell中键入关键字,则从另一个工作表中提取数据的代码

时间:2016-07-12 22:10:38

标签: excel vba excel-vba

我有一张包含多张纸的单词本。我有一张名为“Info”的表,其中包含数百行员工。每个员工在B栏中分配一个员工编号;行的其余部分(24列)包含员工的其余个人信息。  我有另一张名为“数据”的表格,只需要一组20到40人,每天都有所不同 我希望能够将一个员工编号(例如:SN124523)输入到名为“数据”的工作表B列中的空单元格中。然后,我希望行的其余部分使用“信息”表中的员工信息自行填充。   我需要与最多40名员工进行此操作,因此无论我在“数据”表单的B列中选择哪个单元格,我都希望在导入信息时搜索“信息”表。 我使用VLOOKUP公式进行了这项工作,但是因为有多少人有时会使用这本书而且我有时必须删除并替换“info”表,我总是在公式中出现#REF错误。

我试过这样的事情只是为了几行数据作为试验,但我无法得到任何工作。

Sub Add_member()

Dim ws As Worksheet
Dim ws1 As Worksheet
Dim iRow, row_count As Long
Set ws = Worksheets("Info")
Set ws1 = Worksheets("Data")

row_count = ws.Range("B" & Rows.Count).End(xlUp).Row
For iRow = 2 To row_count

If ws1.Cells(iRow, 2) = ws.Cells(iRow, 2) Then
ws1.Cells(iRow, 4).Value = ws.Cells(iRow, 4).Value
ws1.Cells(iRow, 5).Value = ws.Cells(iRow, 5).Value
‘ I would need this to fill 24 columns in total.
End If
Next
End Sub

任何帮助都得到了很多赞赏。

3 个答案:

答案 0 :(得分:0)

未测试:

Sub Add_member()

    Dim ws As Worksheet
    Dim ws1 As Worksheet
    Dim f As Range, c As Range, rng As Range

    Set ws = Worksheets("Info")
    Set ws1 = Worksheets("Data")

    Set rng = ws1.Range("B2", ws1.Cells(Rows.Count, 2).End(xlUp))

    For Each c In rng.Cells
        If Len(c.Value) > 0 Then
            Set f = ws.Columns(2).Find(what:=c.Value, LookIn:=xlValues, _
                                       lookat:=xlWhole)
            If Not f Is Nothing Then
                c.Offset(0, 2).Resize(1, 24).Value = _
                                   f.Offset(0, 2).Resize(1, 24).Value
            End If
        End If
    Next

End Sub

答案 1 :(得分:0)

在这种情况下,我会使用Event_Handler。因此,当您输入数字时,数据会自动为您更新。

假设B1是单元格,您将输入要查找的数字。

将以下代码发布到WorkSheet module,输入一个数字,并在第1行显示该数字的数据

Private Sub Worksheet_Change(ByVal Target As Range)

   Dim fCell As Range
   Dim rng As Range

     Application.EnableEvents = 0
      Set ws = Worksheets("Info")
      If Not Intersect(Target, Range("B1")) Is Nothing Then
            Set fCell = ws.Range("B2:B1000").Find(What:=Target, After:=ActiveCell, LookIn:=xlFormulas, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)

        If Not fCell Is Nothing Then
          Target.Resize(, 24).Value = fCell.Resize(, 24).Value
        Else
          MsgBox "No number exists."
          Range("B1:Y1").ClearContents
        End If
      End If
     Application.EnableEvents = 1

End Sub

答案 2 :(得分:0)

假设

  • 员工编号是一个字符串(如“SN124523”)

  • 至少有一个员工编号

  • 员工编号在表格“数据”栏B的连续范围内输入(即他们之间的空白)

然后你可以使用

Sub Add_member()
    Worksheets("Data").Columns(2).SpecialCells(xlCellTypeConstants, xlTextValues).offset(, 2).Resize(, 24).FormulaR1C1 = "=Vlookup(RC2,Info!C2:C27,column()-1)"
End Sub

或,如果你想摆脱公式:

Sub Add_member()
    With Worksheets("Data").Columns(2).SpecialCells(xlCellTypeConstants, xlTextValues).offset(, 2).Resize(, 24)
        .FormulaR1C1 = "=Vlookup(RC2,Info!C2:C27,column()-1)"
        .value = .value
    End With
End Sub

当然可以删除所有上述假设,并相应地更改代码。

但上面的那个只是为了显示最短的