要放假了,可是我们,我还是煎熬!

最让人不爽的是媳妇也需要加班加点的完成一些看起来很EASY的事:

统计数据,把几个表合并……

EXCEL本人还是懂得一点点的(我不想说我是学计算机的,我怕给学计算机的同志们丢脸)

早答应媳妇要给做一个程序,可以方便她做表的,可是一直没有做,

这里给媳妇道个歉!媳妇,我错了:)

那就做吧,具体怎么做就不再说,这里主要是把用到的一些程序做一个记录,以防以后还会用到。

代码有点不堪,高手请自行飘过~~~~~~~~~~

  1. '点击开始计算,根据输入的表名,行,列
    '简单的判断下有没有输入数据
    '没有做严格的正则的匹配判断
    Private Sub beginSum_Click()
  2. Dim sheetName As String
  3. Dim beginRow As Integer
  4. Dim endRow As Integer
  5. Dim beginCol As Integer
  6. Dim endCol As Integer
  7. Dim sumCol As Integer
  8.  
  9. sheetName = tbSheetName.Text
  10. beginRow = tbBeginRow.Text
  11. endRow = tbEndRow.Text
  12. beginCol = tbBeginCol.Text
  13. endCol = tbEndCol.Text
  14. sumCol = tbSumCol.Text
  15.  
  16. If Len(sheetName) = Then
  17. MsgBox "请输入正确的Sheet名称"
  18. Exit Sub
  19. ElseIf Not (IsNumeric(beginRow) And IsNumeric(endRow) And IsNumeric(endRow) And IsNumeric(beginCol) And IsNumeric(endCol) And IsNumeric(sumCol)) Then
  20. MsgBox "请输入正确的行或列数"
  21. Exit Sub
  22. End If
  23.  
  24. Call CountPersonYear(sheetName, beginRow, endRow, beginCol, endCol, sumCol)
  25. MsgBox "计算完成!"
  26.  
  27. End Sub
  1. '计算过程--有点复杂,先每行求和,再把同一个人的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)
  2. Dim personBeginRow As Integer
  3. Dim mySum As Double
  4. Dim bigMonth As Integer
  5. Dim curMonth As Integer
  6.  
  7. Dim i As Integer
  8. Dim j As Integer
  9.  
  10. Dim myWorkBook As Workbook
  11. Dim mySheet As Worksheet
  12.  
  13. Set myWorkBook = Application.ActiveWorkbook
  14. Set mySheet = myWorkBook.Sheets(sheetName)
  15.  
  16. personBeginRow = beginRow
  17. bigMonth = mySheet.Cells(beginRow, )
  18. 'mySum = 0#
  19. endRow = endRow +
  20.  
  21. For i = beginRow To endRow
  22. curMonth = mySheet.Cells(i, )
  23. If (Len(curMonth) <> And curMonth <> ) Then
  24. For j = beginCol To endCol
  25. mySum = mySum + mySheet.Cells(i, j)
  26. Next
  27. mySheet.Cells(i, sumCol) = mySum
  28. mySum = CDbl()
  29. ElseIf (mySheet.Cells(i - , ) <> And Len(mySheet.Cells(i - , )) <> ) Then
  30.  
  31. For j = personBeginRow To i -
  32. mySum = mySum + CDbl(mySheet.Cells(j, sumCol))
  33. Next
  34.  
  35. mySheet.Cells(i, sumCol) = mySum + CDbl(mySheet.Cells(personBeginRow, )) + CDbl(mySheet.Cells(personBeginRow, ))
  36.  
  37. Call WriteToTable("SheetSum", mySheet.Cells(personBeginRow, ), mySheet.Cells(personBeginRow, ), CStr(mySheet.Cells(personBeginRow, )), mySheet.Cells(i, sumCol))
  38.  
  39. mySum = CDbl()
  40.  
  41. For j = i To endRow
  42. If (mySheet.Cells(j, ) <> And (mySheet.Cells(j, )) <> ) Then
  43. personBeginRow = j
  44. bigMonth = mySheet.Cells(j, )
  45. Exit For
  46. End If
  47. Next
  48. End If
  49. Next
  50. End Sub
  51.  
  52. '把计算后的结果写入另一个表中
  53. Sub WriteToTable(sheetName As String, strName As String, strCardID As String, strYear As String, all As Double)
  54.  
  55. Dim aSheet As Worksheet
  56. Dim i As Integer
  57. Dim j As Integer
  58. Dim curRow As Double
  59. Dim flag As Boolean
  60.  
  61. flag = False
  62.  
  63. Set aSheet = Application.ActiveWorkbook.Sheets(sheetName)
  64.  
  65. 'curRow = aSheet.Cells(Rows.Count, 1).End(1).Row
  66. '需要表中的数据没有用过的,要整行的删除,这样保证数据的连续性,不能只删除数据内容
  67. curRow = aSheet.UsedRange.Rows.Count
  68. For i = To curRow
  69. If (aSheet.Cells(i, ) = strCardID) Then
  70. For j = To
  71. If CStr(aSheet.Cells(, j)) = strYear Then
  72. aSheet.Cells(i, j) = all
  73. flag = True
  74. Exit For
  75. End If
  76. Next
  77. End If
  78. Next
  79. If Not flag Then
  80. curRow = curRow +
  81. aSheet.Cells(curRow, ) = strName
  82. aSheet.Cells(curRow, ) = strCardID
  83. aSheet.Cells(curRow, ) = curRow
  84. For j = To
  85. If CStr(aSheet.Cells(, j)) = strYear Then
  86. aSheet.Cells(curRow, j) = all
  87. Exit For
  88. End If
  89. Next
  90. End If
  91. End Sub
  1. '在每个人的信息后插入一空行,用于做总和
    '插入是以个人的身份证是不是一样来判断的
    '这里面要数据是连续的,如果下一个为空则认为是身份证号不一样会插入一空行
    Sub InsertRow(sheetName As String, personCol As Integer)
  2. Dim rng As Range
  3. Dim personRow As String
  4. Dim r As Integer
  5. Dim n As Integer
  6. Dim lastRow As Integer
  7.  
  8. Dim mySheet As Worksheet
  9. Set mySheet = Application.ActiveWorkbook.Sheets(sheetName)
  10.  
  11. '第三列,即人名列最大的单元格数
  12. lastRow = mySheet.Cells(Rows.Count, ).End().Row
  13. For r = lastRow - To Step -
  14. If (mySheet.Cells(r, personCol) <> mySheet.Cells(r - , personCol)) Then
  15. mySheet.Cells(r, ).EntireRow.Insert
  16. End If
  17. 'For n = 1 To Cells(r - 1, 1).Value
  18. ' Cells(r, 1).EntireRow.Insert
  19. 'Next n
  20. Next r
  21. End Sub

