vba案例1:合并工作簿,工作表

news2024/11/16 21:22:32

一:放文件

我应该有把文件资源放上去,第一次弄,不知道你们那边能不能看到excel的电子档表格,没有看到,教教我怎么放上去哦

二:自定义代码规整(便于查看)

接下来,我们进行代码解释,因为有很多自定义变量,我先把自定义变量放在一起查看,不然到后面会忘记变量的含义(会晕头转向)


ljj = ThisWorkbook.Path '当前“合并工具“”工作簿的地址

lj = .SelectedItems(1) '此为文件夹的路径

Dim d As Object '此为字典

Dim ww As Workbook '工作簿
Dim sh As Worksheet         '工作表
Dim arr(), brr() '数组
Dim wb As Workbook '工作簿
Set ww = ThisWorkbook '当前“合并工具“”工作簿
bt = TextBox1.Text '窗体里面的,标题行数
bw = TextBox2.Text '窗体里面的,表尾行数

Set sht = ww.Worksheets("目录") '当前“合并工具“”工作簿中的“目录”表

For Each sh In ww.Worksheets '“合并工具”簿中历遍每个工作表(注:sh不是固定含义)

f = Dir(lj & "\*.xls*") '目标文件夹中的工作簿的名称

Set wb = Workbooks.Open(lj & "\" & f, 0) '目标文件夹中的工作簿

mc = Split(wb.Name, ".")(0) '工作簿名称

 For Each sh In wb.Worksheets '历遍目标文件夹中的工作簿中的每个工作表

r = sh.UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row '''SearchDirection查找方向

'用find方法,表中的最后一行

ms = sh.UsedRange.Find(What:="*", Searchorder:=xlByColumns,SearchDirection:=xlPrevious).Column '' '用find方法,表中的最后一列

rs = .UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row '目标文件的表复制到“合并工具”最后,在“合并工具”簿中来得到最后一行

rs = .UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row + 1 '如果有同名表,则得出最后一行+1

f = Dir '获取下一个文件名,并将其赋值给变量 f

wj = .SelectedItems(1) ‘CommandButton3中的单个文件路径(其实就是工作簿路径)

For Each shtt In wb.Worksheets '历遍目标工作簿中的每个工作表

d(shtt.Name) = "" '装入字典

ws = .UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row + 1 '“汇总”表的最后一行+1


三:接下是运行代码顺序,点击表中的合并按钮,则弹出窗体

Sub 合并()
合并界面.Show 0
End Sub

四:接下来浏览文件,执行代码,如下:

Private Sub CommandButton1_Click()
ljj = ThisWorkbook.Path
VBA.ChDir ljj
Set dlgOpen = Application.FileDialog(msoFileDialogFolderPicker)
With dlgOpen
    If .Show <> -1 Then MsgBox "您没有选择文件夹!": Exit Sub
    lj = .SelectedItems(1)
End With
End Sub
Private Sub CommandButton2_Click() '''合并按钮
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim d As Object
Set d = CreateObject("scripting.dictionary")
Dim ww As Workbook
Dim sh As Worksheet
Dim arr(), brr()
Dim wb As Workbook
Set ww = ThisWorkbook
bt = TextBox1.Text
bw = TextBox2.Text
If lj = "" Then MsgBox "请先选择文件夹!": Exit Sub
If OptionButton1 = False And OptionButton2 = False And OptionButton3 = False And OptionButton4 = False Then MsgBox "请选择合并类型!": Exit Sub
If OptionButton2 = True Or OptionButton3 = True Then
    If bt = "" Then MsgBox "请输入标题行数": Exit Sub
    If bw = "" Then MsgBox "请输入表尾行数,如果没有表尾则表尾行数输入数值0": Exit Sub
End If
Set sht = ww.Worksheets("目录")
t = Timer
sht.[a1].CurrentRegion.Offset(1) = Empty
For Each sh In ww.Worksheets
    If sh.Name <> "目录" Then sh.Delete
Next sh
f = Dir(lj & "\*.xls*")
If OptionButton1 = True Then
    m = 1
    Do While f <> ""
        If f <> ThisWorkbook.Name Then
            m = m + 1
            Set wb = Workbooks.Open(lj & "\" & f, 0)
            wb.Worksheets(1).Copy after:=ww.Worksheets(ww.Worksheets.Count)
            mc = Split(wb.Name, ".")(0)
            With ww.Worksheets(ww.Worksheets.Count)
                .Name = mc
            End With
            sht.Cells(m, 1) = m - 1
            sht.Cells(m, 2) = mc
            sht.Hyperlinks.Add anchor:=sht.Cells(m, 2), Address:="", SubAddress:="'" & mc & "'!a1", TextToDisplay:=mc
           wb.Close False
        End If
    f = Dir
    Loop
ElseIf OptionButton2 = True Then
    m = 1
    Do While f <> ""
        If f <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(lj & "\" & f, 0)
            mc = Split(wb.Name, ".")(0)
            For Each sh In wb.Worksheets
                r = sh.UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row '''SearchDirection查找方向
                ms = sh.UsedRange.Find(What:="*", Searchorder:=xlByColumns, SearchDirection:=xlPrevious).Column ''
                If r > Val(bt) Then
                    m = m + 1
                    If Not d.exists(sh.Name) Then
                        sh.Copy after:=ww.Worksheets(ww.Worksheets.Count)
                        d(sh.Name) = ""
                        With ww.Worksheets(ww.Worksheets.Count)
                            rs = .UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row  '''SearchDirection查找方向
                            Columns("a:a").Insert Shift:=xlToRight
                            For i = Val(bt) + 1 To rs
                                .Cells(i, 1) = mc
                            Next i
                            .Rows(rs - Val(bw) - 1 & ":" & rs).Delete
                        End With
                        sht.Hyperlinks.Add anchor:=sht.Cells(m, 2), Address:="", SubAddress:="'" & sh.Name & "'!a1", TextToDisplay:=sh.Name
                    Else
                        With ww.Worksheets(sh.Name)
                            rs = .UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row + 1
                            sh.Range(sh.Cells(Val(bt) + 1, 1), sh.Cells(r - Val(bw), ms)).Copy .Cells(rs, 2)
                            For i = rs To rs + r - Val(bw) - 1
                                .Cells(i, 1) = mc
                            Next i
                        End With
                    End If
                End If
            Next sh
           wb.Close False
        End If
    f = Dir
    Loop
ElseIf OptionButton3 = True Then
    Set sht = ThisWorkbook.Worksheets.Add(after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
    Do While f <> "" ''在目录中循环
        If f <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(lj & "\" & f) '打开文件
            m = m + 1
            r = wb.Worksheets(1).UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row
            If r > Val(bt) Then
                If m = 1 Then
                    wb.Worksheets(1).Copy after:=ww.Worksheets(ww.Worksheets.Count)
                Else
                    With ww.Worksheets(ww.Worksheets.Count)
                        .Name = "全部数据"
                        rs = .UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row + 1
                        wb.Worksheets(1).Rows(Val(bt) + 1 & ":" & r - Val(bw)).Copy .Cells(rs, 1)
                    End With
                End If
            End If
            wb.Close False
        End If
    f = Dir
    Loop
ElseIf OptionButton4 = True Then
    If wj = "" Then MsgBox "您选择的是[一薄多表合并为一表],请先选择单个文件!": Exit Sub
    Set wb = Workbooks.Open(wj)
    For Each shtt In wb.Worksheets
        d(shtt.Name) = ""
    Next shtt
    If d.exists("汇总") Then wb.Worksheets("汇总").Delete
    For Each sh In wb.Worksheets
        If sh.Name <> "汇总" Then
            rs = sh.UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row
            If rs > Val(bt) Then
                m = m + 1
                If m = 1 Then
                    sh.Copy before:=wb.Worksheets(1)
                    wb.Worksheets(1).Name = "汇总"
                    If Val(bw) > 0 Then
                        With wb.Worksheets("汇总")
                            .Rows(rs - Val(bw) - 1 & ":" & rs).Delete
                        End With
                    End If
                Else
                    With wb.Worksheets("汇总")
                        ws = .UsedRange.Find(What:="*", SearchDirection:=xlPrevious).Row + 1
                        sh.Rows(Val(bt) + 1 & ":" & rs - Val(bw)).Copy .Cells(ws, 1)
                    End With
                End If
            End If
        End If
    Next sh
    wb.Close True
End If
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox "ok!"
End
End Sub

Sub 合并()
Dim ar As Variant
Dim br()
ReDim br(1 To 50000, 1 To 7)
For Each sh In Sheets
    If sh.Name <> "合并" Then
        r = sh.Cells(Rows.Count, 2).End(xlUp).Row
        ar = sh.Range("a1:g" & r)
        For i = 1 To UBound(ar)
            If Trim(ar(i, 2)) <> "" Then
                n = n + 1
                br(n, 1) = n
                For j = 2 To UBound(ar, 2)
                    br(n, j) = ar(i, j)
                Next j
            End If
        Next i
    End If
Next sh
With Sheets("合并")
    .[a1].CurrentRegion.Offset(4).Clear
    .[a5].Resize(n, UBound(br, 2)) = br
    .[a5].Resize(n, UBound(br, 2)).Borders.LineStyle = 1
End With
MsgBox "合并完毕!"
End Sub

Private Sub CommandButton3_Click() '''选择单个文件
With Application.FileDialog(msoFileDialogFilePicker)
     .Title = "请选择数据源文件"
     .AllowMultiSelect = False   '单选择
     .Filters.Clear   '清除文件过滤器
     .Filters.Add "Excel Files", "*.xls;*.xls*"
     .Filters.Add "All Files", "*.*"          '设置两个文件过滤器
     If .Show <> -1 Then MsgBox "您没有选择需要合并的文件!": Exit Sub 'FileDialog 对象的 Show 方法显示对话框,并且返回 -1(如果您按 OK)和 0(如果您按 Cancel)。
     wj = .SelectedItems(1)
End With
End Sub

Private Sub CommandButton4_Click()
End
End Sub

Private Sub OptionButton1_Click()
If OptionButton1 = True Then
    Me.Label1.Visible = False
    Me.Label2.Visible = False
    Me.TextBox1.Visible = False
    Me.TextBox2.Visible = False
    Me.CommandButton3.Visible = False
End If
End Sub
Private Sub OptionButton2_Click()
If OptionButton2 = True Then
    Me.Label1.Visible = True
    Me.Label2.Visible = True
    Me.TextBox1.Visible = True
    Me.TextBox2.Visible = True
    Me.CommandButton3.Visible = False
Else
    Me.Label1.Visible = False
    Me.Label2.Visible = False
    Me.TextBox1.Visible = False
    Me.TextBox2.Visible = False
    Me.CommandButton3.Visible = True
End If
End Sub


Private Sub OptionButton3_Click()
If OptionButton3 = True Then
    Me.Label1.Visible = True
    Me.Label2.Visible = True
    Me.TextBox1.Visible = True
    Me.TextBox2.Visible = True
    Me.CommandButton3.Visible = False
Else
    Me.Label1.Visible = False
    Me.Label2.Visible = False
    Me.TextBox1.Visible = False
    Me.TextBox2.Visible = False
    Me.CommandButton3.Visible = True
End If
End Sub
Private Sub OptionButton4_Click()
If OptionButton4 = True Then
    Me.Label1.Visible = True
    Me.Label2.Visible = True
    Me.TextBox1.Visible = True
    Me.TextBox2.Visible = True
    Me.CommandButton3.Visible = True
Else
    Me.Label1.Visible = False
    Me.Label2.Visible = False
    Me.TextBox1.Visible = False
    Me.TextBox2.Visible = False
    Me.CommandButton3.Visible = False
End If
End Sub

Private Sub UserForm_Initialize()
Me.Label1.Visible = False
Me.Label2.Visible = False
Me.TextBox1.Visible = False
Me.TextBox2.Visible = False
Me.CommandButton3.Visible = False
End Sub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模学习(6):数学建模数据预处理专题

1 数据预处理是什么&#xff1f; 在数学建模赛题中&#xff0c;官方给所有参赛选手的数据可能受到主 观或客观条件的影响有一定的问题&#xff0c;如果不进行数据的处理而直 接使用的话可能对最终的结果造成一定的影响&#xff0c;因此为了保证数 据的真实性和建模结果的可靠…

简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation)

[论文地址] [代码] [ICLR 22] 阅前须知&#xff1a;本博文可能有描述不准确/过度简化/出错的地方&#xff0c;仅供参考。 网络结构 其中&#xff0c;原有模型的参数是直接冻结的&#xff0c;可训练参数只有额外引入的LoRA参数(由nn.Parameter实现)。 模型微调的本质 记网络原…

MySQL数据库——DML基本操作

文章目录 前言插入数据全列插入指定列插入 修改数据删除数据 前言 前面我们学习了MySQL——DDL操作&#xff0c;对数据库和表的结构的操作&#xff0c;那么今天我将为大家分享MySQL——DML操作&#xff0c;对表数据的操作。 MySQL DML操作有以下几种&#xff1a; 插入操作&am…

opencv-28 自适应阈值处理-cv2.adaptiveThreshold()

什么是自适应阈值处理? 对于色彩均衡的图像&#xff0c;直接使用一个阈值就能完成对图像的阈值化处理。但是&#xff0c;有时图像的色彩是不均衡的&#xff0c;此时如果只使用一个阈值&#xff0c;就无法得到清晰有效的阈值分割结果图像。 有一种改进的阈值处理技术&#xff…

【六大锁策略-各种锁的对比-Java中的Synchronized锁和ReentrantLock锁的特点分析-以及加锁的合适时机】

系列文章目录 文章目录 系列文章目录前言一、六大"有锁策略"1. 乐观锁——悲观锁2. 轻量级锁——重量级锁3. 自旋锁——挂起等待锁4. 互斥锁——读写锁5. 可重入锁——不可重入锁6. 公平锁——非公平锁 二、Synchronized——ReentrantLockSynchronized的特点&#xf…

掌握Python的X篇_13_Python条件语句实例:判断闰年、成绩评定

前面学习了条件语句以及调试的基本技巧&#xff0c;本篇介绍两个与条件语句有关的实例&#xff0c;对前面的知识又深刻认识。 文章目录 1. 判断闰年1.1 版本11.2 版本21.3 一行代码太长的处理方法 2. 根据成绩评级 1. 判断闰年 用户输入年份&#xff0c;判断该年份是否为闰年…

相对位置编码和绝对位置编码

位置编码的区别&#xff1a; 相对位置编码和绝对位置编码是两种不同的位置编码方法。 绝对位置编码是一种基于位置嵌入的方法&#xff0c;其中每个位置都被分配了一个唯一的位置向量。这些向量是固定的&#xff0c;与输入序列的内容无关。这种编码方式对于处理较短的序列效果…

【图论】树上差分(点差分)

一.题目 输入样例&#xff1a; 5 10 3 4 1 5 4 2 5 4 5 4 5 4 3 5 4 3 4 3 1 3 3 5 5 4 1 5 3 4 输出样例&#xff1a;9 二 .分析 我们可以先建一棵树 但我们发现&#xff0c;这样会超时。 所以&#xff0c;我们想到树上差分 三.代码 /* 5 10 3 4 1 5 4 2 5 4 5 4 5 4 3 5 …

基金经理二季度AI概念股操作分化

公募基金二季度仍在加仓AI板块&#xff0c;但不同于一季度全线加仓题材各环节&#xff0c;二季度对AI产业链的操作出现分化。 资金更加聚拢在业绩率先兑现的上游算力板块。其中光模块、服务器是加仓最为显著的两个领域&#xff1b;对于部分业绩短期兑现前景不明的AI板块&#…

机器学习 day31(baseline、学习曲线)

语音识别的Jtrain、Jcv和人工误差 对于逻辑回归问题&#xff0c;Jtrain和Jcv可以用分类错误的比例&#xff0c;这一方式来代替单单只看Jtrain&#xff0c;不好区分是否高偏差。可以再计算人类识别误差&#xff0c;即人工误差&#xff0c;作为基准线来进行比较Jtrain与baselin…

论文分享:PowerTCP: Pushing the Performance Limits of Datacenter Networks

1 原论文的题目&#xff08;中英文&#xff09;、题目中包含了哪些关键词&#xff1f;这些关键词的相关知识分别是什么&#xff1f; 题目&#xff1a;PowerTCP: Pushing the Performance Limits of Datacenter Networks PowerTCP&#xff1a;逼近数据中心的网络性能极限 2 论…

银河麒麟安装mysql数据库(mariadb)-银河麒麟安装JDK-银河麒麟安装nginx(附安装包)

银河麒麟离线全套安装教程&#xff08;手把手教程&#xff09; 1.银河麒麟服务器系统安装mysql数据库&#xff08;mariadb&#xff09; 2.银河麒麟桌面系统安装mysql数据库&#xff08;mariadb&#xff09; 3.银河麒麟服务器系统安装JDK 4.银河麒麟桌面系统安装JDK 5.银河麒麟…

【Linux后端服务器开发】MAC地址与其他重要协议

目录 一、以太网 二、MAC地址 三、MTU 四、ARP协议 五、DNS系统 六、ICMP协议 七、NAT技术 八、代理服务器 一、以太网 “以太网”不是一种具体的网路&#xff0c;而是一种技术标准&#xff1a;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容&#xf…

Linuxcnc-ethercat从入门到放弃(1)、环境搭建

项目开源网站 LinuxCNChttps://www.linuxcnc.org/当前release版本2.8.4 Downloads (linuxcnc.org)https://www.linuxcnc.org/downloads/可以直接下载安装好linuxcnc的实时debian系统&#xff0c;直接刻盘安装就可以了 安装IgH主站&#xff0c;网上有很多教程可供参考 git clo…

【Rust】枚举类型创建单链表以及常见的链表操作方法

目录 单链表 用枚举表达链表 枚举enum Box容器 创建节点 1. 创建并打印 2. match 匹配 3. 节点初始化 4.节点嵌套 追加节点 1. 尾插法 2. 链表追加方法 3. 头插法 4. 改写成单链表方法 遍历链表 1. 递归法 2. 递推法 3. 改写成单链表方法 自定义Display tr…

8. Vmvare中重新分配Linux系统的分区空间大小

1. 说明 一般情况下&#xff0c;在使用Vmvare虚拟机创建配置Linux系统时&#xff0c;默认将系统的内存设置为4GB&#xff0c;硬盘大小设置为40GB&#xff0c;但随着空间利用的越来越多&#xff0c;内存会出现不够使用的情况&#xff0c;此时需要重新分配空间大小&#xff0c;具…

go 查询采购单设备事项[小示例]

一、项目背景 1.1需求&#xff1a; 项目实施过程中存在多次下采购单的事项&#xff0c;如果查询过去采购单中下了哪些设备&#xff0c;数量以及相应信息&#xff0c;如何处理呢? 备注&#xff0c;价格等都是修改了&#xff0c;不是原始内容&#xff0c;只是参考 1.2实现步骤…

transformer代码注解

其中代码均来自李沐老师的动手学pytorch中。 class PositionWiseFFN(nn.Module):ffn_num_inputs 4ffn_num_hiddens 4ffn_num_outputs 8def __init__(self,ffn_num_inputs,ffn_num_hiddens,ffn_num_outputs):super(PositionWiseFFN,self).__init__()self.dense1 nn.Linear(ffn…

3ds MAX绘制简单动画

建立一个长方体和茶壶&#xff1a; 在界面右下角点击时间配置&#xff1a; 这是动画制作的必要步骤 选择【自动】&#xff0c;接下来&#xff0c;我们只要在对应的帧改变窗口中图形的位置&#xff0c;就能自动记录该时刻的模样 这就意味着&#xff0c;我们通过电脑记录某几个…

工业平板电脑优化汽车工厂的生产流程

汽车行业一直是自动化机器人系统的早期应用领域之一。通过使用具有高负载能力和远程作用的大型机械臂&#xff0c;汽车装配工厂可以实现点焊、安装挡风玻璃、安装车轮等工作&#xff0c;而较小的机械手则用于焊接和安装子组件。使用机器人系统不仅提高了生产效率&#xff0c;还…