Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 12581|回复: 14

[已解决]求用VBA实现多条件分类汇总,请帮帮忙,谢谢!

[复制链接]
发表于 2013-7-24 13:03 | 显示全部楼层 |阅读模式
5学分
本帖最后由 wzw9999 于 2013-7-25 09:43 编辑

把“每日数据”表中的“银行代码”、“预算单位代码”、“功能类科目代码”三者相同的支出发生额进行分类汇总,汇总数放到“分类汇总表”中,在“分类汇总表”表中放一个“分类汇总”按钮,点一下按钮就将“每日数据”表中的数据分类汇总到“分类汇总表”中。“每日数据”表中的记录数是不固定的。
最佳答案
2013-7-24 14:40
插入一个模块,粘入代码,在工作表中插入一个按钮,按钮的宏指向TEST
  1. Sub test()
  2.     Dim strSql As String
  3.     strSql = "select 银行代码,预算单位代码,功能类科目代码,sum(支出发生额) from [每日数据$a:d] group by 银行代码,预算单位代码,功能类科目代码"
  4.     Call ADOQuery(ThisWorkbook.FullName, strSql)
  5.     MsgBox "汇总完成"
  6. End Sub

  7. Sub ADOQuery(strFullname As String, Optional strSql As String, Optional blnHasHeader As Boolean = True)
  8. '需要定义的常量
  9.     Const adUseClient = 3
  10.     Const adModeShareDenyWrite = 8
  11.     Const adModeReadWrite = 3
  12.     Const adModeRead = 1

  13.     Dim AdoConn As Object, AdoRst As Object
  14.     Dim StrConn$

  15.     Set AdoConn = CreateObject("ADODB.Connection")

  16.     StrConn = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
  17.               "Data Source='" & strFullname & "';Extended Properties='Excel 8.0;HDR=" & blnHasHeader & ";imex=1';"

  18.     Debug.Print StrConn
  19.    
  20.     On Error GoTo ErrorHandler

  21.     With AdoConn
  22.         .CommandTimeout = 15
  23.         .ConnectionTimeout = 15
  24.         .CursorLocation = adUseClient
  25.         .Mode = adModeRead    'Write    'adModeShareDenyWrite
  26.         .ConnectionString = StrConn
  27.         .Open
  28.     End With

  29.     Debug.Print strSql
  30.     Set AdoRst = AdoConn.Execute(strSql)
  31.     Worksheets("分类汇总").Range("a2").CopyFromRecordset AdoRst

  32.     AdoConn.Close
  33.     Exit Sub

  34. ErrorHandler:
  35.     MsgBox Err.Number & vbCrLf & _
  36.            Err.Description
  37.     Set AdoRst = Nothing
  38.     Set AdoConn = Nothing
  39. End Sub
复制代码

分类汇总-银行.rar

8.56 KB, 下载次数: 290

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-7-24 13:41 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-7-24 13:47 | 显示全部楼层
把“银行代码”、“预算单位代码”、“功能类科目代码”三个都相同的支出发生额进行汇总,汇总数据放到“分类汇总表”中。
回复

使用道具 举报

发表于 2013-7-24 14:27 | 显示全部楼层
用字典+数组,实现很容易。
另外,用SQL来实现应该也很简单。
回复

使用道具 举报

发表于 2013-7-24 14:38 | 显示全部楼层
SQL代码:
  1. select 银行代码,预算单位代码,功能类科目代码,sum(支出发生额) from [每日数据$a:d] group by 银行代码,预算单位代码,功能类科目代码
复制代码
回复

使用道具 举报

