有的人看上去是精算师,其实是魔法少女——如何用VBA快速跨表找记录



  • 作为一个精算师,我们经常会跨很多excel表处理数据。
    最近珂珂研究了一款小工具,可以用来在不手动打开Excel文件的情况下寻找一个字段在哪些Excel工作薄里出现了。
    小工具如下图。是不是有一种在使用魔法的感觉呢!嘿嘿工作彷佛都有趣了很多。
    313f153b-5ebb-40af-9ef8-c06b66e4121e-image.png



  • 先看看如何使用吧。在Path单元格下方写入要寻找的Excel的路径,多少没有限制。右边的"D1“单元格写要查找的值。点击Magic就可以啦
    77d56b3f-a28b-4ef7-96b5-a4da44f042be-image.png
    点击后弹出了对话框
    58180a08-e923-43d6-8c53-760deecb58a6-image.png
    点击”是“后就可以运行宏啦。
    如果在某个工作薄中能找到这个字段,就会弹窗弹出工作薄的名字,并在Output这个工作表中输出所有可以找到该字段的工作薄的名称。



  • 核心代码,path是写着"Path"的单元格的名字哦,怎么给单元格起名往期已经介绍过啦!

    ‘Read paths 
    path = Range("path").CurrentRegion.Value
        
        For i = 2 To UBound(path, 1)
            
            'Open workbook in invisible read only mode
            Set wbResults = Workbooks.Open(Filename:=path(i, 1), UpdateLinks:=0, ReadOnly:=True)
            wbResults.Windows(1).Visible = False
            'Run WorksheetLoop Macro
            Call WorksheetLoop(wbResults, lookforvalue)
            'Close workbook
            wbResults.Close SaveChanges:=False
        Next i
    

    细心的小朋友可以注意到,上面的代码用了"WorksheetLoop"这个宏。
    这个宏如下

    Private Sub WorksheetLoop(wb As Workbook, what_to_look_for)
        
        Dim sh          As Worksheet, loc As Range
    'Loop through worksheets
        For Each sh In wb.Worksheets
            With sh.UsedRange
                Set loc = .Cells.Find(What:=what_to_look_for)
                If Not loc Is Nothing Then
                   'op is the code name of worksheet "output"
                    If op.Range("A2") = "" Then
                        op.Range("A2") = wb.Name
                    Else
                        op.Range("A1").End(xlDown).Offset(1, 0) = wb.Name
                    End If
                    MsgBox "Found in " & wb.Name
                    Exit Sub
                Else
                    
                End If
            End With
            Set loc = Nothing
        Next
        MsgBox "Not found in " & wb.Name
        
    End Sub
    
    

    注意可以用Private Sub,因为我们不需要在工作薄里使用它,只需要在别的Public宏中使用即可。



  • record finding tool.zip
    原工作薄附上~ 把代码稍作修改,就可以用于别的跨表工作哦。嘻嘻。


登录后回复