ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: qdnzlh

[分享] 自动为VBA代码添加行号或删除行号

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-15 09:39 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 qdnzlh 于 2019-6-15 18:29 编辑

初学写VBA代码,有时喜欢将对自己有用的代码收藏到自己的QQ日志中。为便于说明,需要对代码添加行号(不像ExcelHome的帖子,可以自动添加行号,复制时又不会复制行号)。
当复制下来使用时,又需要去掉这些行号。
若代码在10行以下,添加或删除都不觉得什么,若是在20行以上,就觉得很麻烦了,于是写了两个极简短的VBA代码,自己在word中使用,感觉还是挺方便的。初学者可以参考。
  1. Sub 给代码自动添加行序号()
  2. For i = 1 To ActiveDocument.Paragraphs.Count     '获取文档段落数量
  3.   ActiveDocument.Paragraphs(i).Range.Select      '从首段开始循环选取段落
  4.   With Selection                     '指定已选定对象
  5.      n1 = .Start: n2 = .End              '获取起始位置及结束位置
  6.     .SetRange Start:=n2 - 1, End:=n2 - 1      '光标移至段尾-1处
  7.     .InsertAfter "</div>"               '插入网页段尾标记</div>
  8.     .SetRange Start:=n1, End:=n1           '光标移至段首位置
  9.     .TypeText "<div>#" & Format(i, "00") & " "   '插入网页段首标记<div>及行号
  10.   End With
  11. Next
  12. End Sub
  13. 'qq日志中需添加网页段首标记<div>和段尾标记</div>
复制代码
  1. Sub 快速删除VBA代码的行号()
  2. '只针对:行号带#字前缀, word文档中为纯文本!
  3. Dim s As Range
  4. Set s = IIf(Selection.Type = wdSelectionIP, _
  5.        ActiveDocument.Content, Selection.Range)  '使s变量与实际对象关联
  6. With CreateObject("VBscript.regexp")    '指定VBs正则表达式对象
  7.   .Global = True               '全局搜索
  8.   .IgnoreCase = False            '忽略字母大写为假
  9.   .MultiLine = True             '多行标志为真
  10.   .Pattern = "#[0-9][0-9] "        '设置匹配模式(#01,#02, … 等等)
  11.    s = .Replace(s, "")           '替换为空串,句中s实为s.Text, 此处属性可缺省
  12. End With
  13. Set s = Nothing                '解除s变量与实际对象的关联
  14. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-7 14:44 | 显示全部楼层
本帖最后由 qdnzlh 于 2019-8-7 19:32 编辑

将自己感觉有用的一些小代码收藏与此,方便自己取用。