发表于 2013-7-24 14:40 | 显示全部楼层    本楼为最佳答案   
插入一个模块,粘入代码,在工作表中插入一个按钮,按钮的宏指向TEST
  1. Sub test()
  2.     Dim strSql As String
  3.     strSql = "select 银行代码,预算单位代码,功能类科目代码,sum(支出发生额) from [每日数据$a:d] group by 银行代码,预算单位代码,功能类科目代码"
  4.     Call ADOQuery(ThisWorkbook.FullName, strSql)
  5.     MsgBox "汇总完成"
  6. End Sub

  7. Sub ADOQuery(strFullname As String, Optional strSql As String, Optional blnHasHeader As Boolean = True)
  8. '需要定义的常量
  9.     Const adUseClient = 3
  10.     Const adModeShareDenyWrite = 8
  11.     Const adModeReadWrite = 3
  12.     Const adModeRead = 1

  13.     Dim AdoConn As Object, AdoRst As Object
  14.     Dim StrConn$

  15.     Set AdoConn = CreateObject("ADODB.Connection")

  16.     StrConn = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
  17.               "Data Source='" & strFullname & "';Extended Properties='Excel 8.0;HDR=" & blnHasHeader & ";imex=1';"

  18.     Debug.Print StrConn
  19.    
  20.     On Error GoTo ErrorHandler

  21.     With AdoConn
  22.         .CommandTimeout = 15
  23.         .ConnectionTimeout = 15
  24.         .CursorLocation = adUseClient
  25.         .Mode = adModeRead    'Write    'adModeShareDenyWrite
  26.         .ConnectionString = StrConn
  27.         .Open
  28.     End With

  29.     Debug.Print strSql
  30.     Set AdoRst = AdoConn.Execute(strSql)
  31.     Worksheets("分类汇总").Range("a2").CopyFromRecordset AdoRst

  32.     AdoConn.Close
  33.     Exit Sub

  34. ErrorHandler:
  35.     MsgBox Err.Number & vbCrLf & _
  36.            Err.Description
  37.     Set AdoRst = Nothing
  38.     Set AdoConn = Nothing
  39. End Sub
复制代码
回复

使用道具 举报

发表于 2013-7-24 14:51 | 显示全部楼层
  1. Sub MergeData()
  2. '---------------------------------------------------------------------------------------
  3. ' Procedure : MergeData
  4. ' Author    : hwc2ycy
  5. ' Date      : 2013/7/24
  6. ' Purpose   : 字典+数组,汇总
  7. '---------------------------------------------------------------------------------------
  8. '
  9.     Dim arr, arrResult, lCur As Long, lCount As Long
  10.     Dim key As String
  11.     Dim i As Long, j As Long
  12.     arr = Worksheets("每日数据").Range("a1").CurrentRegion.Value
  13.     If Not IsArray(arr) Then
  14.         MsgBox "A1单元格区域无有效数据"
  15.         Exit Sub
  16.     End If
  17.     ReDim arrResult(1 To UBound(arr), 1 To UBound(arr, 2))
  18.     Dim objDic As Object
  19.     Set objDic = CreateObject("scripting.dictionary")
  20.     For i = LBound(arr) To UBound(arr)
  21.         key = arr(i, 1) & "#" & arr(i, 2) & "#" & arr(i, 3)
  22.         If objDic.exists(key) Then
  23.             lCur = objDic(key)
  24.         Else
  25.             lCur = lCount + 1
  26.             objDic(key) = lCur
  27.             For j = LBound(arr, 2) To UBound(arr, 2) - 1
  28.                 arrResult(lCur, j) = arr(i, j)
  29.             Next
  30.             arrResult(lCur, 1) = "'" & arr(i, 1)
  31.             lCount = lCount + 1
  32.         End If
  33.         arrResult(lCur, 4) = arrResult(lCur, 4) + arr(i, 4)
  34.     Next
  35.     Stop
  36.     If lCount Then
  37.         Worksheets("分类汇总").Range("a1").Resize(lCount, UBound(arr, 2)).Value = arrResult
  38.         MsgBox "汇总完成"
  39.     End If
  40. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-7-24 14:53 | 显示全部楼层
hwc2ycy 发表于 2013-7-24 14:40
插入一个模块,粘入代码,在工作表中插入一个按钮,按钮的宏指向TEST

按您的方法做了以后,点按钮出现3706错误
捕获.PNG
回复

使用道具 举报

发表于 2013-7-24 14:55 | 显示全部楼层
你用的是什么版本的OFFICE?
回复

使用道具 举报

 楼主| 发表于 2013-7-24 14:57 | 显示全部楼层
2010的,工作环境要2003的
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 20:51 , Processed in 0.479421 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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