hug54586 2024-09-19 16:17 采纳率: 0%
浏览 2

VBA匹配信息需要的数据

VBA:按照Excel工作表中的唯一识别码列匹配一个文件夹中多个表格中对应sheet中所需要的数据

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-19 17:05
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在VBA中,如果你想从Excel工作表中的唯一识别码列匹配一个文件夹中多个表格对应sheet的数据,你需要创建一个宏来处理这个过程。这个宏可以遍历文件夹中的所有工作簿、工作表,通过识别码找到相应的数据,并将其导入到你当前的Excel工作表中。以下是一个基本的步骤和代码示例:

    步骤概述:

    1. 定义文件夹路径和工作表结构:确定包含多个表格的文件夹路径,以及这些表格的结构(即列名和数据布局)。
    2. 打开文件夹中的每个文件:遍历文件夹中的每个文件并打开它们。
    3. 循环遍历工作簿和工作表:对每个打开的工作簿和工作表进行处理。
    4. 数据匹配和提取:根据Excel工作表中的唯一识别码列,匹配并提取所需的数据。
    5. 关闭工作簿并继续处理下一个文件,直到处理完文件夹中的所有文件。

    代码示例:

    假设你有以下的场景:你的Excel工作簿中有一个名为“识别码”的列,你想从文件夹中的多个Excel文件中提取对应的数据。这些数据位于每个文件的特定工作表中。以下是实现此功能的VBA代码示例:

    Sub MatchDataFromFileFolder()
        Dim folderPath As String
        Dim fileName As String
        Dim wbTarget As Workbook '当前工作簿的引用
        Dim wbSource As Workbook '源工作簿的引用
        Dim wsTarget As Worksheet '当前工作表的引用
        Dim wsSource As Worksheet '源工作表的引用
        Dim lastRow As Long '用于跟踪数据的最后一行位置
        Dim searchRange As Range '用于搜索匹配数据的范围
        Dim matchData As Variant '用于存储匹配的数据
        Dim matchCode As String '要匹配的识别码字符串(从Excel当前工作表中获取)
        Dim fileCount As Integer '用于记录处理过的文件数量
        Dim sheetName As String '源数据所在的工作表名称
        Dim i As Integer '循环计数器
        Dim pathArray() As String '存放文件夹中的文件路径数组
        Dim pathCount As Integer '文件夹中的文件数量
        Dim currentPath As String '当前处理的文件路径
        Dim isMatch As Boolean '是否找到匹配的标识码
        Dim targetRange As Range '存储提取到的数据的范围(在当前工作簿中)
        Dim sourceRange As Range '存储要匹配的数据的范围(在源工作簿中)
        
        ' 设置文件夹路径(此处请替换为你的文件夹路径)
        folderPath = "C:\YourFolderPath\" ' 替换为你的文件夹路径
        fileCount = 0 ' 初始化文件计数为0
        pathCount = GetFilesCount(folderPath) ' 获取文件夹中的文件数量(自定义函数)
        ReDim pathArray(1 To pathCount) ' 动态分配数组大小以存储文件路径信息(自定义函数填充)
        GetFiles pathArray ' 获取所有文件路径(自定义函数)
        wsTarget = ActiveSheet ' 设置当前活动工作表为数据的目标工作表
        ' 其他设置根据需要定义,如源数据的表头位置等。这里假设识别码列是A列。 假设目标数据要提取到当前工作表的B列开始的位置。 假设源数据所在的工作表名为"Sheet1"。假设源数据的第一行是标题行。假设源数据的识别码列是A列。假设源数据的数据从第二行开始。等等。这些变量根据实际情况定义和调整。                   ’定义一个开始导入的目标行号位置 (可以是最后一行的下一行或任意你想要开始导入的位置)开始提取数据的起始行号,初始设置为当前数据的下一行位置                         lastRow = wsTarget.Cells(wsTarget.Rows.Count, "B").End(xlUp).Row + 1  '查找最后一行位置(用于存放提取的数据)' 循环遍历文件夹中的所有文件For i = LBound(pathArray) To UBound(pathArray)currentPath = pathArray(i)' 打开当前文件wbSource = Workbooks.Open(currentPath)' 获取源数据所在的工作表名称sheetName = "Sheet1" ' 这里假定所有文件中的数据都在名为Sheet1的工作表中wsSource = wbSource.Worksheets(sheetName)' 获取要匹配的识别码matchCode = wsTarget.Range("A" & wsTarget.Cells(wsTarget.Rows.Count).End(xlUp).Row).Value' 在源表中查找匹配的数据并提取数据wsSource.Columns("A").AutoFilter Field:=1, Criteria1:=matchCode '设置过滤条件进行筛选if not wsSource.AutoFilterMode then ' 如果之前没有设置过滤条件则设置过滤条件wsSource.Columns("A").AutoFilterField:=1End IfisMatch = FalseOn Error Resume Next ' 如果遇到错误也能继续运行Set searchRange = wsSource.Range("A:A").SpecialCells(xlCellTypeVisible) '寻找可见单元格范围(与过滤条件匹配的部分)If Not searchRange Is Nothing Then matchData = searchRange.EntireRow matchData 是包含匹配行的整行数据的数组wsTarget.Cells(lastRow, "B").Resize(UBound(matchData, 1), UBound(matchData, 2)).Value = matchData wsTarget 下拉拖拽一行保存结果,然后将数据从 matchData 复制到相应位置Elseis Match = FalseEnd IfOn Error GoTo 0 ' 恢复正常的错误处理wbSource.Close SaveChanges:=False ' 关闭源工作簿,不保存任何更改fileCount = fileCount + 1 ' 更新已处理文件计数Next iMsgBox "处理完成," & fileCount & " 个文件已被处理。", vbInformationMsgBox end Sub Function GetFilesCount(folderPath As String) As Integer ' 此函数返回指定文件夹中的文件数量(不包括子文件夹中的文件)...此处省略代码实现细节End Function Function GetFiles(pathArray() As String) ' 此函数填充包含指定文件夹中所有文件的路径数组...此处省略代码实现细节End Function请注意,以上代码是一个示例框架,需要根据实际情况进行调整和完善。特别是错误处理和边界情况的处理需要根据具体需求进行优化。实际编写VBA时可能需要根据自己的场景调整和修改代码以确保它能满足特定的需求并安全有效地运行。同时请确保在使用宏时保存你的Excel文件为宏启用的格式(如XLSM)。如果你在使用宏方面没有经验或者不确定如何进行,建议咨询更有经验的同事或寻求在线资源以获得帮助。同时,处理文件和宏时要小心谨慎以避免意外损失数据或破坏系统稳定性。```
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月19日