Word文档中的人民币小写转大写代码:
1、使用“过程+自定义函数”的方式;
2、“过程”主要是在整篇文档中搜索人民币小写,并将大写插入小写的左边;
3、小写的搜索方式采用正则表达式全文搜索;
4、在调用小写转大写函数之前,应首先对小写数字进行规范处理;
5、自定义函数只负责将金额的小写数字转换成中文大写;
6、自定义函数中,用正则表达式搜索替换大写中多余的零,使之符合人民币读写规则;
7、当亿/万/元位等于0时,有的说在亿/万/元后面要加“零”,有的又说不要加,我是照加零来处理;
8、…………
  1. Private Sub 人民币大写()
  2. Dim s$, i%, n$, Caps$, st%, g As Object
  3. s = ActiveDocument.Range.Text                                   '整篇文本赋予s$
  4. With CreateObject("VBScript.RegExp")                          '建立正则对象
  5.     .Global = True                                                            '全局查找或替换
  6.     .Pattern = "[0-9\d][0-9\d.,,\u0020\u3000\u00A0]*(?=元)" '小写模式串
  7.      Set g = .Execute(s)                                                  '返回小写集合对象
  8.      For i = g.Count - 1 To 0 Step -1                               '倒序循环处理
  9.          n = g.Item(i).Value                                                '获取小写金额
  10.          If n Like "*.*.*" Then Caps = "{小数点过多!}": GoTo sk
  11.         '下列正则表达式对小写作规范处理
  12.         .Pattern = "[\u0020\u3000\u00A0,,]"                 '去掉空格及数字分节号
  13.          n = .Replace(n, "")                                               '替换成空字符
  14.          n = Format(n * 100, "0")                                     '将小写化成整数
  15.          If Len(n) > 15 Then Caps = "{数字超出15位啦!}": GoTo sk  '金额超万亿位就退出
  16.          Caps = N2Caps(n)                                                '调用RMB大写自定义函数
  17. sk:    '下列三行插入RMB大写(于小写之前)
  18.          st = g.Item(i).FirstIndex                                        '取得小写前的位置号
  19.          Selection.SetRange Start:=st, End:=st                  '光标定位于插入点
  20.          Selection.InsertBefore Text:="人民币" & Caps       '插入大写金额
  21.      Next i
  22. End With
  23. End Sub
  24. '----------------------------------------------
  25. Public Function N2Caps(n)
  26.     Dim i%, s1$, s2$, s3$, Caps$
  27.     '下列For循环逐位替换成大写
  28.     For i = 0 To Len(n) - 1                                              '按数字位数循环替换
  29.        s1 = Mid(n, Len(n) - i, 1)                                        '从末位起逐位取数字
  30.        s2 = Mid("零壹贰叁肆伍陆柒捌玖", s1 + 1, 1)        '取相应数字的大写
  31.        s3 = Mid("分角元拾佰仟万拾佰仟亿拾佰仟万", i + 1, 1)  '从左边起逐位取单位
  32.        Caps = s2 & s3 & Caps                                           '连接数字大写与单位大写
  33.     Next i
  34.     '下列正则表达式去掉多余的"零"
  35.     With CreateObject("VBScript.RegExp")                     '建立正则对象
  36.         .Global = True                                                       '全局查找或替换
  37.         .Pattern = "(零[仟佰拾角分])+零?"
  38.          Caps = .Replace(Caps, "零")
  39.         .Pattern = "零?([亿万元])(零万)?"
  40.          Caps = .Replace(Caps, "$1")
  41.         .Pattern = "([亿万仟佰拾][亿万元])([壹贰叁肆伍陆柒捌玖])"
  42.          Caps = .Replace(Caps, "$1零$2")                         '“亿/万/元”位=0时, 添加“零”
  43.         .Pattern = "零$"
  44.          Caps = .Replace(Caps, "整")
  45.          If n = 0 Then Caps = "零元整"
  46.     End With
  47. sk: N2Caps = Caps
  48. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-11 17:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 qdnzlh 于 2019-8-11 18:08 编辑

自用代码,收藏与此。

已知填充颜色,批量提取RGB数值:
  1. Sub getRGB() '定义获取RGB过程
  2. For i = 2 To 57
  3.     Cells(i, "A").Interior.ColorIndex = i - 1   '通过索引号属性将颜色写入单元格
  4.     Cells(i, "B") = i - 1                       '在单元格中写入索引号
  5. Next
  6. For i = 2 To 57
  7.     If Cells(i, "A").Interior.ColorIndex = xlNone Then Exit For  '单元格无色则退出循环
  8.     c = Cells(i, "A").Interior.Color            '获取单元格颜色值(十进制)
  9.     cs = String(6 - Len(Hex(c)), "0") & Hex(c)  '将c值转化为6位16进制数,不足6位左边补0
  10.     r = Right(cs, 2)                            '取16进制的低二位
  11.     g = Mid(cs, 3, 2)                           '取16进制的中间二位
  12.     b = Left(cs, 2)                             '取16进制的高二位
  13.     Cells(i, "C") = "#" & r & g & b             '将16进制的RGB值写入Cells(i,"C")单元格
  14.     '下面一行将10进制的RGB值写入Cells(i,"D")单元格
  15.     Cells(i, "D") = 1*("&H" & r) & "." & 1*("&H" & g) & "." & 1*("&H" & b)   
  16. Next
  17. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-8-11 21:21 | 显示全部楼层
三原色rgb(r,g,b)=r+g*256+b*256*256

TA的精华主题

TA的得分主题

发表于 2019-8-12 01:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
天呢!刚来论坛的两位老师!啥都懂!我来论坛 8 年了,函数、数组、正则等都不懂!向两位老师学习!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-16 12:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 qdnzlh 于 2019-8-16 12:42 编辑

doc/wps文档中的表格汇总

