ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wenwen000424

[求助] [已解决]灵活的多工作表合并或汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-2-2 08:24 | 显示全部楼层
原帖由 蓝桥玄霜 于 2009-1-27 13:26 发表
其实每个人的表格千变万化,包括不同的表头、不同的位置、想要汇总的不同的区域、不同的汇总方法等等,想要一网打尽几乎是不可能的。还是只能针对某几种特定的表格来解决的。

正确。VBA的特点是量身定做,根据不同的情况编写的同的程序。

TA的精华主题

TA的得分主题

发表于 2009-2-2 22:59 | 显示全部楼层
但可提供用户灵活选择区域汇总或根据字段进行灵活汇总

TA的精华主题

TA的得分主题

发表于 2009-2-2 23:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习。回复楼上:如果真是那样,那不就象EXCEL软件一样了吗?那就是大程序了!

TA的精华主题

TA的得分主题

发表于 2009-2-3 11:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一直没空直到今天才有空,仔细检查了一遍,发现几处错误,用兰色更正了一下. 其中有个错误是添加空表后,d(ar(1, UBound(ar, 2))) = s就会出现UBound(ar, 2)=0 的 错误,这样肯定会引起错误,很可能就是只观看兄弟指出的错误,谢谢他的提醒,已重新更新请再试.

Private Sub CommandButton1_Click()
    Dim arra()
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
    Set d = CreateObject("scripting.dictionary")

    For Each sh In Sheets
        If sh.Name <> "汇总" And sh.Range("a1") <> "" Then
            r = sh.Range("iv1").End(xlToLeft).Column
            ar = sh.Range("a1").Resize(, r)
            For i = 1 To r - 1
                If Not d.exists(ar(1, i)) Then
                    d(ar(1, i)) = s
                    If i = 1 Then
                        sql2 = ar(1, i) & ","
                    Else
                        sql2 = sql2 & " sum(iif(len(" & ar(1, i) & ")=0,0," & ar(1, i) & ")),"
                    End If
                End If
            Next
        End If
    Next
   
    d(ar(1, UBound(ar, 2))) = s
    sql2 = sql2 & " sum( " & ar(1, UBound(ar, 2)) & ") "
    arr = d.Keys    ': d.RemoveAll
    z = 0
    With UserForm2.ListView1
        For j = 1 To .ListItems.Count
            If .ListItems(j).Checked = True Then
                z = z + 1
                ReDim Preserve arra(1 To z)
                With Sheets(.ListItems(j).Text)
                   r = .Range("iv1").End(xlToLeft).Column                  
                    ss = ""
                    For i = 1 To r
                        ss = ss & .Cells(1, i) & ","
                    Next
                    For i = 0 To UBound(arr)
                        If InStr(ss, arr(i)) Then
                            arra(z) = arra(z) & arr(i) & ","
                        Else
                            arra(z) = arra(z) & "'' as " & arr(i) & "" & ","
                        End If
                    Next
                    arra(z) = " select " & Left(arra(z), Len(arra(z)) - 1) & " from [" & .Name & "$] "
                End With
            End If
        Next
        If z = 0 Then Exit Sub

    End With
    Sql = Join(arra, " union ")                                                '这里是合并
    If UserForm2.OptionButton2.Value = True Then Sql = "select " & sql2 & " from (" & Sql & ") group by " & ar(1, 1) & ""    '这里是汇总
    'MsgBox Sql
    With Sheets("汇总")
        .Cells.ClearContents
        .Range("a1").Resize(1, UBound(arr) + 1) = d.Keys
        .Range("a2").CopyFromRecordset cn.Execute(Sql)
    End With
End Sub

Private Sub CommandButton2_Click()
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    Call Noclose(Me.Caption)
    OptionButton1.Value = True
    With Me.ListView1
        .ListItems.Clear
        .ColumnHeaders.Clear
        .View = lvwReport
        .FullRowSelect = True
        .Gridlines = True
        .MultiSelect = True
        .CheckBoxes = True
        .ColumnHeaders.Add , , "项目", 60
        For i = 1 To ThisWorkbook.Sheets.Count
            If Sheets(i).Name <> "汇总" Then .ListItems.Add , , Sheets(i).Name
        Next i
        '.SelectedItem.Selected = False                 '不选中
    End With
End Sub


附件已更新!

[ 本帖最后由 office2008 于 2009-2-3 11:22 编辑 ]

求助2.rar

36.01 KB, 下载次数: 821

TA的精华主题

TA的得分主题

发表于 2009-2-3 12:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-2-3 22:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请教高手OFFICE2008,如果我的表格位置在第六行和B列位置,如何修改以上代码。(请高手详细写一个各个语名的注释。多谢了

TA的精华主题

TA的得分主题

发表于 2009-2-3 23:51 | 显示全部楼层
OFFICE2008,您真是高手,一出手就解决大问题,您是否可以抽点时间,将您编的代码注释一下,让我等菜鸟好好学习,运用到实际工作之中,就象楼上一样,表格位置和数据位置改变了,就不知修改代码了,仍然无法运用自如.请楼上不要见怪,我和你一样,也是不知修改代码,呵呵!!!

TA的精华主题

TA的得分主题

发表于 2009-2-4 22:12 | 显示全部楼层
太实用了,请高手给个注释,初学者方便根据自己表格改变一下,灵活运用。多谢了

TA的精华主题

TA的得分主题

发表于 2009-2-5 14:23 | 显示全部楼层
原帖由 ljx63426 于 2009-2-3 23:51 发表
OFFICE2008,您真是高手,一出手就解决大问题,您是否可以抽点时间,将您编的代码注释一下,让我等菜鸟好好学习,运用到实际工作之中,就象楼上一样,表格位置和数据位置改变了,就不知修改代码了,仍然无法运用自如.请楼上不要 ...


是啊,我等看不懂代码,也就谈不上应用了,像我的表格样式如下:
序号与账号不用汇总_090204.GIF
工号与账号是不需要汇总的,就不知该怎么变通了!

TA的精华主题

TA的得分主题

发表于 2009-2-7 19:47 | 显示全部楼层
请高手OFFICE2008支持,多作贡献。带动大家的积极性。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-29 00:56 , Processed in 0.048451 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表