ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 数据归纳汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-2-9 12:19 | 显示全部楼层 |阅读模式

求助如何在不清除 总单工作簿(资料)原有数据
将信息工作簿(单价)B列姓名右边 C列-E列内容
归纳汇总到总单工作簿(资料)第2行相同姓名下面空单元格处

文件夹.rar

438.51 KB, 下载次数: 11

汇总

TA的精华主题

TA的得分主题

发表于 2024-2-9 13:51 | 显示全部楼层
Sub 汇总信息()
Application.ScreenUpdating = False
Dim ar As Variant
Dim d As Object, dc As Object
Set d = CreateObject("scripting.dictionary")
lj = ThisWorkbook.Path & "\"
f = Dir(lj & "信息.xlsm")
If f = "" Then MsgBox "找不到信息.xlsm文件!": End
Set wb = Workbooks.Open(lj & f, 0)
ar = wb.Worksheets("单价").[a1].CurrentRegion
wb.Close False
With Sheets("资料")
    y = .Cells(1, Columns.Count).End(xlToLeft).Column
    For j = 1 To y Step 3
        d(.Cells(2, j).Value) = j
    Next j
    For i = 2 To UBound(ar)
        If ar(i, 2) <> "" Then
            lh = d(ar(i, 2))
            If lh <> "" Then
                 r = .Cells(Rows.Count, lh).End(xlUp).Row + 1
                 m = lh - 1
                 For j = 3 To 5
                    m = m + 1
                    .Cells(r, m) = ar(i, j)
                Next j
            End If
        End If
    Next i
End With
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-2-9 13:52 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-9 14:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

非常感谢老师,能不能增加判断功能同姓名下,已有日期时间相同的不复制,在次执行按钮也没有复制。

TA的精华主题

TA的得分主题

发表于 2024-2-9 15:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
CYZ凡星点点 发表于 2024-2-9 14:03
非常感谢老师,能不能增加判断功能同姓名下,已有日期时间相同的不复制,在次执行按钮也没有复制。

单价表中部分支付对应汇总表中哪个字段,已支付或未支付?汇总表中看不到部分支付的字段

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-2-9 17:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test1()

  2.   Dim strFile As String
  3. '  With Application.FileDialog(msoFileDialogOpen)
  4. '    .InitialFileName = ThisWorkbook.Path
  5. '    With .Filters
  6. '      .Clear
  7. '      .Add "Excel文件(xls*)", "*.xls*"
  8. '    End With
  9. '    .AllowMultiSelect = False
  10. '    If .Show Then strFile = .SelectedItems(1) Else Exit Sub
  11. '  End With

  12.   strFile = ThisWorkbook.Path & "\信息.xlsm"
  13.   If Dir(strFile) = "" Then MsgBox strFile & " 文件不存在!", 64: Exit Sub
  14.   
  15. '  Dim Conn As New ADODB.Connection, rs As New ADODB.Recordset
  16.   Dim Conn As Object, rs As Object, Dic As Object, Dict As Object
  17.   Dim strConn As String, SQL As String
  18.   Dim ar, br, cr() As Long
  19.   Dim i As Long, j As Long, pos As Long
  20.   
  21.   With Range("A1").CurrentRegion
  22.     ar = Application.Rept(.Rows(2), 1)
  23.     br = .Offset(2).Resize(366)
  24.     ReDim cr(1 To UBound(ar))
  25.   End With
  26.   
  27.   Set Dic = CreateObject("Scripting.Dictionary")
  28.   Set Dict = CreateObject("Scripting.Dictionary")
  29.   For j = 1 To UBound(ar) Step 3
  30.     Dict.Add ar(j), j
  31.     cr(j) = Cells(1, j).End(xlDown).Row - 2
  32.     Set Dic(ar(j)) = CreateObject("Scripting.Dictionary")
  33.     For i = 1 To cr(j)
  34.       Dic(ar(j)).Add br(i, j), vbNullString
  35.     Next
  36.   Next
  37.   
  38.   Set Conn = CreateObject("ADODB.Connection")
  39.   Set rs = CreateObject("ADODB.Recordset")
  40.   If Application.Version < 12 Then
  41.     strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source="
  42.   Else
  43.     strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source="
  44.   End If
  45.   Conn.Open strConn & strFile
  46.   SQL = "SELECT * FROM  [单价$B1:E] WHERE 姓名 IS NOT NULL ORDER BY 姓名"
  47.   rs.Open SQL, Conn, 1, 3
  48.   
  49.   ar = rs.GetRows()
  50.   For j = 0 To UBound(ar, 2)
  51.     If Dict.Exists(ar(0, j)) Then
  52.       If Not Dic(ar(0, j)).Exists(ar(1, j)) Then
  53.         pos = Dict(ar(0, j))
  54.         cr(pos) = cr(pos) + 1
  55.         For i = 1 To UBound(ar)
  56.           br(cr(pos), pos + i - 1) = ar(i, j)
  57.         Next
  58.       End If
  59.     End If
  60.   Next
  61.   Range("A13").Resize(WorksheetFunction.Max(cr), UBound(br, 2)) = br '改为 Range("A3")
  62.   
  63.   rs.Close
  64.   Set rs = Nothing
  65.   Conn.Close
  66.   Set Conn = Nothing
  67.   Set Dict = Nothing
  68.   Set Dic = Nothing
  69.   Beep
  70. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-2-9 18:00 | 显示全部楼层
本帖最后由 fzxba 于 2024-2-10 11:18 编辑

综合整理一下再更新.zip (818.41 KB, 下载次数: 31)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-2-9 19:08 | 显示全部楼层
CYZ凡星点点 发表于 2024-2-9 14:03
非常感谢老师,能不能增加判断功能同姓名下,已有日期时间相同的不复制,在次执行按钮也没有复制。

写代码的过程中就行到,你可能会提出这样的要求,但是,因为不确定,所以也就没有考虑了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-9 20:57 | 显示全部楼层
ykcbf1100 发表于 2024-2-9 15:36
单价表中部分支付对应汇总表中哪个字段,已支付或未支付?汇总表中看不到部分支付的字段

那是汇总表筛选,我只区分已支付就是结清,其他就未支付,当然也可以增加部分支付的条件。

TA的精华主题

TA的得分主题

发表于 2024-2-9 20:59 | 显示全部楼层
CYZ凡星点点 发表于 2024-2-9 20:57
那是汇总表筛选,我只区分已支付就是结清,其他就未支付,当然也可以增加部分支付的条件。

你求助时应该说清楚。我在写代码时就卡在那里了,就没往下写。

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-18 21:33 , Processed in 0.044824 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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