方法一:循环累加汇总法
  1. Sub TableSum()
  2. 'doc/wps文档表格4行8列数据汇总写入第9列
  3.   Set d = ActiveDocument.Content.Tables(1)    ' 使变量d与表格对象关联
  4.   For i = 2 To 4                 ' 4行数据,首行为数据字段名称
  5.     n = 0                    ' 给每行汇总数据赋初值0
  6.     For j = 2 To 8               ' 8列数据,首列为数据项目名称
  7.       n = n + Val(d.Cell(i, j).Range.Text)  ' 将文本数字化为数值,然后汇总
  8.     Next j
  9.     d.Cell(i, j).Range.Text = n         ' 汇总数写入第9列
  10.     Set g = d.Cell(i, j).Range          ' 使变量g与第9列单元格对象关联
  11.     MsgBox Left(g.Text, Len(g.Text) - 2)    ' 显示第9列单元格数字(已去掉cr和bel字符)
  12.   Next i
  13. End Sub
复制代码
【代码说明】
1、表格中第1行和第1列分别为表头名称和表膀名称,其余的行列为数据,故循环变量(i, j)初始值均从2开始。
2、第#07行中Val函数是将单元格中文本数字转化为数值。按照VBA的表达式运算规则,文本数字与数值是可以直接相加的,为什么还要先转换呢?这是因为,在doc/wps文档表格中,单元格的文本除数字文本外,数字末尾还含有回车符Chr(13)和响铃符Chr(7),直接相加将会提示数据类型错误。而外套Val()函数以后,在执行数据转换时,Val()只转换前边的数字(含小数点),后边的非数字字符/文本将被忽略,比如:Val("15.20元")=15.2。
3、第11行显示的文本数字,就是先截去了回车符和响铃符后的文本,不然会显示为两行内容。
4、循环累加法适用于隔列汇总。

方法二:域代码汇总法
  1. Sub 表格中插入域1()
  2. '插入域公式进行表格汇总
  3.   For i = 2 To 4
  4.   Set d = ActiveDocument.Tables(1).Cell(i, 9).Range  '使变量d与实际对象关联
  5.     d.Text = ""                   '单元格文本属性赋为空值
  6. '或   d.Delete                     '删除单元格内容
  7.     d.Fields.Add Range:=d, Text:="=Sum(Left)"    '单元格中插入域及公式
  8.   Next
  9. End Sub
复制代码
【代码说明】
1、代码中的表格为4行9列,首行首列为表头和表膀,故循环变量(i)初始值从2开始。
2、代码中,d为对象变量,指向表格第 i 行第9列单元格对象的内容。
3、代码中.Range对象表示单元格的内容,它的.Text属性其实也包含了.Fields这个对象,故当删除.Range对象时,会同时删除文本和域。当给.Range.Text属性赋值为空串时,也会同时删除文本和域。不过,Range.Text属性的返回值却只有普通字符和域结果字符,不能返回域代码。
4、Fields.Add [域.加入]:该方法表示插入域代码。
语法如下:
Fields.Add(Range, Type, Text, PreserveFormatting)
参数说明:
① Range [区域]:区域对象。需要添加域的区域。如果该区域未折叠,那么域将替换该区域。
  必须指出的是,即使区域未折叠,仍存在着插入域无法替换该区域的两种情况:
  一是当用.Select方法(或鼠标)选定整个单元格区域时,所选文本尾部含有Chr(13)字符,该字符属单元格固有,不可替换;
  二是当用.Range对象指定整个单元格区域时,对象文本尾部含有Chr(13)+Chr(7)字串,该串也属单元格固有,不可替换。
  只有当选定单元格中具有可显示的文本串时,域才替换该区域。
② Type [类型]:为任意WdFieldType常量。它有几十个常量值,默认值为wdFieldEmpty,它表示尚未添加域内容的占位符。用户通过按 Ctrl+F9 添加的域就是Empty域。
③ Text [文本]:域所需的其他文本。例如,要给域指定一个开关,可将其添加到此处。
④ PreserveFormatting [保存格式]:该属性值若为True,则更新时保留域所应用的格式。

