ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

VBA常用技巧代码解析

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-2-16 20:23 | 显示全部楼层
本帖已被收录到知识树中,索引项:开发帮助和教程
基础太差,每天只能读一点点.
可是读后又如风吹水.....
努力吧,学总比不学强.
谢谢袁版.

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-16 20:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

第2部分Worksheet(工作表)对象

技巧30         工作表中一次插入多行
       在工作表的中插入多行空行,需要使用Insert方法,如下面的代码所示。
  1. #001  Sub InSertRows_1()
  2. #002      Dim i As Integer
  3. #003      For i = 1 To 3
  4. #004          Sheet1.Rows(3).Insert
  5. #005      Next
  6. #006  End Sub
复制代码
代码解析:
I       nSertRows_1过程使用Insert方法在如图所示的数据区域的第2行和第3行之间插入三行空行。
数据区域.JPG
       Insert方法应用于Range对象时在工作表或宏表中插入一个单元格或单元格区域,其他单元格作相应移位以腾出空间,语法如下:
expression.Insert(Shift, CopyOrigin)
       参数expression是必需的,该表达式返回一个Range对象。
       参数Shift是可选的,指定单元格的移动方向。可为以下XlInsertShiftDirection常量之一:xlShiftToRight或xlShiftDown。如果省略本参数,Microsoft Excel将依据该区域的形状决定移动方向。
       参数CopyOrigin是可选的,复制的起点。
       还可以使用引用多行的方法,如下面的代码所示。
  1. #001  Sub InSertRows_2()
  2. #002      Sheet2.Range("A3").EntireRow.Resize(3).Insert
  3. #003  End Sub
复制代码
代码解析:
       InSertRows_2过程通过引用多行区域的方法实现一次插入多行。
       第2行代码中的Range(“A3”).EntireRow属性返回Range(“A3”)单元格所在的一整行,然后使用Resize属性调整行数后插入三行空行。
       也可以直接指定相应行再调整行数后插入空行,如下面的示例代码:
  1. #001  Sub InSertRows_3()
  2. #002      Sheet3.Rows(3).Resize(3).Insert
  3. #003  End Sub
复制代码
运行以上过程,工作表中如图所示。
插入三行空行.jpg

[ 本帖最后由 yuanzhuping 于 2009-2-16 22:48 编辑 ]

技巧30 工作表中一次插入多行.rar

7.05 KB, 下载次数: 2105

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-16 21:42 | 显示全部楼层

第2部分Worksheet(工作表)对象

技巧31         删除工作表中的空行
       如果需要删除如图所示的工作表中所有的空行,可以使用下面的代码。
Snap7.jpg
  1. #001  Sub DelBlankRow()
  2. #002      Dim rRow As Long
  3. #003      Dim LRow As Long
  4. #004      Dim i As Long
  5. #005      rRow = Sheet1.UsedRange.Row
  6. #006      LRow = rRow + Sheet1.UsedRange.Rows.Count - 1
  7. #007      For i = LRow To rRow Step -1
  8. #008          If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then
  9. #009              Rows(i).Delete
  10. #010          End If
  11. #011      Next
  12. #012  End Sub
复制代码
代码解析:
       DelBlankRow过程删除工作表中已使用的区域的所有空行。
       第5行代码获得工作表中已使用区域的首行行号,其中使用UsedRange属性返回工作表中已使用的区域。
       第6行代码获得工作表中已使用区域的最后一行行号。
       第7行到第11行代码从最大行数至最小行数循环判断指定行是否为空行,若为空行则删除该行。
       注意 此处一定要从最大行数至最小行数开始循环判断,因为如果工作表中存在两行及两行以上的相邻空行,从最小行数开始循环删除的话,当第一行空行被删除后,被删除行下面的一行会往上移位,而此时For...Next循环的计数器已经加1,所以会出现漏删除的现象。
       其中第8、9行代码使用工作表CountA函数判断当前行已使用单元格的数量,如果为零说明此行是空行则使用Delete删除。
       应用于Range对象的Delete方法删除对象,语法如下:
expression.Delete(Shift)
       参数expression是必需的,返回一个Range对象。
       参数Shift是可选的,指定删除单元格时替补单元格的移位方式。可为以下 XlDeleteShiftDirection常量之一:xlShiftToLeft或xlShiftUp。如果省略该参数,则Microsoft Excel将根据区域的图形决定移位方式。
       运行DelBlankRow过程工作表区域如图所示。
Snap8.jpg

[ 本帖最后由 yuanzhuping 于 2009-2-16 23:18 编辑 ]

