一、代码优化的一些方法

  • 尽量减少在循环中遍历调用对象,公式计算
  • (操作VBA代码若出现屏幕闪屏,会拖慢运行速度),可以禁止屏幕闪屏。多用在操作工作表/薄,单元格的时候。

    Application.ScreenUpdating = False

  • 需声明变量类型,减少工作表函数的使用。(多写循环代替工作表函数)
  • 减少VBA函数的使用,如int(10000/3) 可以用10000 \ 3 替代
  • 单元格填充数据前先清空单元格数据
  • 批量操作及减少循环次数
  • 巧妙填充公式,如单元格的filldown方法向下复制,避开循环

    cell(2,a) =  " = b2*c2"

    [a2:a100].FillDown

二、关于其他操作

1、字体及边框设置

  1. Public Sub RngFont()
  2. With Range("d3").Font
  3.  
  4. .Name = "华文彩云"
  5. .FontStyle = "Bold"
  6. .Size = 28
  7. .ColorIndex = 3
  8. .Underline = 5
  9.  
  10. End With
  11. With Range("d3").Interior
  12. .Pattern = xlPatternCrissCross '设置内部图案为十字图案
  13. .PatternColorIndex = 6
  14. End With
  15.  
  16. End Sub

2、单元格区域设置样式,borders方法,BorderAround 用于区域最外边框设置

  1. Sub AddVBorders()
  2. Dim rng As Range
  3. Set rng = Range("a5:c9")
  4. With rng.Borders
  5. .LineStyle = xlContinuous
  6. .Weight = xlThin
  7. .ColorIndex = 5
  8. End With
  9. rng.BorderAround xlContinuous, xlMedium, 5
  10. Set rng = Nothing
  11.  
  12. End Sub

 BorderAround 后参数:

 

区域中多格式:

  1. Sub bordersDemo()
  2.  
  3. Dim rng As Range
  4. Set rng = Range("e5:g9")
  5. With rng.Borders(xlInsideHorizontal)
  6. .LineStyle = xlDot
  7. .Weight = xlThin
  8. .ColorIndex = 5
  9.  
  10. End With
  11. With rng.Borders(xlInsideVertical)
  12. .LineStyle = xlContinuous
  13. .Weight = xlThin
  14. .ColorIndex = 5
  15.  
  16. End With
  17. rng.BorderAround xlContinuous, xlMedium, 5
  18.  
  19. Set rng = Nothing
  20.  
  21. End Sub

3、行高、列宽设置 (磅或厘米)

  1. Sub RngToPoints()
  2. With Range("i14")
  3. .RowHeight = Application.CentimetersToPoints(1.2)
  4. .ColumnWidth = Application.CentimetersToPoints(0.8)
  5.  
  6. End With
  7. With Range("j15")
  8. .RowHeight = Application.InchesToPoints(0.5)
  9. .ColumnWidth = Application.InchesToPoints(0.2)
  10.  
  11. End With
  12.  
  13. End Sub

 样式如下:

4、单元格数据有效性设置 Validation对象add方法

  1. Sub Validation()
  2.  
  3. '建立数据有效性
  4. With Range("a1:a3").Validation
  5. .Delete
  6. .Add Type:=xlValidateList, _
  7. Operator:=xlBetween, _
  8. Formula1:="1,2,3,4,5,6,7" 'formula1,formula2可设置有效性公式
  9.  
  10. End With
  11.  
  12. '判断数据有效性
  13. On Error GoTo Line
  14. If Range("a1").Validation.Type >= 0 Then
  15. MsgBox "have validation"
  16. Exit Sub
  17. End If
  18. Line:
  19. MsgBox "none"
  20. End Sub

 建立动态数据有效性:

  1. Private Sub worksheet_Selectionchange(ByVal target As Range)
  2. If target.Column = 1 And target.Count = 1 And target.Row > 1 Then
  3. With target.Validation
  4. .Delete
  5. .Add Type:=xlValidateList, _
  6. Operator:=xlBetween, _
  7. Formula1:="主机,显示器"
  8.  
  9. End With
  10. End If
  11. If target.Column = 2 Then
  12. Application.SendKeys "%{down}" ' 点击单元格自动下拉展示所有选项
  13. End If
  14. End Sub
  15.  
  16. Private Sub worksheet_change(ByVal target As Range)
  17. If target.Column = 1 And target.Row > 1 And target.Count = 1 Then
  18. With target.Offset(0, 1).Validation
  19. .Delete
  20. Select Case target
  21. Case "主机"
  22. .Add Type:=xlValidateList, _
  23. AlertStyle:=xlValidAlertStop, _
  24. Operator:=xlBetween, _
  25. Formula1:="z286,z386,z486,z586"
  26. Case "显示器"
  27. .Add Type:=xlValidateList, _
  28. AlertStyle:=xlValidAlertStop, _
  29. Operator:=xlBetween, _
  30. Formula1:="三星1,飞利浦1,三星2,飞利浦2"
  31. End Select
  32. End With
  33. End If
  34. End Sub

 