域代码法还可写成如下形式:
  1. Sub 表格中插入域2()
  2. For i = 2 To 4
  3.   ActiveDocument.Tables(1).Cell(i, 5).Range.Select  '选定单元格内容
  4.   Selection.MoveEnd unit:=wdCharacter, Count:=-1   '选定区域末尾去掉一个字符
  5.   With Selection
  6.     .Fields.Add Range:=.Range, Text:="=Sum(Left)"  '插入域并覆盖选定区域
  7.   End With
  8. Next
  9. End Sub
复制代码
【代码说明】
代码使用Select方法选定单元格文本,故文本尾部含有一个回车符Chr(13),即便是空单元格也含有这个字符,它是单元格固有的,因此,插入的域无法覆盖选定内容。要想达到覆盖选定内容的目的,就必须避开该字符Chr(13),所以,第4行的作用就是将选定内容末尾位置左移一个字符。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-18 22:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 qdnzlh 于 2019-8-19 11:29 编辑

本人因工作需要,每月要统计一张报表,数据由透视表功能自动生成。本单位使用的是WPS软件。
但WPS表格的透视表功能目前还不够完善,生成的透视表有的地方没有表格线,不够美观。为此,编了一段VBA代码来对透视表进行完善。暂时收藏于此。

表格样式(笔数及金额数据区原无表格线):
简便起见,表中仅列出两个分公司、三个网点(实际有10多个分公司、60多个网点)。
透视表画线.png

