VBA小记
要放假了,可是我们,我还是煎熬!
最让人不爽的是媳妇也需要加班加点的完成一些看起来很EASY的事:
统计数据,把几个表合并……
EXCEL本人还是懂得一点点的(我不想说我是学计算机的,我怕给学计算机的同志们丢脸)
早答应媳妇要给做一个程序,可以方便她做表的,可是一直没有做,
这里给媳妇道个歉!媳妇,我错了:)
那就做吧,具体怎么做就不再说,这里主要是把用到的一些程序做一个记录,以防以后还会用到。
代码有点不堪,高手请自行飘过~~~~~~~~~~
- '点击开始计算,根据输入的表名,行,列
'简单的判断下有没有输入数据
'没有做严格的正则的匹配判断
Private Sub beginSum_Click()- Dim sheetName As String
- Dim beginRow As Integer
- Dim endRow As Integer
- Dim beginCol As Integer
- Dim endCol As Integer
- Dim sumCol As Integer
- sheetName = tbSheetName.Text
- beginRow = tbBeginRow.Text
- endRow = tbEndRow.Text
- beginCol = tbBeginCol.Text
- endCol = tbEndCol.Text
- sumCol = tbSumCol.Text
- If Len(sheetName) = Then
- MsgBox "请输入正确的Sheet名称"
- Exit Sub
- ElseIf Not (IsNumeric(beginRow) And IsNumeric(endRow) And IsNumeric(endRow) And IsNumeric(beginCol) And IsNumeric(endCol) And IsNumeric(sumCol)) Then
- MsgBox "请输入正确的行或列数"
- Exit Sub
- End If
- Call CountPersonYear(sheetName, beginRow, endRow, beginCol, endCol, sumCol)
- MsgBox "计算完成!"
- End Sub
- '计算过程--有点复杂,先每行求和,再把同一个人的N个月的数据再求和,再加上某个月的前N(2)项
'当然,前提是在每个人的信息后面要插入一个空行 见 InsertRow()
'然后把这个总数写入到另一个固定列的表中,见WriteToTable()
Sub CountPersonYear(sheetName As String, beginRow As Integer, endRow As Integer, beginCol As Integer, endCol As Integer, sumCol As Integer)- Dim personBeginRow As Integer
- Dim mySum As Double
- Dim bigMonth As Integer
- Dim curMonth As Integer
- Dim i As Integer
- Dim j As Integer
- Dim myWorkBook As Workbook
- Dim mySheet As Worksheet
- Set myWorkBook = Application.ActiveWorkbook
- Set mySheet = myWorkBook.Sheets(sheetName)
- personBeginRow = beginRow
- bigMonth = mySheet.Cells(beginRow, )
- 'mySum = 0#
- endRow = endRow +
- For i = beginRow To endRow
- curMonth = mySheet.Cells(i, )
- If (Len(curMonth) <> And curMonth <> ) Then
- For j = beginCol To endCol
- mySum = mySum + mySheet.Cells(i, j)
- Next
- mySheet.Cells(i, sumCol) = mySum
- mySum = CDbl()
- ElseIf (mySheet.Cells(i - , ) <> And Len(mySheet.Cells(i - , )) <> ) Then
- For j = personBeginRow To i -
- mySum = mySum + CDbl(mySheet.Cells(j, sumCol))
- Next
- mySheet.Cells(i, sumCol) = mySum + CDbl(mySheet.Cells(personBeginRow, )) + CDbl(mySheet.Cells(personBeginRow, ))
- Call WriteToTable("SheetSum", mySheet.Cells(personBeginRow, ), mySheet.Cells(personBeginRow, ), CStr(mySheet.Cells(personBeginRow, )), mySheet.Cells(i, sumCol))
- mySum = CDbl()
- For j = i To endRow
- If (mySheet.Cells(j, ) <> And (mySheet.Cells(j, )) <> ) Then
- personBeginRow = j
- bigMonth = mySheet.Cells(j, )
- Exit For
- End If
- Next
- End If
- Next
- End Sub
- '把计算后的结果写入另一个表中
- Sub WriteToTable(sheetName As String, strName As String, strCardID As String, strYear As String, all As Double)
- Dim aSheet As Worksheet
- Dim i As Integer
- Dim j As Integer
- Dim curRow As Double
- Dim flag As Boolean
- flag = False
- Set aSheet = Application.ActiveWorkbook.Sheets(sheetName)
- 'curRow = aSheet.Cells(Rows.Count, 1).End(1).Row
- '需要表中的数据没有用过的,要整行的删除,这样保证数据的连续性,不能只删除数据内容
- curRow = aSheet.UsedRange.Rows.Count
- For i = To curRow
- If (aSheet.Cells(i, ) = strCardID) Then
- For j = To
- If CStr(aSheet.Cells(, j)) = strYear Then
- aSheet.Cells(i, j) = all
- flag = True
- Exit For
- End If
- Next
- End If
- Next
- If Not flag Then
- curRow = curRow +
- aSheet.Cells(curRow, ) = strName
- aSheet.Cells(curRow, ) = strCardID
- aSheet.Cells(curRow, ) = curRow
- For j = To
- If CStr(aSheet.Cells(, j)) = strYear Then
- aSheet.Cells(curRow, j) = all
- Exit For
- End If
- Next
- End If
- End Sub
- '在每个人的信息后插入一空行,用于做总和
'插入是以个人的身份证是不是一样来判断的
'这里面要数据是连续的,如果下一个为空则认为是身份证号不一样会插入一空行
Sub InsertRow(sheetName As String, personCol As Integer)- Dim rng As Range
- Dim personRow As String
- Dim r As Integer
- Dim n As Integer
- Dim lastRow As Integer
- Dim mySheet As Worksheet
- Set mySheet = Application.ActiveWorkbook.Sheets(sheetName)
- '第三列,即人名列最大的单元格数
- lastRow = mySheet.Cells(Rows.Count, ).End().Row
- For r = lastRow - To Step -
- If (mySheet.Cells(r, personCol) <> mySheet.Cells(r - , personCol)) Then
- mySheet.Cells(r, ).EntireRow.Insert
- End If
- 'For n = 1 To Cells(r - 1, 1).Value
- ' Cells(r, 1).EntireRow.Insert
- 'Next n
- Next r
- End Sub
VBA小记的更多相关文章
- [原]Paste.deploy 与 WSGI, keystone 小记
Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...
- VBA 格式化字符串 - Format大全
VBA 格式化字符串 VBA 的 Format 函数与工作表函数 TEXT 用法基本相同,但功能更加强大,许多格式只能用于VBA 的 Format 函数,而不能用于工作表函数 TEXT ,以下是本人归 ...
- MySql 小记
MySql 简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...
- VBA学习
1. Range / Cells / Columns / Rows 2. 绝对引用 $F$13 / 相对引用 F13 公式所在单元格的被复制到其他位置时,绝对引用不变 3. VLookup / NLo ...
- VBA学习思路
打算花两三天学习VBA的基础,学习资料为<别怕,VBA其实很简单>,为了快速学习,先了解大致框架,后续再深入学习各种属性.方法和技巧. 1.VBA编程环境基本操作,手工操作,熟悉即可 2. ...
- VBA笔记(三)——常用对象
VBA实际上就是操作Excel,把Excel进行拆解,划分多层对象,由顶至下为(也可以说是层层包裹): Application:代表Excel程序本性,之后我们操作对象都在它之下,因为是唯一且至高点, ...
- VBA中使用计时器的两种方法
'================================ ' VBA采用Application.OnTime实现计时器 ' ' http://www.cnhup.com '========= ...
- Git小记
Git简~介 Git是一个分布式版本控制系统,其他的版本控制系统我只用过SVN,但用的时间不长.大家都知道,分布式的好处多多,而且分布式已经包含了集中式的几乎所有功能.Linus创造Git的传奇经历就 ...
- 广州PostgreSQL用户会技术交流会小记 2015-9-19
广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...
随机推荐
- C++模板之可变模板参数
可变模板参数---- C++11新特性 可变模板参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数 由于可变模 ...
- C++之全局函数和成员函数互相转换
解析:成员函数会用this指针自动隐藏第一个操作数(左操作数) 1.把全局函数转化成成员函数,通过this指针隐藏左操作数. Test add(Test &t1,Test &t2) ...
- app基础
1界面:Layout 2.控件 3.整个窗口:Activity 4. ctrl + H : 查看类的继承关系 5. shift + F1:打开类的文档 6. Button button = (Butt ...
- 使用Axis2创建Web Service
Axis2是新一代Web Service开发工具,目前最新版本是1.5.本文主要介绍如何用Axis2创建Web Service. 首先下载二进制包和war包,将war包复制到Tomcat的webapp ...
- $.ajax数据传输成功却执行失败的回调函数
这个问题迷惑了我好几天,都快要放弃了,功夫不负有心人,最终成功解决,下面写一下我的解决方法. 我传的数据是json类型的,执行失败的回调函数是因为从后台传过来的数据不是严格的json类型,所以才会不执 ...
- 1.8-1.10 大数据仓库的数据收集架构及监控日志目录日志数据,实时抽取之hdfs系统上
一.数据仓库架构 二.flume收集数据存储到hdfs 文档:http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hd ...
- 技术胖Flutter第四季-20导航的参数传递和接受-1
技术胖Flutter第四季-20导航的参数传递和接受-1 视频地址:https://www.bilibili.com/video/av35800108/?p=21 先安装一个新的插件: Awesome ...
- mysql的权限问题SQLException: access denied for @'localhost' (using password: no)
遇到了 SQLException: access denied for @'localhost' (using password: no) 解决办法 grant all privileges o ...
- UVaLive 3902 Network (无根树转有根树,贪心)
题意:一个树形网络,叶子是客户端,其他的是服务器.现在只有一台服务器提供服务,使得不超k的客户端流畅,但是其他的就不行了, 现在要在其他结点上安装服务器,使得所有的客户端都能流畅,问最少要几台. 析: ...
- Visual Studio 2010下WorldWind编译问题集合
首先:获取WORLDWIND最新代码——建议不要直接下载源代码包进行编译,一是因为它并不是最新版本的代码,WW的代码最近经常更新:二是缺很多依赖的类库.建议用TortoiseSVN客户端从source ...