VBA:按照Excel工作表中的名称列自动汇总多个工作薄中对应sheet中所需要的数据

需求如下:

  1. B列为产品名为合并单元格,C列为供应商名,G、H列为金额数据;
  2. 数据源放在同一个文件夹内,B列产品名来源于工作薄名称中间的字符串,C列供应商名来源于工作薄中的sheet名;
  3. G、H列金额数据来源于工作薄中sheet中固定单元格P25:Q25的数值;
  4. 根据B列产品名自动打开对应的工作薄,并按照C列供应商名对应的sheet,把P25:Q25的数据自动复制到G、H列;

VBA执行效果视频

数据自动汇总

Sub GetDataFromSourceWorkbooks()
    Dim targetWorkbook As Workbook
    Dim targetWorksheet As Worksheet
    Dim currentSheetName As String
    Dim sourceFolder As String
    Dim productColumn As String
    Dim supplierColumn As String
    Dim amount1Column As String
    Dim amount2Column As String
    Dim cell As Range
    Dim product As String
    Dim supplier As String
    Dim sourceFileName As String
    Dim sourceWorkbook As Workbook
    Dim sourceWorksheet As Worksheet
    Dim amount1 As Double
    Dim amount2 As Double
    
    ' Replace with your specific column letters
    productColumn = "B"
    supplierColumn = "C"
    amount1Column = "G"
    amount2Column = "H"
    
    ' Replace with your target workbook path
    Set targetWorkbook = ThisWorkbook
    
    ' Set target worksheet name
    Set targetWorksheet = targetWorkbook.ActiveSheet ' 假设目标文件中的主工作表为活动工作表
    'Set currentSheetName = ActiveSheet.Name
    'Set targetWorksheet = targetWorkbook.Worksheets(currentSheetName)
    
    ' Input the folder path containing the source workbooks
    
    sourceFolder = InputBox("请输入目标文件路径:", "目标文件路径输入")
    sourceFolder = sourceFolder & "\"
    'sourceFolder = "C:\Users\18703\Desktop\自动化\数据\爱家影视包\"
    
    If sourceFolder = "" Then
        MsgBox "未输入目标文件路径。操作已取消。", vbExclamation
        Exit Sub
    End If
    
    '禁止刷新屏幕
    Application.ScreenUpdating = False
    
    
    Dim firstRow As String
    Dim lastRow As String
    firstRow = 2 '定义数值区域开始的行数
    lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row '查找数值区域最后一行

    '开始循环找对应目标工作表对应工作薄中sheet中所需要的单元格数据
    For Each cell In targetWorksheet.Range(productColumn & firstRow & ":" & productColumn & lastRow)
        '产品列值和供应商值
        product = cell.MergeArea.Cells(1, 1).Value ' Get the value of the first cell in the merged range
        supplier = cell.Offset(0, 1).Value
        
        '数据源excel表的所有路径
        sourceFileName = Dir(sourceFolder & "*" & product & "*.xls*")
        
        '若数据源不为空或数据源不是目标工作表就打开对应的工作薄中的sheet
        If sourceFileName <> "" And sourceFileName <> targetWorkbook.Name Then
            Set sourceWorkbook = Workbooks.Open(sourceFolder & sourceFileName)
            Set sourceWorksheet = sourceWorkbook.Worksheets(supplier)
            
            ' 确认所需要的数据
            amount1 = sourceWorksheet.Range("P25").Value
            amount2 = sourceWorksheet.Range("Q25").Value
            
            sourceWorkbook.Close False ' 数据源选择不保存关闭
            
            ' Update the target worksheet with the values from the source workbook
            cell.Offset(0, 5).Value = amount1 ' Amount 1 column
            cell.Offset(0, 6).Value = amount2 ' Amount 2 column
        Else
            cell.Offset(0, 5).Value = "Not Found" ' Amount 1 column
            cell.Offset(0, 6).Value = "Not Found" ' Amount 2 column
        End If
    Next cell
    
    '禁止刷新屏幕
    Application.ScreenUpdating = True
    
    MsgBox "数据获取完成,请确认!"
    
    ' 目标工作表保存但不关闭,确认无误后可手动关闭
    targetWorkbook.Save  ' Save changes
    
    
End Sub



Excel VBA (Visual Basic for Applications) 提供了一种强大的自动化工具,你可以使用VBA脚本来完成复杂的任务,例如将多个Excel工作簿中的特定合并到一个新的工作簿中。以下是简单的步骤说明: 1. **打开VBA编辑器**:首先,你需要在Excel中按下 `Alt + F11` 或者点击菜单栏的 "开发" -> "Visual Basic" 来打开VBA编辑器。 2. **创建宏**:在VBA编辑器中,右键点击 "Sheet1"(或者 "ThisWorkbook" 如果你想在新工作簿里操作)选择 "插入" -> "模块" 创建一个新的模块,然后在代码窗口开始编写代码。 ```vba Sub MergeColumns() Dim sourceBook As Workbook Dim targetBook As Workbook Dim sourceSheet As Worksheet Dim targetSheet As Worksheet Dim startRow As Long Dim lastRow As Long ' 设置源工作簿路径和需要合并的 Set sourceBook = Workbooks.Open("source_file.xlsx") Set sourceSheet = sourceBook.Worksheets("Sheet1") ' 更改为你需要合并的源工作表 startRow = 1 ' 开始行数,可根据实际情况调整 lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "A").End(xlUp).Row ' 创建目标工作簿 Set targetBook = Workbooks.Add Set targetSheet = targetBook.Worksheets(1) ' 从每个源工作簿复制数据到目标工作簿 For i = 1 To sourceBook.Workbooks.Count If i = 1 Then ' 如果这是第一个工作簿,则直接粘贴数据 sourceSheet.Range(sourceSheet.Cells(startRow, 1), sourceSheet.Cells(lastRow, sourceSheet.Columns.Count)).Copy Destination:=targetSheet.Cells(startRow, 1) Else ' 否则,在目标工作簿中追加数据 sourceSheet.Range(sourceSheet.Cells(startRow, 1), sourceSheet.Cells(lastRow, sourceSheet.Columns.Count)).Copy _ Destination:=targetSheet.Cells(targetSheet.Cells.SpecialCells(xlCellTypeLastCell).Row + 1, 1) End If Next i ' 关闭不需要的工作簿并保存目标工作簿 sourceBook.Close SaveChanges:=False targetBook.SaveAs "merged_data.xlsx" ' 更改为你的目标文件名 End Sub ``` 记得替换 `"source_file.xlsx"` 为源工作簿的实际路径,以及适当的和行范围。运行这个宏,你的工作簿就会按照指定的方式合并了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rubyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值