ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-1-23 16:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢,可能我没有说清楚,现在程序处理的是已知了汇总表中第3行中的项目然后按对应项目进行统计。我的想法是第3行中项目不是事先填好的,而是由第一行所选择的工作表中的项目自动提取的不重复项目然后自动填充到第3行的,是动态的。

TA的精华主题

TA的得分主题

发表于 2009-1-23 16:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 12楼 wenwen000424 的帖子

呵呵,办法很简单
1 在程序之前再先字典一下(把所有项目都搞到)
2 索性用ADO+SQL应该不难,几个表的循环 (有个前提:表多吗?)

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-1-23 16:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本人有此莱,能否请用我给的附件做个例子给我,谢谢!真不好意思.

TA的精华主题

TA的得分主题

发表于 2009-1-23 16:45 | 显示全部楼层

回复 14楼 wenwen000424 的帖子

呵呵,我还欠着几个朋友的帐呢?(答应帮他们做的,可现在只能偶尔上来,忙啊),今天有空.
好,可以的,不过要在晚上,今天有客到,须去准备小菜了.

TA的精华主题

TA的得分主题

发表于 2009-1-23 17:03 | 显示全部楼层
借用office2008的代码,试试看是否合乎要求:
Sub yy()
    Dim i As Integer, k As Integer, r As Integer, lc As Integer
    Dim s As Integer, w As Integer, sh As Worksheet
    Dim d As Object
    Dim arr(), arr2(), brr
    Set d = CreateObject("scripting.dictionary")
    For Each sh In Sheets
        If sh.Name <> "汇总" Then
            With sh
                lc = .Range("iv1").End(xlToLeft).Column
                brr = .Range(.Cells(1, 1), .Cells(1, lc))
                For i = 2 To lc - 1
                    d(brr(1, i)) = ""
                Next i
            End With
        End If
    Next sh
    lc = d.Count + 2 '表头列数
    Application.ScreenUpdating = False
    '以下4行写表头,其中16及后面的17可以根据实际重新设置
    Cells(3, 1) = "姓名": Cells(3, lc) = "合计"
    Cells(3, 2).Resize(1, d.Count) = d.keys
    Cells(16, 1) = "姓名": Cells(16, lc) = "合计"
    Cells(16, 2).Resize(1, d.Count) = d.keys
    d.RemoveAll
    On Error Resume Next
    Set d = CreateObject("scripting.dictionary")
    With Sheets("汇总")
        brr = .Range(.Cells(3, 1), .Cells(3, lc))
        For i = 1 To lc
            d(brr(1, i)) = i                         '记录汇总最大列数以及列名
        Next
        lc2 = .Range("iv1").End(xlToLeft).Column
        brr = .Range(.Cells(1, 1), .Cells(1, lc2))
        For i = 1 To lc2 - 1 Step 2
            If brr(1, i + 1) = "√" Then
                If Len(Sheets(brr(1, i)).Name) > 0 Then
                    If Err = 0 Then
                        With Sheets(brr(1, i))
                            r = .Range("a65536").End(xlUp).Row
                            If r > 1 Then
                                ar = .Range(.Cells(1, 1), .Cells(r, lc))
                                For j = 2 To r
                                    k = k + 1
                                    ReDim Preserve arr(1 To lc, 1 To k)
                                    For w = 1 To lc
                                        If ar(1, w) <> "" Then arr(d(ar(1, w)), k) = ar(j, w)
                                    Next w
                                Next j
                            End If
                        End With
                    End If
                End If
            End If
        Next i
        .Range("a17").Resize(.UsedRange.Rows.Count, lc).Clear
        .Range("a17").Resize(UBound(arr, 2), lc) = Application.Transpose(arr)   '这一段是合并
        .Range("a16").Resize(UBound(arr, 2) + 1, lc).Borders.LineStyle = xlContinuous
        .Range("a16").Resize(1, lc).Interior.ColorIndex = 15
        d.RemoveAll
       Set d = CreateObject("scripting.dictionary")
        k = 0
        For i = 1 To UBound(arr, 2)
        If Not d.exists(arr(1, i)) Then
             k = k + 1
             d(arr(1, i)) = k
             ReDim Preserve arr2(1 To UBound(arr), 1 To k)
             For w = 1 To UBound(arr)
                arr2(w, d(arr(1, i))) = arr(w, i)
             Next
        Else
             For w = 2 To UBound(arr)
                 arr2(w, d(arr(1, i))) = arr2(w, d(arr(1, i))) + arr(w, i)
             Next
          End If
        Next
        .Range("a4").Resize(12, lc).Clear '12根据实际情况设定
        .Range("a4").Resize(UBound(arr2, 2), lc) = Application.Transpose(arr2)  '这一段是汇总
        .Range("a3").Resize(UBound(arr2, 2) + 1, lc).Borders.LineStyle = xlContinuous
        .Range("a3").Resize(1, lc).Interior.ColorIndex = 15
End With
Application.ScreenUpdating = True
End Sub
求助.rar (12.39 KB, 下载次数: 659)

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-1-23 17:04 | 显示全部楼层
非常感谢,可不要喝醉酒,把我的事忘了呀!嘻嘻。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-1-23 17:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 16楼 zhaogang1960 的帖子

非常感谢zhaogang1960 ,非常满意。有个问题想再次问一下,第一行的sheet项数与“√”有什么更好的办法根据当前工作薄的工作表名称自动生成吗?

TA的精华主题

TA的得分主题

发表于 2009-1-23 17:48 | 显示全部楼层

回复 18楼 wenwen000424 的帖子

似乎没有自动生成的必要,只要汇总除“汇总”之外的所有工作表即可
Sub 自动生成第一行()
    Dim sh As Worksheet, arr(), m As Integer
    ReDim arr(1 To (Sheets.Count - 1) * 2)
    m = -1
    For Each sh In Sheets
        If sh.Name <> "汇总" Then
            m = m + 2
            arr(m) = sh.Name
            arr(m + 1) = "√"
        End If
    Next
    Rows(1).ClearContents
    Range("a1").Resize(1, m + 1) = arr
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-1-23 18:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-1-23 18:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 20楼 wenwen000424 的帖子

..............

[ 本帖最后由 office2008 于 2009-1-23 19:07 编辑 ]

求助2.rar

28.63 KB, 下载次数: 415

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-29 03:50 , Processed in 0.060299 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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