汇总文件数据 VBA
1 读取30个文件的数据信息
2 根据4个key值,判断累计数据
3 做sum , avg
Sub 月汇总() Dim MyPath, MyName, AWbName
Dim Wb As Workbook, WbN As String
Dim G As Long
Dim num As Long Application.ScreenUpdating = False
MyPath = ActiveWorkbook.Path
MyName = Dir(MyPath & "\" & "*.xlsx")
AWbName = ActiveWorkbook.Name
ActiveWorkbook.Worksheets().Name = "BaseData" '工作表命名,基础数据表
ActiveWorkbook.Worksheets().Name = "Summary" '工作表命名,数据汇总以及计算表 Dim Data As Worksheet
Dim Summary As Worksheet
Set Data = ThisWorkbook.Sheets("BaseData")
Set Summary = ThisWorkbook.Sheets("Summary")
Data.Activate Data.Columns().ColumnWidth = '设置第 1 列宽度
Data.Columns().ColumnWidth = '设置第 2 列宽度
Data.Columns().ColumnWidth = '设置第 3 列宽度
Data.Columns().ColumnWidth = '设置第 4 列宽度
Data.Columns().ColumnWidth = '设置第 5 列宽度
Data.Columns().ColumnWidth = '设置第 6 列宽度
Data.Columns().ColumnWidth = '设置第 5 列宽度
Data.Columns().ColumnWidth = '设置第 6 列宽度 Data.Cells.Clear '清空工作表的内容和格式
Summary.Cells.Clear '清空工作表的内容和格
Data.Rows.Interior.ColorIndex = '清空所有背景色
Summary.Rows.Interior.ColorIndex = '清空所有背景色
Data.Cells(Range("A65536").End(xlUp).Row, ).HorizontalAlignment = '右对齐 num =
Dim test As Long '============================ step1: 准备基础数据,整合到一张工作薄中的一张工作表 ============================
Do While MyName <> ""
If MyName <> AWbName Then
Set Wb = Workbooks.Open(MyPath & "\" & MyName) '打开文件
num = num + With Workbooks().ActiveSheet
If num = Then
For G = To Sheets.Count
Wb.Sheets(G).UsedRange.Copy .Cells(.Range("A65536").End(xlUp).Row + , ) 'Range("A65536").End(xlUp).Row表示最后一个非空单元格的行号
Next
Else
For G = To Sheets.Count
Wb.Sheets(G).UsedRange.Offset(, ).Copy .Cells(.Range("A65536").End(xlUp).Row + , )
Next
End If .Range("A65536").End(xlUp).Offset() = " FileName:" + MyName '记录工作簿名称,以示区分
test = .Range("A65536").End(xlUp).Row
.Range("A" & test & ":H" & test).Merge '向右合并以工作簿名称为内容的单元格所在的8个单元格
.Range("A65536").End(xlUp).Interior.Color = RGB(, , ) '设置以工作簿名称为内容的单元格背景色,以示区分
.Range("A65536").End(xlUp).Font.Size = WbN = WbN & Chr() & Wb.Name
Wb.Close False
End With
End If
MyName = Dir
Loop '============================ step1-2: 设置基础数据表样式 ============================ With Data.Range("A5").CurrentRegion
.Rows().Interior.Color = RGB(, , ) '设置表头背景色,以示区分
.Rows().Font.Color = RGB(, , ) '设置表头文字颜色,以示区分
.HorizontalAlignment = xlLeft '水平居左
With .Borders
.Color = RGB(, , ) '边框颜色,黑色
.LineStyle = xlContinuous '边框线性,细线
.Weight = xlMedium '边框粗细,细
End With
End With '============================ step2: 筛选数据 ============================ Summary.Activate
Summary.Columns().ColumnWidth = 0.1
Summary.Columns().ColumnWidth =
Summary.Columns().ColumnWidth = Const START_ROW = '需要设置开始行0606 Summary.Cells(, ) = Data.Cells(, )
Summary.Cells(, ) = Data.Cells(, )
Summary.Cells(, ) = Data.Cells(, ) + Data.Cells(, )
Summary.Rows().HorizontalAlignment = '右对齐 Dim END_ROW As Integer
END_ROW = Data.Range("A65535").End(xlUp).Row Dim i As Integer
Dim flag As Integer
flag =
Dim isError As Boolean
isError = False Dim customerSN As String
Dim ownerN As String
Dim CsnandOn As String
Dim ObligationNumber As String
Dim CaNumber As String
Dim dbTime As String For i = START_ROW To END_ROW Step
customerSN = Trim(Data.Cells(i, ).text) '0606 Customer Short Name
ownerN = Trim(Data.Cells(i, ).text) '0606 Owner Name
ObligationNumber = Trim(Data.Cells(i, ).text) '0609 Obligation Number
CaNumber = Trim(Data.Cells(i, ).text) '0609 Ca Number CsnandOn = customerSN + ownerN + ObligationNumber + CaNumber '0609 组合的唯一标识
text = Trim(Data.Cells(i, ).text) '0606判断是否到时间分隔点 If Len(Trim(dbTime)) = Then
dbTime = Trim(Data.Cells(i, ).text) '记录时间日期
End If If Right(text, ) <> ".xlsx" Then '尚未到时间分隔点 Dim CsnandO As Range
Set CsnandO = Summary.Cells.Find(what:=CsnandOn, LookIn:=xlValues) '查找已经存在的唯一标识 If Not CsnandO Is Nothing Then '判断已经存在情况
Summary.Cells(CsnandO.Row, flag + ) = Summary.Cells(CsnandO.Row, flag + ) + Data.Cells(i, ) Else '判断不存在情况
Summary.Cells(Range("A65536").End(xlUp).Offset(, ).Row, ) = CsnandOn
Summary.Cells(Range("A65536").End(xlUp).Offset(, ).Row, ) = customerSN
Summary.Cells(Range("A65536").End(xlUp).Offset(, ).Row, ).HorizontalAlignment = '右对齐
Summary.Cells(Range("A65536").End(xlUp).Offset(, ).Row, ) = ownerN
Summary.Cells(Range("A65536").End(xlUp).Offset(, ).Row, ).HorizontalAlignment = '右对齐
Summary.Cells(Range("A65536").End(xlUp).Offset(, ).Row, flag + ) = Data.Cells(i, )
End If
Else '每隔一个时间分割点,标志位加1
Summary.Cells(, flag + ) = dbTime
Summary.Columns(flag + ).ColumnWidth =
flag = flag +
dbTime = ""
End If
Next '============================ step3: 求和、求平均数 ============================
Const HEADER_SUM = "sum"
Summary.Cells(, flag + ) = HEADER_SUM & "(" & flag & ")"
Const HEADER_AVG = "avg"
Summary.Cells(, flag + ) = HEADER_AVG & "(" & flag & ")"
Summary.Columns(flag + ).ColumnWidth = '设置求和列宽度
Summary.Columns(flag + ).ColumnWidth = '设置求均值列宽度 Dim j As Integer
Dim SUM_END_ROW As Integer
SUM_END_ROW = Summary.Range("A65535").End(xlUp).Row Set st = Range("D2")
Set rt = st.Offset(, flag - )
For j = To SUM_END_ROW Step
Summary.Cells(j, flag + ).Formula = "=sum(" & st.Address & ":" & rt.Address & ")"
Summary.Cells(j, flag + ).Formula = "=" & st.Offset(, flag).Address & "/" & flag
Set st = st.Offset()
Set rt = st.Offset(, flag - )
Next '============================ step3-2: 设置基础数据表样式 ============================
Summary.Rows().RowHeight =
Summary.Cells.Font.Name = "Arial"
Summary.Cells.Font.Size =
Summary.Rows().Font.Bold = True With Summary.Range("A1").CurrentRegion
.Rows().Interior.Color = RGB(, , ) '设置表头背景色,以示区分
.Rows().Font.Color = RGB(, , ) '设置表头文字颜色,以示区分
.HorizontalAlignment = xlLeft '水平居左
With .Borders
.Color = RGB(, , ) '边框颜色,黑色
.LineStyle = xlContinuous '边框线性,细线
.Weight = xlMedium '边框粗细,细
End With
End With '============================ step4: 提示或警告 ============================
Summary.Range("A1").Select
Application.ScreenUpdating = True
MsgBox "共合并了" & num & "个工作薄下的全部工作表。如下:" & vbNewLine & WbN, vbInformation, "提示" If isError Then
Data.Activate
Data.Range("A3").Select
MsgBox "Error: 请确保文件目录只包含需要汇总的报表文件"
End If ActiveWorkbook.Save 'Close Savechanges:=True
'Summary.Close Savechanges:=True End Sub
心得体会:没有唯一主键,创建唯一值:CsnandOn
汇总文件数据 VBA的更多相关文章
- iOS开发备忘录:属性列表文件数据持久化
属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类 ...
- 上传读取Excel文件数据
/// <summary> /// 上传读取Excel文件数据 /// 来自http://www.cnblogs.com/cielwater /// </summary> // ...
- VC6.0读取Excel文件数据
啰嗦一下:本人所在公司从事碟式斯特林太阳能发电设备的研发与销售.单台设备图如下: 工作原理如下:整个设备大致可分为五个部分, 1.服务器,负责气象.发电等数据存取,电.网连接等处理: 2.气象站,通过 ...
- Java学习-022-Properties 文件数据写入
Properties 配置文件写入主要通过 Properties.setProperty 和 Properties.store 两个方法,此文以一个简单的 properties 文件写入源码做示例. ...
- php获取json文件数据并动态修改网站头部文件meta信息 --基于CI框架
话不多说了.直接开始吧 (如果有中文.请注意json只认utf-8编码) 首先你需要有一个json文件数据 { "index": { ...
- java读取目录下所有csv文件数据,存入三维数组并返回
package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...
- Unity 用C#脚本读取JSON文件数据
读取JSON文件数据网上有很多方法吗,这里采用SimpleJSON,关于SimpleJSON的介绍参考以下链接:http://wiki.unity3d.com/index.php/SimpleJSON ...
- Ubuntu系统下MySQL读取文件数据ERROR解决
博文链接:http://haoyuanliu.github.io/2016/04/29/mysql/ 对,我是来骗访问量的!O(∩_∩)O~~ 在使用MySQL进行文件数据读取的时候,在终端敲入命令行 ...
- 【转】 Linux内核中读写文件数据的方法--不错
原文网址:http://blog.csdn.net/tommy_wxie/article/details/8193954 Linux内核中读写文件数据的方法 有时候需要在Linuxkernel--大 ...
随机推荐
- SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数
环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击“存储过程”-点击“新建存储过程” SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCRE ...
- semget() semop()
semget() 可以使用系统调用semget()创建一个新的信号量集,或者存取一个已经存在的信号量集: 系统调用:semget();原型:intsemget(key_t key,int nsems, ...
- MAX16054
MAX16054是带有单个开关去抖以及内部闭锁电路的按键通/断控制器,可接受机械开关产生的嘈杂输入,并经过一个有工厂设置的延迟时间后产生干净的数字锁存输出. 开关通.断期间,MAX16054无接触抖动 ...
- 转载 HTTP常见状态码分析 200 301 302 404 500
转载原地址: http://www.cnblogs.com/starof/p/5035119.html HTTP状态码(HTTP Status Code) 一些常见的状态码为: 一.1开头1xx(临 ...
- windows程序员进阶系列:《软件调试》之堆 (一)
windows程序员进阶系列:<软件调试>之堆 (一) 堆是软件在运行时动态申请内存空间的主要途径.从堆上申请来的空间需要程序员自己申请和释放,且申请和释放操作必须绝对匹配.忘记释放或者多 ...
- SQL Server 重新恢复自动编号列的序号
1. truncate table tablename2. DBCC CHECKIDENT (tablename,reseed,1) truncate命令不但会清除所有的数据,还会将IDENTIT ...
- SQL 正则表达式使模式匹配和数据提取变得更容易
SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易 David Banister 本文讨论: 使用正则表达式进行高效的 SQL 查询 SQL Server 2005 对正则表达式 ...
- ThinkPHP CURD方法盘点:data方法
data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值,可能大家不太习惯用这个方法,今天来讲解下如何用好data方法. 用法 写操作 通常情况下我们都是通过create方法或者赋值 ...
- SAP增强总结-第二代增强(SMOD、CMOD)【转载】
第二代增强比第二代增强安全性提高了很多,第一代增强毕竟是在原标准程序中修改,大部分传递参数都可以直接使用,第二代增强做了一些封装,对用户可以修改的参数做了限制. 1.增强点查找方法 首先根据事物码找到 ...
- URL和DNS解析
以下内容摘自<Go Web编程>,介绍的通俗易懂. 我们浏览网页都是通过URL访问的,那么URL到底是怎么样的呢? URL(Uniform Resource Locator)是“统一资源定 ...