分享

Excel VBA【代码】合并工作簿:按指定条件批量合并工作簿内容

 冷茶视界 2024-01-22 发布于江苏

内容提要

  • 按条件合并工作簿完整代码
一、在myModule里:dataCombine过程,参数为6位年月字符串,循环明细清单文件所有工作表,把符合条件的工作簿里的工作表进行汇总。
Sub dataCombine(strMonth As String)    Application.ScreenUpdating = False    Dim FSO As Object, folder As Object, file As Object    Dim arr(), arrtemp()    Dim dataFolder As String, dataFile As String    Dim ws As Worksheet, wb As Workbook    Dim lastRow As Long, lastCol As Long    Dim currMonth As String, fileExtn As String    '//指定目标文件夹    dataFolder = ThisWorkbook.Path & "\故障清单"    Set FSO = CreateObject("Scripting.FileSystemObject")    '//通过FSO取得文件夹对象    Set folder = FSO.getfolder(dataFolder)    Set ws = ThisWorkbook.Sheets("工单列表")    '//把工单列表表头字段装入数组,并清空第2行及以下内容    With ws        lastRow = .UsedRange.Rows.Count        lastCol = .UsedRange.Columns.Count        .Range(.Cells(2, 1), .Cells(lastRow, lastCol)).Clear        arr = .Range(.Cells(1, 1), .Cells(1, lastCol))        arr = Application.WorksheetFunction.Transpose(arr)        r = UBound(arr)    End With    '//遍历folder中的所有文件    For Each file In folder.Files        fileExtn = Mid(file.Name, InStrRev(file.Name, "."))        '//只处理Excel文件,避开临时文件        If fileExtn Like ".xl*" And InStr(file.Name, "~$") = 0 Then            If InStr(file.Name, strMonth) Then   '//如果文件名包括条件日期                dataFile = file.Path & "\" & file.Name                Set wb = Workbooks.Open(file.Path)                For Each ws In wb.Sheets  '//循环所有工作表,虽然本案例只有一个                    If ws.UsedRange.Count > 1 Then  '//判断工作表是否有数据                        arrtemp = ws.UsedRange                        k = UBound(arr, 2)                        '//动态扩展数组                        ReDim Preserve arr(1 To r, 1 To UBound(arrtemp) + k - 1)                        '//循环两个数组,比较第一列(行)表头字段,相同的把数据写入arr                        For i = 1 To UBound(arr)                            For j = 1 To UBound(arrtemp, 2)                                If arrtemp(1, j) = arr(i, 1) Then                                    For h = k + 1 To UBound(arr, 2)                                        arr(i, h) = arrtemp(h - k + 1, j)                                    Next                                End If                            Next                        Next                    End If                Next                wb.Close            End If        End If    Next    '//把数据写入目标工作表    Set ws = ThisWorkbook.Sheets("工单列表")    ws.Cells(1, 1).Resize(UBound(arr, 2), UBound(arr)) = Application.WorksheetFunction.Transpose(arr)    ws.Activate    Application.ScreenUpdating = TrueEnd Sub
二、在工作表“汇总”里,工作表Change事件,如果是G1单元格、输入4位以上数字,则调用SetDataValidation过程,如果长度是6位,则调用dataCombine过程,这里没有限定为数字,如果G1的值不包括在清单文件名中,则无数据可合并。
Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Address = "$G$1" Then        If Len(Target) >= 4 And IsNumeric(Target) Then            Call SetDataValidation(Target)        End If        If Len(Target) = 6 Then            Call dataCombine(CStr(Target.Value))        End If    End IfEnd Sub
三、在工作表“汇总”里,SetDataValidation过程,根据单元格输入的值来设置数据验证,更改下拉列表的年份
Private Sub SetDataValidation(rng As Range)    Dim wsSource As Worksheet    Dim rngStr As String    Dim listStr As String    '//取G1单元格输入值的前4位,如果输入正确应该是年份,再与1-12进行组合    For i = 1 To 12        listStr = listStr & Left(rng.Value, 4) & Format(i, "00") & ","    Next    '//去掉结尾的 ","    listStr = Left(listStr, Len(listStr) - 1) '//删除已有的数据验证    rng.Validation.Delete    With rng.Validation    '//添加数据验证,源为listStr        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _            Operator:=xlBetween, Formula1:=listStr        .IgnoreBlank = True        .InCellDropdown = True        .ShowInput = True        .ShowError = False  '//不显示出错警告,改为TRUE则显示,同时不能输入不合验证的字符    End WithEnd Sub
四、在工作表“汇总”里,命令按钮点击事件,调用dataCombine过程
Private Sub CmdCombine_Click()    Call dataCombine(CStr(Range("G1").Value))End Sub

~~~~~~End~~~~~~

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章