ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA 提取多列数据并排序汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-4 21:20 | 显示全部楼层
不知道为什么 发表于 2018-8-4 21:14
3楼的附件我电脑运行不了,jimin老师。看样子是硬件也不想让我进步了,呵呵。

和硬件关系不大,估计是office 不是完整版,或没装全。

TA的精华主题

TA的得分主题

发表于 2018-8-4 21:22 来自手机 | 显示全部楼层
jiminyanyan 发表于 2018-8-4 21:20
和硬件关系不大,估计是office 不是完整版,或没装全。

哈哈,想给自己个偷懒的理由也被你看穿了!

TA的精华主题

TA的得分主题

发表于 2018-8-4 21:27 | 显示全部楼层
不知道为什么 发表于 2018-8-4 21:22
哈哈,想给自己个偷懒的理由也被你看穿了!

SQL还是比较简单的,好比,你到饭店说:给我来盘回锅肉,具体怎么烧,你自己不用管的。用数组就要管细节了。

TA的精华主题

TA的得分主题

发表于 2018-8-4 21:35 来自手机 | 显示全部楼层
chunyanghua2002 发表于 2018-8-4 21:14
附件如图 谢谢!

真心劝你写代码的时间可以数据透视表就可以了,效率还高,当然学习目的另当别论了,譬如我,闲着就当练习了。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-4 21:37 来自手机 | 显示全部楼层
jiminyanyan 发表于 2018-8-4 21:27
SQL还是比较简单的,好比,你到饭店说:给我来盘回锅肉,具体怎么烧,你自己不用管的。用数组就要管细节 ...

jim老师你很厉害啊,我刚端起酒杯,你就给我来个吃饭的比方。哈哈

TA的精华主题

TA的得分主题

发表于 2018-8-4 23:11 | 显示全部楼层
我写的代码效果及代码如下:
11.gif

  1. Sub 查询()
  2. Dim arr, i%, j%, Str As String
  3. Dim dic As Object
  4. arr = Sheets("源数据").Range("a2").CurrentRegion
  5. Set dic = CreateObject("scripting.dictionary")
  6. For i = 2 To UBound(arr)
  7.    Str = arr(i, 1) & arr(i, 2)
  8.    If Not dic.exists(Str) Then
  9.    Set dic(Str) = CreateObject("scripting.dictionary")
  10.    dic(Str)(arr(i, 3)) = arr(i, 5)
  11.    Else
  12.        If dic(Str).exists(arr(i, 3)) Then
  13.           dic(Str)(arr(i, 3)) = dic(Str)(arr(i, 3)) + arr(i, 5)
  14.        Else
  15.           dic(Str)(arr(i, 3)) = arr(i, 5)
  16.        End If
  17.     End If
  18. Next i
  19. k = dic("2014SUPPLY1").items

  20. With Sheets("目标格式")
  21.      Str = .Range("b1").Value & .Range("b2").Value
  22.      If dic(Str).Count < 6 Then
  23.      .Range("a5:b10").ClearContents
  24.      .Range("a5").Resize(dic(Str).Count, 1) = WorksheetFunction.Transpose(dic(Str).keys)
  25.      .Range("B5").Resize(dic(Str).Count, 1) = WorksheetFunction.Transpose(dic(Str).items)
  26.      .Range("a5:b10").Sort Key1:=.Range("b5"), Order1:=xlDescending
  27.      .Range("a11") = "Total": .Range("b11") = WorksheetFunction.Sum(dic(Str).items)
  28.      Else
  29.       .Range("f:f").ClearContents: .Range("g:g").ClearContents
  30.       .Range("f1").Resize(dic(Str).Count, 1) = WorksheetFunction.Transpose(dic(Str).keys)
  31.       .Range("g1").Resize(dic(Str).Count, 1) = WorksheetFunction.Transpose(dic(Str).items)
  32.       .Range("f:g").Sort Key1:=.Range("g1"), Order1:=xlDescending
  33.       .Range("a5") = .Range("f1"): .Range("b5") = .Range("g1")
  34.       .Range("a6") = .Range("f2"): .Range("b6") = .Range("g2")
  35.       .Range("a7") = .Range("f3"): .Range("b7") = .Range("g3")
  36.       .Range("a8") = .Range("f4"): .Range("b8") = .Range("g4")
  37.       .Range("a9") = .Range("f5"): .Range("b9") = .Range("g5")
  38.       .Range("a11") = "Total": .Range("b11") = WorksheetFunction.Sum(dic(Str).items)
  39.       .Range("a10") = "OTHERS"
  40.        arr = .Range("b5:b9")
  41.       .Range("b10") = .Range("b11") - WorksheetFunction.Sum(arr)
  42.       .Range("f:f").ClearContents: .Range("g:g").ClearContents
  43.      End If
  44. End With

  45. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2018-8-5 08:23 | 显示全部楼层
