VBA小模板,跨表统计的2种写法
创始人
2024-05-31 10:19:26
0

目标

  • 1 统计一个excel 文件里,多个sheet里的内容
  • 2 有的统计需求是,每个表只单表统计,只是进行批量操作
  • 3 有的需求是,多个表得某些行列累加等

造出来得文件

 

 2 实现方法1 (可能只适合VBA+EXCEL,不太干净的写法)

2.1 基本思路

  • 双层循环
  • 一层是循环各个sheet表
  • 一层是在某个sheet表内取数据,从头取到尾(需要判断下取第几列,取到哪行为止)


 

Sub t100()
Dim sh1 As Object
Set sh1 = ThisWorkbook.Worksheets("sheet1")
sh1.Columns(6).Clear                    '重置输出区
sh1.Cells(1, 6) = "跨表sum"Dim j As ObjectFor Each j In ThisWorkbook.Worksheetsi = 2j.Cells(2, 4).Clear             '重置输出单元格,避免污染Do While j.Cells(i, 2) <> ""sh1.Cells(i, 6) = j.Cells(i, 2) + sh1.Cells(i, 6)   '跨表对应行累加统计j.Cells(2, 4) = j.Cells(i, 2) + j.Cells(2, 4)       '单表多行累加i = i + 1LoopNext
End Sub

2.2 用EXCEL表的单元格,当变量来存储数据

(其实我反思,EXCEL只应用来显示可能更好)

  • 如果是累加一个sheet的数据,存在一个变量/1个单元格就行
  • 如果是累加多个sheet的数据,需要存在多个excel单元格/ 1行/1列等

2.3 重点1

  • 方法1直接把 j当作了worksheets对象


    Dim j As Object
    For Each j In ThisWorkbook.Worksheets

2.4 方法1,需要重置输出区

  • 为什么呢?
  • 因为EXCEL不是变量,数组,是文件,是可以保存数据的
  • 不像 程序里的变量,数组,程序开始运行,创建--生---------程序运行结束,销毁--灭,
  • 所以有可能上次运行的数据( 可以叫脏数据吧)还存着,会和新运行的结果累积起来
  • 所以就需要 先把EXCEL的输出区域重置才行

2.5  方法1得历史改进过程,没什么用,有兴趣得看看

Sub t1()
Dim sh1 As Object
Set sh1 = ThisWorkbook.Worksheets("sheet1")
Dim j As ObjectFor Each j In ThisWorkbook.WorksheetsFor i = 2 To 99   '写死99这种这个很不好,需要线判断最大行数sh1.Cells(i, 6) = j.Cells(i, 2) + sh1.Cells(i, 6)NextNext
End SubSub t11()
Dim sh1 As Object
Set sh1 = ThisWorkbook.Worksheets("sheet1")
Dim j As ObjectFor Each j In ThisWorkbook.Worksheetsi = 2Do While j.Cells(i, 2) <> ""sh1.Cells(i, 6) = j.Cells(i, 2) + sh1.Cells(i, 6)i = i + 1LoopNext
End SubSub t12()
Dim j As ObjectFor Each j In ThisWorkbook.Worksheetsi = 2Do While j.Cells(i, 2) <> ""j.Cells(2, 4) = j.Cells(i, 2) + j.Cells(2, 4)i = i + 1LoopNext
End Sub

3  方法2: 运算和存储都在程序的变量里进行,EXCEL只存储和显示最终结果

3.1 代码写法思路和方法1完全不同

  • 运算和存储都在程序的变量里进行,EXCEL只存储和显示最终结果
  • VBA 和像方法1那么干,还是因为是内置在EXCEL里的吧
  • 一般程序还是都把过程放在程序内解决,
  • EXCEL表只是存储最终结果  & 显示出来

Sub t200()'核心差异
'方法2,把j定义为 sheet的序号,而b作为worksheets对象,Set b = Worksheets(j)'
'对应方法1,直接把j当作了worksheets对象'方法1,需要重置输出区
'方法2,因为都是用变量中转的,单数据存1个变量里,多数据存在数组,因为变量做了重置,所以输出区域就不做重置了Dim i, j, h
Dim b As Object
Dim sh1 As Object
Set sh1 = ThisWorkbook.Worksheets("sheet1")
Dim arr1()For j = 1 To ThisWorkbook.Worksheets.Counth = 0  '每个表分表统计i = 2  '每个表都从第2行开始,重置i行数'数组不需要重置?因为这个数组不需要循环,就是要一次性累加'每次运行变量和数组都是消灭后重新生产的,不会像excel这种外部文件记录了数据' 重置变量和数组是为了程序连续运行期间问题,就是为了,循环,下次循环冲头再来Set b = Worksheets(j)Do While b.Cells(i, 2) <> ""ReDim Preserve arr1(2 To i)           '因为i在不同的表,无法确认具体数值,有数据的行数都不同arr1(i) = b.Cells(i, 2) + arr1(i)       '跨表对应行累加统计,因为是多个数据,需要用数组h = h + b.Cells(i, 2)                  '单表多行累加i = i + 1Loopb.Cells(2, 4) = h                       'h本身做了重置,因此输出单元格Cells(2, 4) 不需要再重置NextFor i = LBound(arr1) To UBound(arr1)sh1.Cells(i, 6) = arr1(i)NextEnd Sub

3.2 定义sheet 不同

  • 方法2,把j定义为 sheet的序号,而b作为worksheets对象,Set b = Worksheets(j)'
  • 对应方法1,直接把j当作了worksheets对象

3.3 不需要重置EXCEL的  存储+显示区

  • 方法1,需要重置输出区
  • 因为方法1,把那些区域又做显示,又做存储就有了需要重置清除的问题
  • '方法2,因为都是用变量中转的,单数据存1个变量里,多数据存在数组,因为变量做了重置,所以输出区域就不做重置了