技巧31 删除工作表中的空行.rar

7.38 KB, 下载次数: 2313

TA的精华主题

TA的得分主题

发表于 2009-2-16 22:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
从头开始学VBA

TA的精华主题

TA的得分主题

发表于 2009-2-16 23:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-2-17 03:22 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-17 08:29 | 显示全部楼层

第2部分Worksheet(工作表)对象

技巧32         删除工作表的重复行
       在实际应用中,可能需要删除如图所示的工作表中A列的重复内容而只保留一行,那么可以借助工作表CountIf函数来完成,如下面的代码所示。
Snap1.jpg
  1. #001  Sub DeleteRow()
  2. #002      Dim R As Integer
  3. #003      Dim i As Integer
  4. #004      With Sheet1
  5. #005          R = .[a65536].End(xlUp).Row
  6. #006          For i = R To 1 Step -1
  7. #007              If WorksheetFunction.CountIf(.Columns(1), .Cells(i, 1)) > 1 Then
  8. #008                  .Rows(i).Delete
  9. #009              End If
  10. #010          Next
  11. #011      End With
  12. #012  End Sub
复制代码
代码解析:
       DeleteRow过程删除工作表A列重复单元格所在的整行内容,只保留一行。
       第5行代码取得工作表中A列的最后一个非空单元格的行号,关于Range对象的End属性请参阅技巧3 。
       第6行到第10行代码从最大行数至最小行数循环判断A列单元格内容是否重复并删除重复单元格所在的整行。和技巧32 一样,此处For...Next循环也要从最大行数至最小行数开始循环判断,否则可能会删除不净。其中第7行代码使用工作表CountIf函数判断单元格内容是否重复,如果重复则删除该单元格所在的行。
       运行DeleteRow过程工作表区域如图所示。
Snap2.jpg

技巧32 删除工作表的重复行.rar

7.27 KB, 下载次数: 2176

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-17 08:31 | 显示全部楼层

第2部分Worksheet(工作表)对象

技巧33         定位删除特定内容所在的行
       如果需要删除如图所示的工作表区域中特定内容所在的行,可以使用定位的方法快速删除,无需使用For...Next循环对单元格逐个进行判断。
Snap3.jpg
示例代码如下:
  1. #001  Sub SpecialDelete()
  2. #002      Dim R As Integer
  3. #003      With Sheet1
  4. #004          R = .Range("a65536").End(xlUp).Row
  5. #005          .Range("a2:a" & R).Replace "Excel", "", 2
  6. #006          .Columns(1).SpecialCells(4).EntireRow.Delete
  7. #007      End With
  8. #008  End Sub
复制代码
代码解析:
       SpecialDelete过程删除工作表A列单元格中显示为“Excel”的行。
       第5行代码使用Replace方法将工作表A列中显示为“Excel”的单元格内容替换成空白。关于Replace方法请参阅技巧6 。
       第6行代码使用SpecialCells方法定位到工作表A列中所有的空单元格,使用Range对象的EntireRow属性返回其所在的整个行一次性删除。关于SpecialCells方法请参阅技巧4 。
       运行SpecialDelete过程工作表区域如图所示。
Snap4.jpg

[ 本帖最后由 yuanzhuping 于 2009-2-17 19:52 编辑 ]

技巧33 定位删除特定内容所在的行.rar

5.58 KB, 下载次数: 2039

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-17 08:56 | 显示全部楼层

第2部分Worksheet(工作表)对象

技巧34         判断是否选中整行
       通过当前选择的单元格区域的单元格数目与行数或列数相比较,判断用户是否选中了整行或整列,如下面的代码所示。
  1. #001  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. #002      If Target.Rows.Count = 1 Then
  3. #003          If Target.Columns.Count = 256 Then
  4. #004              MsgBox "您选中了整行,当前行号" & Target.Row
  5. #005          End If
  6. #006      End If
  7. #007  End Sub
复制代码
代码解析:
       工作表的SelectionChange事件,判断用户是否选中了工作表中一整行单元格区域。
       第2行代码中的Target.Rows.Count返回目标区域的行数,确定用户当前选择区域的总行数是否为1。
       第3行代码中的Target.Columns.Count返回目标区域的列数,确定用户当前选择区域总列数是否为256。
       第4行代码当用户选中一整行时显示一个消息框,提示用户当前选择的行号,如图所示。
Snap5.jpg

技巧34 判断是否选中整行.rar

5.33 KB, 下载次数: 1733

TA的精华主题

TA的得分主题

发表于 2009-2-17 09:27 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 01:34 , Processed in 0.040204 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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