效果:

5、检测选择区域是否含有公式(Hasformula函数),并输出公式位置

  1. Private Sub CommandButton1_Click()
  2. Select Case Selection.HasFormula
  3. Case True
  4. MsgBox "公式单元格"
  5. Case False
  6. MsgBox "非公式单元格"
  7. Case Else
  8. MsgBox "公式位置" & Selection.SpecialCells(xlCellTypeFormulas, 23).Address(0, 0)
  9. End Select
  10. End Sub

若需要返回公式引用的单元格区域则使用公式单元格Precedents属性,exp:  range("c1").Precedents.address(0,0)

6、判断是否为空

1)逻辑值判断 - 空时返回True

  • range("a1")=""
  • len(range("a1")) = 0
  • VBA.IsEmpty(range("a1"))

2)值判断

  • VBA.TypeName(range("a1").Value)  值返回为Empty时为空

7、判断是否为数字、文本、错误值、数组、日期

1)逻辑值判断

  • VBA.IsNumeric(range("c1"))
  • Application.WorkSheetFunction.IsNumber(range("c1"))

2) 值判断,不是返回Error--均用于判断数字和错误值

  • VBA.TypeName(range("a1").Value)

3)判断文本

  • Application.IsText(range("a1"))

4)判断是否错误值

  • VBA.IsError(range("a1").value)

5)数组判断

  • VBA.IsArray(arr)

6)日期判断

  • VBA.IsDate(range("a1"))

8、数据类型转换

类型装换函数:CBool,CByte,Ccur,CDate,CDbl,CDec,CInt,CLng,CSng,CStr,CVar

format( , ) 函数可将一种类型格式化显示为数字或文本类型

exp: format(234.5678,"0.00")

9、日期时间常用处理方式

1)常用转换:

  • format(now,"yyyy-mm-dd")           如2002-12-11
  • format(now,"yyyy年mm月dd天")   
  • format(now,"yyyy年mm月dd天 h:mm:ss")
  • format(now,"d-mmm-yy")      英文日期如19-Oct-02
  • format(now,"d-mmmm-yy")   英文日期月份完整拼写 如19-October-02
  • format(now,"aaaa")        中文日期星期几      如星期三
  • format(now,"ddd")    英文日期星期几(简写)  如Sat
  • format(now,"dddd")       英文日期星期几(完整写法) 如Saturday

2)日期时间的连接

日期连接 VBA.DateSerial(2011,10,1)

时间连接 VBA.TimeSerial(1,2,1)

3)  日期时间返回 year(now)

Year()函数、month()、day()、hour()、VBA.,Minute()、second()

4) 日期时间计算datediff,dateadd

datediff("yyyy",d1,d2)

datediff("d",d1,d2) 等等。。注意datediff("q",d1,d2)  q为计算季度差,对年计算时需要参数为4个yyyy,计算分钟时参数为n dateadd("n",10,d1)

dateadd("d",10,d1) 加10天 等等 。。 注意计算分钟时参数为n dateadd("n",10,d1),对年计算时需要参数为4个yyyy