VBA小记的更多相关文章

  1. [原]Paste.deploy 与 WSGI, keystone 小记

    Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...

  2. VBA 格式化字符串 - Format大全

    VBA 格式化字符串 VBA 的 Format 函数与工作表函数 TEXT 用法基本相同,但功能更加强大,许多格式只能用于VBA 的 Format 函数,而不能用于工作表函数 TEXT ,以下是本人归 ...

  3. MySql 小记

    MySql  简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...

  4. VBA学习

    1. Range / Cells / Columns / Rows 2. 绝对引用 $F$13 / 相对引用 F13 公式所在单元格的被复制到其他位置时,绝对引用不变 3. VLookup / NLo ...

  5. VBA学习思路

    打算花两三天学习VBA的基础,学习资料为<别怕,VBA其实很简单>,为了快速学习,先了解大致框架,后续再深入学习各种属性.方法和技巧. 1.VBA编程环境基本操作,手工操作,熟悉即可 2. ...

  6. VBA笔记(三)——常用对象

    VBA实际上就是操作Excel,把Excel进行拆解,划分多层对象,由顶至下为(也可以说是层层包裹): Application:代表Excel程序本性,之后我们操作对象都在它之下,因为是唯一且至高点, ...

  7. VBA中使用计时器的两种方法

    '================================ ' VBA采用Application.OnTime实现计时器 ' ' http://www.cnhup.com '========= ...

  8. Git小记

    Git简~介 Git是一个分布式版本控制系统,其他的版本控制系统我只用过SVN,但用的时间不长.大家都知道,分布式的好处多多,而且分布式已经包含了集中式的几乎所有功能.Linus创造Git的传奇经历就 ...

  9. 广州PostgreSQL用户会技术交流会小记 2015-9-19

    广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...

随机推荐

  1. C++模板之可变模板参数

    可变模板参数---- C++11新特性 可变模板参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数 由于可变模 ...

  2. C++之全局函数和成员函数互相转换

    解析:成员函数会用this指针自动隐藏第一个操作数(左操作数) 1.把全局函数转化成成员函数,通过this指针隐藏左操作数. Test add(Test &t1,Test &t2)  ...

  3. app基础

    1界面:Layout 2.控件 3.整个窗口:Activity 4. ctrl + H : 查看类的继承关系 5. shift + F1:打开类的文档 6. Button button = (Butt ...

  4. 使用Axis2创建Web Service

    Axis2是新一代Web Service开发工具,目前最新版本是1.5.本文主要介绍如何用Axis2创建Web Service. 首先下载二进制包和war包,将war包复制到Tomcat的webapp ...

  5. $.ajax数据传输成功却执行失败的回调函数

    这个问题迷惑了我好几天,都快要放弃了,功夫不负有心人,最终成功解决,下面写一下我的解决方法. 我传的数据是json类型的,执行失败的回调函数是因为从后台传过来的数据不是严格的json类型,所以才会不执 ...

  6. 1.8-1.10 大数据仓库的数据收集架构及监控日志目录日志数据,实时抽取之hdfs系统上

    一.数据仓库架构 二.flume收集数据存储到hdfs 文档:http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hd ...

  7. 技术胖Flutter第四季-20导航的参数传递和接受-1

    技术胖Flutter第四季-20导航的参数传递和接受-1 视频地址:https://www.bilibili.com/video/av35800108/?p=21 先安装一个新的插件: Awesome ...

  8. mysql的权限问题SQLException: access denied for @'localhost' (using password: no)

    遇到了 SQLException: access denied for  @'localhost' (using password: no) 解决办法   grant all privileges o ...

  9. UVaLive 3902 Network (无根树转有根树,贪心)

    题意:一个树形网络,叶子是客户端,其他的是服务器.现在只有一台服务器提供服务,使得不超k的客户端流畅,但是其他的就不行了, 现在要在其他结点上安装服务器,使得所有的客户端都能流畅,问最少要几台. 析: ...

  10. Visual Studio 2010下WorldWind编译问题集合

    首先:获取WORLDWIND最新代码——建议不要直接下载源代码包进行编译,一是因为它并不是最新版本的代码,WW的代码最近经常更新:二是缺很多依赖的类库.建议用TortoiseSVN客户端从source ...