用透视表不是更简单方便吗?

TA的精华主题

TA的得分主题

发表于 2018-8-5 10:57 | 显示全部楼层
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("c1:c2")) Is Nothing Then
Range("b3:c100").Clear
'引用MICROSOFT ACTIVEX DATA OBJECTS 2.XLIBRARY
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
NF = Sheet2.Cells(1, 3): GYS = Sheet2.Cells(2, 3)
cn.Open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;EXTENDED PROPERTIES=EXCEL 8.0;DATA SOURCE=" & ThisWorkbook.FullName
Sql = "select 客户,金额CNY from(select * from [源数据$A2:E] WHERE 年份= " & NF & " AND 供应商='" & GYS & "' ORDER BY 金额CNY DESC)"
n = Sheet2.Range("b65536").End(xlUp).Row
rs.Open Sql, cn, 3, 2
X = rs.RecordCount
With Sheet2
If X <= 5 Then
.Range("B" & n + 2).Resize(, 2) = Array("客户", "金额CNY")
.Range("b" & n + 3).CopyFromRecordset cn.Execute(Sql)
SQLL = "SELECT SUM(金额CNY) FROM (select 客户,金额CNY from(select * from [源数据$A2:E] WHERE 年份= " & NF & " AND 供应商='" & GYS & "' ORDER BY 金额CNY DESC))"
.Cells(n + 1 + 8, 2) = "Total"
.Range("C" & n + 1 + 8).CopyFromRecordset cn.Execute(SQLL)
Else
.Cells(n + 2, 2) = "客户": .Cells(n + 2, 3) = "金额CNY"
SQLL = "select 客户,金额CNY from(select TOP 5 * from [源数据$A2:E] WHERE 年份= " & NF & " AND 供应商='" & GYS & "' ORDER BY 金额CNY DESC)"
.Range("B" & n + 3).CopyFromRecordset cn.Execute(SQLL)
.Cells(n + 1 + 7, 2) = "OTHERS"
.Cells(n + 1 + 8, 2) = "Total"
SQLLL = "select SUM(金额CNY) from(select * from [源数据$A2:E] WHERE 年份= " & NF & " AND 供应商='" & GYS & "' ORDER BY 金额CNY DESC)"
.Range("C" & n + 1 + 8).CopyFromRecordset cn.Execute(SQLLL)
SQLLLL = "select sum(金额CNY) from(select TOP 5 * from [源数据$A2:E] WHERE 年份= " & NF & " AND 供应商='" & GYS & "' ORDER BY 金额CNY DESC)"
.Cells(n + 1 + 7, 3).CopyFromRecordset cn.Execute(SQLLLL)
.Cells(n + 1 + 7, 3) = .Cells(n + 1 + 8, 3) - .Cells(n + 1 + 7, 3)
End If
End With
End If
End Sub

TA的精华主题

TA的得分主题

发表于 2018-8-5 11:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
附件------------

提取多列数据并排序汇总 REVISE.rar

19.79 KB, 下载次数: 85

TA的精华主题

TA的得分主题

发表于 2018-8-5 11:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
没有想到简单的方法,若要用ADO 须前期绑定,要取记录数进行判定及汇总;而后期绑定,不论怎么设置记录指针类型,RS.RECORDCOUNT记录个数都显示-1.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 14:16 , Processed in 0.026772 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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