【WPS表格:用VBA绘制电子表格实线并设置单元格格式】
  1. Private Sub Worksheet_Change(ByVal Target As Range)                      'Change事件触发过程
  2.     ActiveSheet.PageSetup.Zoom = 85                                      '设置页面输出缩放比例为85%
  3.     r = Range("A65536").End(xlUp).Row                                    '透视表尾行行号
  4.     c = Range("IV4").End(xlToLeft).Column                                '透视表尾列列号
  5.     Columns("A:A").ColumnWidth = 6.5 + 4
  6.     Columns("B:B").ColumnWidth = 15
  7.     Columns("C:C").ColumnWidth = 9.5
  8.     Columns("D:D").ColumnWidth = 11
  9.     Columns("E:" & IIf(c = 11, "K", "Q")).ColumnWidth = 7
  10.     [E5].Resize(r - 4, c - 4).Font.Name = "Arial Narrow"                 '设置单元格字体"Arial Narrow"
  11.     [E5].Resize(r - 4, c - 4).Font.Size = "12"                           '设置单元格字号为"12"号
  12.     [E5].Resize(1, c - 4).NumberFormatLocal = "0"                        '设置奇数行为整数格式
  13.     [E6].Resize(1, c - 4).NumberFormatLocal = "0.0"                      '设置偶数行为小数格式
  14.     Application.EnableEvents = False                                     '禁止触发工作表改变事件
  15.     [D5:D6] = [{"日均笔数";"业务收入"}]                                    '纵向数组整体赋值
  16.     [D5:D6].AutoFill Destination:=[D5].Resize(r - 6)                     '双单元格下拉自动填充数据
  17.     With Range([C5].Resize(2, c - 2).Address & "," & _
  18.                [D5].Resize(2).Address)                                   '由With指定的单元格区域
  19.         .BorderAround , , xlColorIndexAutomatic                          '单元格区域画边框线[见注释②]
  20.     End With
  21.     '下句复制表格线、单元格格式("0"/"0.0")、字体及字号
  22.     [C5].Resize(2, c - 2).AutoFill Destination:=[C5] _
  23.         .Resize(r - 4, c - 2), Type:=xlFillFormats                       '双行区域下拉自动填充格式
  24.     With Cells(r - 1, "C").Resize(2, c - 2)                              '指定的末尾两行单元格区域
  25.         .Borders(xlInsideHorizontal).LineStyle = xlContinuous            '单元格区域内部画横线
  26.     End With
  27.     For i = 5 To r - 2 Step 2                                            '循环终值=尾行行号-2,步长为2
  28.         If Range("A" & i) = "" Then                                      '判断单元格是否为空
  29.             Range("A" & i).Borders(xlEdgeTop).LineStyle = xlNone         '抹去单元格顶边实线
  30.         End If
  31.         If Range("B" & i) = "" Then                                      '判断单元格是否为空
  32.             Range("B" & i).Borders(xlEdgeTop).LineStyle = xlNone         '抹去单元格顶边实线
  33.         Else
  34.             Range("B" & i).Borders(xlEdgeTop).LineStyle = xlContinuous   '在单元格顶边画实线
  35.             Range("B" & i).ShrinkToFit = True                            '文本收缩至可用列宽
  36.         End If
  37.     Next
  38.     Range("A4:D4").Borders(xlInsideVertical).LineStyle = xlContinuous    '单元格区域内部画竖线
  39.     Cells(r - 1, "D").Resize(2) = [{"笔/日/台";"元/月/台"}]                '纵向数组整体赋值
  40.     Cells(2, c - 1).Resize(3, 2) _
  41.                    .Value = [{"单位:笔,万元","";"","";"","平均值"}]       '二维数组整体赋值
  42.     Cells(4, c - 1) = c - 5 & "月"                                       '复原被二维数组赋值覆盖的月份
  43.     Cells(2, c - 1).Resize(1, 2) _
  44.          .HorizontalAlignment = xlHAlignCenterAcrossSelection            '跨列居中[见注释①]
  45.     [E4].Resize(1, c - 4).HorizontalAlignment = xlHAlignRight            '水平对齐属性=右对齐
  46.     '┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  47.     '下面統计有交易的设备台数和月收入合计
  48.     Cells(r + 2, "E").Resize(1, c - 4) = [E4].Resize(1, c - 4).Value     '复制表头月份至表尾隔一行的下方
  49.     m = Application.CountIf(Cells(r, "E").Resize(1, c - 5), ">0")        '统计透视表末行数值>0的月份个数
  50.     Cells(r + 2, c + 1) = "收入总计"
  51.     Cells(r + 3, "D").Resize(2) = [{"设备数量";"业务收入"}]                '单列纵向数组整体赋值
  52.     Cells(r + 4, "E") = "=Sumif($D5:$D" & r - 2 & _
  53.                        ",""业务收入""," & "E5:E" & r - 2 & ")"            '公式写入单元格[见注释③]
  54.     Cells(r + 3, "E") = "=Round(E" & r + 4 & "/E" & r & ",0)"            '计算设备台数
  55.     Cells(r + 3, "E").Resize(2, m).FillRight                             '首列两格公式向右自动填充
  56.     With Cells(r + 4, "E").Resize(1, m)                                  '指定需汇总的区域对象
  57.           Cells(r + 4, c) = Round(Application.Average(.Value))           '统计1至m月月均业务收入
  58.           Cells(r + 4, c + 1) = Application.Sum(.Value)                  '统计1至m月业务收入总计
  59.     End With
  60.     Cells(r + 3, c) = Round(Cells(r + 4, c) / Cells(r, c))               '统计设备平均台数
  61.     Cells(r + 4, c + 1).Interior.ColorIndex = 6                          '单元格底色置为黄色
  62.     Cells(r + 4, c + 1).Font.ColorIndex = 3                              '单元格文字置为红色
  63.     '┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  64.     With Cells(r + 2, "D").Resize(3, (c + 1) - 3)                        '指定需画表格线的单元格区域
  65.         .Borders.LineStyle = xlContinuous                                '单元区域(含内部)画横竖实线
  66.         .BorderAround Weight:=xlMedium, Color:=&HFF0000                  '单元区域外边框画蓝色中粗线
  67.     End With
  68.     Application.EnableEvents = True                                      '允许触发工作表改变事件
  69. End Sub
复制代码
注释①:xlHAlignCenterAcrossSelection 水平跨列居中常量(H是Horizontal的首字母),常量值=7
注释②:xlColorIndexAutomatic 外边框线条颜色常量,此常量为黑色默认值,但必须写上,不能忽略。
注释③:将Sumif公式依次写入相应月份的业务收入单元格,""业务收入""外套的双引号可将原双引号变成字符。

