Excel过滤器和正则表达式匹配数字到另一个工作表

时间:2017-08-07 21:26:45

标签: excel vba excel-vba

我有点像Excel菜鸟,所以请耐心等待。我有以下删节表:

const myArray = [  
   {  
      "id":25,
      "name":"Anakin Skywalker",
      "createdAt":"2017-04-12T12:48:55.000Z",
      "updatedAt":"2017-04-12T12:48:55.000Z"
   },
   {  
      "id":1,
      "name":"Luke Skywalker",
      "createdAt":"2017-04-12T11:25:03.000Z",
      "updatedAt":"2017-04-12T11:25:03.000Z"
   }
]

const myOrderedArray = _.sortBy(myArray, o => o.name)

在同一个文件中的另一张表引用名称:

Sheet1
         H                        AP               AO
1 Transaction Description    Employee Name        Type
2 ER 12345678                    blank             blank
3 ER 13182984                    blank             blank
4 ER 18213289                    blank             blank
5 ER 13829429                    blank             blank
6 ER 89234024                    blank             blank

我想知道如何从第二张表的匹配报告编号中有效填写第一张excel表的员工姓名和类型列:

Sheet2
       E                           I
1 Expense Report Number      Employee Name     
2 12345678                    Chris Rock         
3 13182984                    Hank Hill          
4 18213289                    Tom Sawyer         
5 13829429                    Elon Musk          
6 89234024                    Tupac Shakur       

到目前为止我的尝试:

Sheet1
        H                            AP              AO
1 Transaction Description      Employee Name        Type   
2 ER 12345678                    Chris Rock           A
3 ER 13182984                    Hank Hill            A
4 ER 18213289                    Tom Sawyer           A
5 ER 13829429                    Elon Musk            A
6 ER 89234024                    Tupac Shakur         A

正如你所看到的,我在这段代码中很遗憾..非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

在Sheet1的表格中,如果8位数字始终从位置4开始,如您所示,您可以使用下面公式中的MID函数。如果没有,我们只需将MID更改为更复杂的内容,具体取决于实际数据。除非文本分析复杂,否则无需REGEX。

根据查找表中Employee NameExpense Report Number的顺序,INDEX(MATCH(...将成为一种解决方案。

虽然您可以使用LOOKUP,但使用INDEX(MATCH...可能更有效。除其他事项外,LOOKUP要正常工作,需要对查找表进行排序。 INDEX/MATCH没有必要这样做。

这样的东西
=INDEX(EmployeeName,MATCH(--MID(H2,4,8),ExpenseReportNumber,0))

为了提高效率,对两列(EmployeeNameExpenseReportNumber)的引用应尽可能短。整个列引用(例如:$E:$E$I:$I将起作用,但执行时间会更长。

答案 1 :(得分:1)

试试这个测试代码

Sub Test()

    Dim ddd As Variant                                ' convert sheet1.columnH into an array
    ddd = Sheets("Sheet1").Range("h2:h6").Value       ' 2D array 1 x N
    ddd = Application.Transpose(ddd)                  ' 2D array N x 1
    ddd = Application.Transpose(ddd)                  ' this changes to 1D array

    Dim i As Integer
    For i = 0 To UBound(ddd)                          ' remove the "ER" from each member of the array
      ddd(i) = Split(ddd(i))(1)
    Next i

    Dim findMe As String
    Dim rng As Range

    For Each rng In Sheets("Sheet2").Range("e2:e6")

        findMe = rng.Value

        For i = 1 To UBound(ddd)
            If StrComp(findMe, ddd(i), vbTextCompare) = 0 Then                                                                      
                Sheets("Sheet1").Range("ap1").Offset(i) = rng.Offset(0, 4).Value
                Sheets("Sheet1").Range("ao1").Offset(i) = "A"
            End If
        Next i
    Next rng
End Sub