zoukankan      html  css  js  c++  java
  • 多个excel文件合并,根据首列值进行反向拆分

    Sub Merge()
    '执行合并提示,防止误合并
    If MsgBox("是否执行文件合并?" & vbNewLine & "执行过程中所有提示框请点击'是'" & vbNewLine & "如果未生成文件,请联系:xxx", vbYesNo, "合并文件说明") = vbNo Then Exit Sub

    '定义excel操作主要函数,主文件夹路径,文件集合,第一第一sheet操作对象操作对象,第二第一sheet操作对象操作对象
    Dim MyPath$, MyName$, sh As Worksheet, sht As Worksheet, m&
    '设置第一操作对象为当前活动中的sheet
    Set sh = ActiveSheet
    '获取主文件夹路径
    MyPath = ThisWorkbook.Path & ""
    '获取".xlsx"文件集合
    MyName = Dir(MyPath & "*.xlsx")
    '关闭屏幕刷新,提升程序运行速度
    Application.ScreenUpdating = False
    '选中A-I列
    Range("A:I").Select
    '清空数据
    Selection.Clear

    '循环操作文件集合
    Do While MyName <> ""
    '根据文件名判定,前9个字符为"123456789-",且不为"123456789-中心公共"
    If MyName <> ThisWorkbook.Name And Left(MyName, 9) = "123456789-" And Left(MyName, 13) <> "123456789-中心公共" Then
    '载入对应文件
    With GetObject(MyPath & MyName)
    '循环操作sheet集合
    For Each sht In .Sheets
    '如果sheet为空,则跳过
    If IsSheetEmpty = IsEmpty(sht.UsedRange) Then
    '标识,首个文件特殊操作
    m = m + 1
    If m = 1 Then
    '全sheet复制
    sht.[a1].Range("A:I").Copy sh.[a1].Range("A1")
    '单元格格式复制,为了保持列宽
    sht.[a1].CurrentRegion.Copy sh.[a1]
    Else
    '第二行复制,至sheet2中最下一行首个单元格
    sht.[a1].CurrentRegion.Offset(1).Copy sh.[a65536].End(xlUp).Offset(1)
    End If
    End If
    Next
    '关闭,不保存改动
    .Close False
    End With
    End If
    '清空文件对象
    MyName = Dir
    Loop

    '将"其他"放置在最下
    MyName = Dir(MyPath & "*.xlsx")
    Do While MyName <> ""
    If MyName <> ThisWorkbook.Name And Left(MyName, 13) = "123456789-中心公共" Then
    With GetObject(MyPath & MyName)
    For Each sht In .Sheets
    If IsSheetEmpty = IsEmpty(sht.UsedRange) Then
    sht.[a1].CurrentRegion.Offset(1).Copy sh.[a65536].End(xlUp).Offset(1)
    End If
    Next
    .Close False
    End With
    End If
    MyName = Dir
    Loop

    Save
    '获取时间,格式为201708211718
    Times = Format(Now, "yyyymmddhhmm")
    '拼接新文件名
    filenames = ThisWorkbook.Path & "" + "123456789_" + Times + ".xlsm"
    '提示合并成功
    MsgBox "合并完毕,新文件为:" + filenames
    '生成新文件
    ThisWorkbook.SaveCopyAs Filename:=filenames
    '开启屏幕刷新
    Application.ScreenUpdating = True
    End Sub


    Sub Splitexcel()
    '定义excel操作对象:主文件夹路径,第一sheet操作对象,第二第一sheet操作对象操作对象
    Dim MyPath$, sh As Worksheet, sht As Worksheet, m&
    '设置第一操作对象为当前活动中的sheet
    Set sh = ActiveSheet
    '获取主文件夹路径
    MyPath = ThisWorkbook.Path & ""
    '关闭屏幕刷新,提升程序运行速度
    Application.ScreenUpdating = False

    '创建dict,存储模块和文化名,模块为key,文件名为value
    Dim dict
    Set dict = CreateObject("Scripting.Dictionary")
    '填充dict
    dict.Add "A股", "123456789-A股"
    dict.Add "基金", "123456789-基金"
    dict.Add "宏观", "123456789-宏观行业"
    dict.Add "行业及特色", "123456789-宏观行业"
    dict.Add "宏观行业自生产切换", "123456789-宏观行业"
    dict.Add "宏观行业其他", "123456789-宏观行业"
    dict.Add "新三板", "123456789-新三板"
    dict.Add "行情", "123456789-期指行情"
    dict.Add "期货期权指数", "123456789-期指行情"
    dict.Add "港股", "123456789-港股"
    dict.Add "财务", "123456789-财务"
    dict.Add "债券", "123456789-债券"
    dict.Add "其他", "123456789-中心公共"

    '根据dict,依次清除模块excel中除首行外单元格
    Dim key
    For Each key In dict
    '生成文件名
    MyName = Dir(MyPath & dict(key) & ".xlsx")
    Do While MyName <> ""
    '加载文件
    With GetObject(MyPath & MyName)
    For Each sht In .Sheets
    If IsSheetEmpty = IsEmpty(sht.UsedRange) Then
    '清空分表首行外数据
    sht.Range("A2:j" & [a65536].End(3).Row).Clear
    End If
    Next
    '取消视图隐藏
    .Windows(1).Visible = True
    '关闭文件,保留修改
    .Close True
    End With
    '清空文件名对象
    MyName = ""
    Loop
    Next

    '获取第二列最大行数值,
    rown = Range("b65536").End(xlUp).Row

    For i = 2 To rown
    '首列循环判断,确认各key对应行数
    If Range("A" & i).Value <> "" And Range("A" & i).Value <> "其他" Then
    n = i + 1
    '确认下一个key对应行数
    For j = n To rown
    If Range("A" & j).Value <> "" Then
    '根据第一层循环key,组合文件名
    MyName = Dir(MyPath & dict.Item(Range("A" & i).Value) & ".xlsx")
    Do While MyName <> ""
    '加载文件
    With GetObject(MyPath & MyName)
    For Each sht In .Sheets
    If IsSheetEmpty = IsEmpty(sht.UsedRange) Then
    '第二行复制,至sheet2中最下一行首个单元格
    sh.Range("A" & i, "I" & j - 1).Copy sht.[a65536].End(xlUp).Offset(1)
    End If
    Next
    '取消视图隐藏
    .Windows(1).Visible = True
    '关闭文件,保留修改
    .Close True
    End With
    '清空文件名对象
    MyName = ""
    Loop
    '设置j为最大行数,结束第二层循环
    j = rown
    End If
    Next j
    '最下的"其他"特殊处理,获取对应行数后,直接复制
    ElseIf Range("A" & i).Value = "其他" Then
    '组合文件名
    MyName = Dir(MyPath & dict.Item(Range("A" & i).Value) & ".xlsx")
    Do While MyName <> ""
    '加载文件
    With GetObject(MyPath & MyName)
    For Each sht In .Sheets
    If IsSheetEmpty = IsEmpty(sht.UsedRange) Then
    '第二行复制,至sheet2中最下一行首个单元格
    sh.Range("A" & i, "I" & rown).Copy sht.[a65536].End(xlUp).Offset(1)
    End If
    Next
    '取消视图隐藏
    .Windows(1).Visible = True
    '关闭文件,保留修改
    .Close True
    End With
    '清空文件名对象
    MyName = ""
    Loop
    End If
    Next i
    '开启屏幕刷新
    Application.ScreenUpdating = True

    End Sub

  • 相关阅读:
    P1604&P1601
    【USACO OPEN 10】hop
    [usaco2008feb_gold]路面修整
    bzoj1016: [JSOI2008]最小生成树计数
    bzoj1015: [JSOI2008]星球大战starwar
    bzoj1014: [JSOI2008]火星人prefix
    [bzoj3223]文艺平衡树
    bzoj3224: Tyvj 1728 普通平衡树
    bzoj1012: [JSOI2008]最大数maxnumber
    P3369 【模板】普通平衡树 (splay 模板)
  • 原文地址:https://www.cnblogs.com/ylpb/p/7379972.html
Copyright © 2011-2022 走看看