【说明】
[1]一维数组常量 Array(值1,值2,…,值n) 等,只可对行区域赋值,不能对列区域赋值。列区域赋值必须使用大括号再外套中括号的形式,形如 [{值1; 值2; …; 值n}]。
[2][]括号内只能是常量,不能是变量,如 E4:Q4 就属于单元格地址常量。代码中的[E4]与Range("E4")、Evaluate("E4")、Cells(4,"E")是等价的。[]是Evaluate()的简写形式,其参数只能有一个。但是,Evaluate的参数是字符串,而[]中的参数只能是单元格引用、公式或者值,不能是诸如"E4:Q4"这类带引号的单元格地址。例如:Evaluate("{1,2,3,4}")与[{1,2,3,4}]是等价的。单元格引用可以是多个单元格区域,如[A1:A10,A4:E6]就相当于Evaluate("A1:A10,A4:E6")。
[3]自动填充(.AutoFill)方法会触发工作表改变事件,因此该方法必须放在EnableEvents=False命令的后边,否则本过程将会被频繁调用,导致运行速度奇慢。
[4]在VBA与html中,颜色值字节顺序正好相反,如:html中红色是#ff0000,而VBA中则是&H0000ff。

【代码技巧】
[1]用方括号[]快捷引用单元格区域。比如:[E4]、Range("E4")、Cells(4,"E")、Evaluate("E4")等,这四种引用方式是等价的,但[E4]代码更简单。方括号[]是Application对象的Evaluate方法简写形式,这种形式非常适合引用一个固定的Range对象,不过,方括号[]内不能使用变量。方括号[]内的引用可以是多个单元格区域,如:[C5:K6,D5:D6]。
[2]用双重括号[{}]对数组变量整体赋值。比如:[A1:B4] = arr = [{1,"A";2,"B";3,"C";4,"D"}]。
[3]用空格+下划线( _)对超长代码行断行。但只能在运算符(&+-*/\)之前或之后、逗号点号等号(.,=)之前或之后断行,不能在冒号+等号(:=)之间断行,不能在变量名或关键字中间断行,不能在引号括起的字符串中间断行,不能在常量数组[{…}]中间断行。断行后应尽量考虑运算符或括号与上一行对齐,以使代码易于阅读。
[4]用With语句指定单元格对象,可以精简VBA代码,或缩减代码行长度。
[5]引用工作表函数的两种方法:
① With Cells(r, "E").Resize(1, c - 5)                                   '指定需条件计数的单元格区域
            m = Evaluate("Countif(" & .Address & ","">0"")")       '统计透视表末行数值>0的月份个数
     End With
② m = Application.CountIf(Cells(r, "E").Resize(1, c - 5), ">0")
    两种方法的区别是:第一种,函数Countif的第一参数是地址类型的字符串,要通过函数Evaluate才能将其转换为单元格引用 (注意:所谓单元格引用,其实就是引用对象);第二种,函数Countif的第一参数直接就是引用区域对象。
[6]将Sumif函数公式依次写入相应月份的业务收入单元格,""业务收入""外套的双引号可将原双引号变成字符。写入的公式还可以换成 "=SUMPRODUCT(" & Cells(5, i).Resize(r - 6).Address & "*(1-Mod(Row(5:" & r - 2 & "),2)))"。
[7]几种对象表示方法的区别:
① 对象Range("C5:Q6,D5:D6")与对象Range(Cells(5,"C").Resize(2,15).Address & "," & Cells(5,"D").Resize(2).Address),这两种表示法是等价的,括号内的参数都只有一个,但对各单元格区域的操作是独立的。
② 对象Range("C5:Q6","D5:D6")与对象Range(Cells(5,"C").Resize(2,15),Cells(5,"D").Resize(2)),这两种表示法也是等价的,括号内是两个参数,对该对象进行操作时,是将包含两个单元格区域在内的最小区域作为一个整体进行的。
③ 用Union方法连接起来的Union([C5:Q6],[D5:D6])对象,操作效果与前面两种又有不同,当一个区域包含在另一个区域中时,对该对象的操作,是对两个区域合并之后的整体区域进行的,当不完全包含时,操作是各自独立的。
[8]用自动填充方法代替For循环。一般对单元格区域的重复操作,往往会想到for语句,但是for语句因频繁调用对象,需要消耗大量资源,效率很低,其实,如果使用AutoFill方法或FillUp/FillDown/FillLeft/FillRight方法,可一次性实现for语句的循环调用功能,运行速度很快。


TA的精华主题

TA的得分主题

发表于 2023-4-18 15:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-4-27 11:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 vistababy 于 2023-4-27 11:33 编辑

好复杂哦。初学者完全看不懂。没有几年时间,写不出这些
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-27 19:26 , Processed in 0.044423 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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