可以看到代码里

EXCEL输出区域,只是从 代码里取变量 或数组内容进行显示,和EXCEL本身区域的内容没关系,输出后会直接覆盖老数据

(不过也有可能有问题,就是老数据的行数比新的多,导致这样还是有脏数据,嘿嘿)

b.Cells(2, 4) = h   

    For i = LBound(arr1) To UBound(arr1)
        sh1.Cells(i, 6) = arr1(i)
    Next


3.4 代码内部的重置, 这个主要和循环有关系

  • 数组不需要重置?因为这个数组不需要循环,就是要一次性累加
  •  每次运行变量和数组都是消灭后重新生产的,不会像excel这种外部文件记录了数据
  •  重置变量和数组是为了程序连续运行期间问题,就是为了,循环,下次循环重头再来

3.5 方法2的历史代码,没啥用


Sub t2()
Dim i, j, h
Dim b As ObjectFor j = 1 To ThisWorkbook.Worksheets.Counth = 0  '每个表分表统计i = 2  '每个表都从第2行开始,重置i行数Set b = Worksheets(j)Do While b.Cells(i, 2) <> ""h = h + b.Cells(i, 2)i = i + 1Loopb.Cells(2, 4) = hNextEnd SubSub t21()
Dim i, j
Dim b As Object
Dim sh1 As Object
Set sh1 = ThisWorkbook.Worksheets("sheet1")For j = 1 To ThisWorkbook.Worksheets.Counti = 2  '每个表都从第2行开始,重置i行数Set b = Worksheets(j)Do While b.Cells(i, 2) <> ""sh1.Cells(i, 6) = b.Cells(i, 2) + sh1.Cells(i, 6)i = i + 1LoopNextEnd Sub

相关内容

热门资讯

我好想再坐一次过山车小学作文... 我好想再坐一次过山车小学作文 篇一过山车是我最喜欢的游乐设施之一。每当我看到它高高地耸立在游乐园中时...
一年级作文生日作文【优选6篇... 一年级作文生日作文 篇一我的生日今天是我的生日,我已经等待这一天很长时间了。一大早,我就迫不及待地跳...
多彩的活动六年级作文700字... 多彩的活动六年级作文700字 篇一奇妙的春游春天是一个充满活力和希望的季节,我们班级决定组织一次奇妙...
远山者,宅之东,落凤山是也(... 远山者,宅之东,落凤山是也 篇一远山者,宅之东,落凤山是也落日余晖洒在窗前,映照着远山的轮廓,宛如一...
小学作文极速风车【优质3篇】 小学作文极速风车 篇一极速风车是一款非常受小学生欢迎的游乐设备。它由一个巨大的圆盘和一根中央轴组成,...
看图写话铲雪作文(推荐6篇) 看图写话铲雪作文 篇一冬天的早晨,大雪纷飞,整个小区都被染上了一片银白色的颜色。小明推开窗户,看着窗...
小松树小学作文(优秀6篇) 小松树小学作文 篇一:我的暑假生活暑假终于来了,我迫不及待地计划着如何度过这个美好的假期。首先,我决...
走进新时代小学作文【优选4篇... 走进新时代小学作文 篇一随着时代的发展,我们迎来了新时代小学。新时代小学是一座现代化的学校,拥有先进...
我的心儿怦怦跳小学生作文【优... 我的心儿怦怦跳小学生作文 篇一我的心儿怦怦跳今天,我要给大家讲一个有关我的心情的故事。故事的主人公是...
走进医院小学作文【优秀3篇】 走进医院小学作文 篇一医院小学是一所特殊的学校,它位于医院内,为住院的患儿提供教育服务。我有幸参观了...
父母的爱小学作文700字【实... 父母的爱小学作文700字 篇一父母的爱父母是孩子一生中最重要的人,他们的爱无处不在。我有一个特别疼爱...
美丽的秋天树叶小学作文【精彩... 美丽的秋天树叶小学作文 篇一秋天来了,大地变得金黄了起来。走在树林里,你会看到树叶一个个像小精灵一样...
买菜小学作文【优质6篇】 买菜小学作文 篇一我喜欢去菜市场买菜我家离菜市场很近,所以每次我都会去买菜。我喜欢去菜市场买菜的原因...
逛书店的作文(最新3篇) 逛书店的作文 篇一逛书店的作文近年来,随着电子书的兴起,逛书店的人似乎越来越少了。然而,对我来说,逛...
心儿怦怦跳小学作文(最新6篇... 心儿怦怦跳小学作文 篇一心儿怦怦跳我是一颗小小的心儿,每天都在孩子们的胸腔中怦怦跳动。当孩子们快乐时...
大力士小学作文(优选6篇) 大力士小学作文 篇一我的偶像我有一个偶像,他就是大力士先生。大力士先生是我们学校的保安,他不仅身手敏...
我的伙伴小学作文【精彩6篇】 我的伙伴小学作文 篇一 我的伙伴小学作文 篇二我的伙伴小学作文 篇三   一天,我在院子里玩耍,无意...
春节联欢晚会小学作文(通用6... 春节联欢晚会小学作文 篇一喜迎新春,迎接春节联欢晚会今年的春节联欢晚会真是精彩纷呈!我和家人一起坐在...
同一个屋檐下作文600字【精... 同一个屋檐下作文600字 篇一家是一个温暖的港湾,是每个人一生中最重要的地方。在同一个屋檐下生活,意...
养兔真让我着迷小学作文(实用... 养兔真让我着迷小学作文 篇一 我家养了一只可爱的小兔子,从那时起,我就对养兔子产生了浓厚的兴趣...