5)制作一个简单计时器(application 的ontime函数)案例:注意设置doevents的意义为当前程序运行时允许其他程序运行,当公共变量k值改变则程序停止。

  1. Option Explicit
  2. Dim k
  3. Public Sub clock()
  4.  
  5. Dim x
  6. If k = 1 Then
  7. k = 0
  8. End
  9. End If
  10. With Range("c5").Font
  11. .Name = "Times New Roman"
  12. .FontStyle = "bold"
  13. .Size = 28
  14. .ColorIndex = 3
  15. End With
  16. With Range("c5").Interior
  17. .Pattern = xlPatternCrissCross
  18. .PatternColorIndex = 6
  19. End With
  20.  
  21. Range("c5") = Format(Now, "h:mm:ss")
  22. Application.OnTime Now + TimeValue("00:00:01"), "clock"
  23.  
  24. x = DoEvents '此处设置终止
  25.  
  26. End Sub
  27.  
  28. Sub stopclock()
  29. k = 1
  30. End Sub
  31.  
  32. Sub startclock()
  33. Call clock
  34. End Sub

 效果:

10、随机抽取数据(换位)

案例1:

  1. Sub rndSelect()
  2. Dim arr
  3. Dim x, num, k As Integer, sr As String
  4. Range("c1:c10") = ""
  5. Range("a1:a10") = Application.Transpose(Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))
  6.  
  7. For x = 1 To 10
  8. num = (Rnd() * (10 - x) + 1) \ 1 '1 表示除1取整
  9. Range("a1:a" & (10 - x + 1)).Interior.ColorIndex = xlNone
  10. Range("a" & num).Interior.ColorIndex = 6
  11. Range("c" & x) = Range("a" & num)
  12.  
  13. sr = Range("a" & num)
  14. Range("a" & num) = Range("a" & (10 - x + 1))
  15. Range("a" & (10 - x + 1)) = sr
  16. Range("a" & (10 - x + 1)).Interior.ColorIndex = 3
  17. Next x
  18. End Sub

  

案例2 : A列20000行数据A1,A2....A20000

不重复随机抽取的三种方式:1、字典 2、换位法(换取的A列数据为字符串)3、换位法优化(添加一维数组辅助交换,索引为1~20000的数组,值为对应的索引,此时交换的值为integer型)

  1. Sub rndict()
  2. '字典法
  3. Dim d As Object
  4. Set d = CreateObject("scripting.dictionary")
  5. Dim arr, num As Integer, x As Integer, arr1(1 To 20000, 1 To 1) As String, t
  6.  
  7. t = Timer
  8.  
  9. arr = Range("a1:a20000")
  10. For x = 1 To 20000
  11. 100:
  12. num = Rnd() * (20000 - 1) + 1
  13. If d.exists(num) Then
  14. GoTo 100
  15. Else
  16. d(num) = ""
  17. arr1(x, 1) = arr(num, 1)
  18. End If
  19. Next x
  20. Range("c1:c20000") = ""
  21. Range("c1:c20000") = arr1
  22. [d65535].End(xlUp).Offset(1, 0) = Timer - t
  23.  
  24. End Sub
  25.  
  26. Sub rndSel()
  27. ' 换位法,换字符串效率相对低
  28. Dim arr
  29. Dim x, num As Integer, arr1(1 To 20000, 1 To 1), sr As String, t
  30. t = Timer
  31. arr = Range("a1:a20000")
  32. For x = 1 To UBound(arr)
  33. num = (Rnd() * (20000 - x) + 1) \ 1
  34. arr1(x, 1) = arr(num, 1)
  35.  
  36. sr = arr(num, 1)
  37. arr(num, 1) = arr(20000 - x + 1, 1)
  38. arr(20000 - x + 1, 1) = sr
  39. Next x
  40.  
  41. Range("c1:c20000") = ""
  42. Range("c1:c20000") = arr1
  43. [d65535].End(xlUp).Offset(1, 0) = Timer - t
  44.  
  45. End Sub
  46.  
  47. Sub rndsel2()
  48. '换位法,添加辅助数字列,换数字 提高运行效率
  49. Dim arr
  50. Dim arr1(1 To 20000, 1 To 1), sr As String
  51. Dim x, num, arr2(1 To 20000) As Integer, t
  52. t = Timer
  53. arr = Range("a1:a20000")
  54. For x = 1 To 20000
  55. arr2(x) = x
  56. Next x
  57. For x = 1 To UBound(arr)
  58. num = (Rnd() * (20000 - x) + 1)
  59. arr1(x, 1) = arr(arr2(num), 1)
  60.  
  61. sr = arr2(num)
  62. arr2(num) = arr2(20000 - x + 1)
  63. arr2(20000 - x + 1) = sr
  64. Next x
  65. Range("c1:c20000") = ""
  66. Range("c1:c20000") = arr1
  67. [d65535].End(xlUp).Offset(1, 0) = Timer - t
  68. End Sub

 效果如下:

明显发现采用第三种方式效率更高。

VBA代码优化及其他设置操作的更多相关文章

  1. 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Application Data 中的媒体

    [源码下载] 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Ap ...

  2. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  3. .NET Core程序中,如何获取和设置操作系统环境变量的值

    有时候我们在.NET Core程序中需要获取和设置操作系统环境变量的值.本文演示如何使用Environment.GetEnvironmentVariable和Environment.SetEnviro ...

  4. 【转载】PC端微信设置操作快捷键方法

    在电脑上使用微信的时候,有时候我们需要自定义PC版微信快捷键操作,支持自定义微信快捷键设置的有:发送消息快捷键.截屏快捷键.打开微信快捷键以及检测快捷键热键是否与其他软件设置冲突.并且自定义设置PC微 ...

  5. idea--忽略隐藏文件、文件夹的设置操作

    文章由来 公司同事在群里问了个问题,如下: 为了大家看清,将图特意贴出来: 这人还删除idae重装了下,哈哈,才到群里问的. 解决思路(按顺序) 1.我让他直接拉会,共享桌面我给看了下,首先是open ...

  6. pb数据窗口设置操作

    1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Pro ...

  7. 011-MySQL Query Cache 查询缓存设置操作

    一.概述 MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, ...

  8. pb笔记之数据窗口设置操作

    1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Pro ...

  9. Linux CentOS 7 防火墙与端口设置操作

    CentOS升级到7之后用firewall代替了iptables来设置Linux端口, 下面是具体的设置方法: []:选填 <>:必填 [<zone>]:作用域(block.d ...

随机推荐

  1. Linux下如何查找sqlnet.ora 和listener.ora 和tnsnames.ora 配置文件的目录

    1.首先切换到oracle 用户下 使用env 查看数据库配置文件信息 2.然后找到LD_LIBRARY_PATH=/home/opt/oracle/product/11.2.0.4/db_1 (配置 ...

  2. dubbo 相关面试题 有用(转)

    调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...

  3. 023、MySQL取文本长度取字符串长度

    #取文本长度,一个文字算1长度 SELECT CHAR_LENGTH('田攀520'); #UTF-8的数据库,值为5 #取文本长度,汉字算多个字符,数字和英文算一个字符 SELECT LENGTH( ...

  4. ACM-生化武器

    Description在一个封闭的房间里,gogo给大家表演了他的屁遁术,人果然一下没影了,但是他留下的“生化武器”,却以每秒1米的速度向上下左右扩散出去.为了知道自己会不会被“毒”到,你果断写了个算 ...

  5. printf的封装与实现

    1 UART通信协议 1.1 UART通信的物理连接 图1 UART的物理连接 1.2 逻辑电平 用电平表示逻辑1和逻辑0,逻辑1和逻辑0用来组织计算机层面的数据. 1.3 电平标准 根据通讯使用的电 ...

  6. Codeforces 1111C Creative Snap分治+贪心

    Creative Snap C. Creative Snap time limit per test 1 second memory limit per test 256 megabytes inpu ...

  7. HIVE ROW_NUMBER()函数去重

    SELECT * FROM( SELECT *,ROW_NUMBER() OVER(PARTITION BY a.claimno ORDER BY b.financiancedate DESC)  n ...

  8. 实验吧-密码学-Fair-Play(Playfair解密)

    这个题是Playfair解密. Playfair解密算法首先将密钥填写在一个5*5的矩阵中(去Q留Z),矩阵中其它未用到的字母按顺序填在矩阵剩余位置中,根据替换矩阵由密文得到明文. 对密文解密规则如下 ...

  9. UVA - 10689 Yet another Number Sequence (矩阵快速幂求斐波那契)

    题意:已知f(0) = a,f(1) = b,f(n) = f(n − 1) + f(n − 2), n > 1,求f(n)的后m位数. 分析:n最大为109,矩阵快速幂求解,复杂度log2(1 ...

  10. 电脑使用热键时是否需按住Fn键相关说明

    ThinkPad E系列机型 方法一: 在开机出现ThinkPad标志时,连续点F1(若无反应,请尝试Fn+F1)进入BIOS设置. 在BIOS中,依次选择Config---Keyboard/Mous ...