Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5048|回复: 5

[VBA] 021-程序兼容多版本-疑难千寻千解丛书(VBA)

[复制链接]
发表于 2011-2-7 14:57 | 显示全部楼层 |阅读模式
ET疑难千寻千解丛书之EXCEL2010编程与实践
罗刚君 章兰新 黄朝阳 编著

疑难21
如何让程序兼容Excel多版本
Excel目前最常用的3个版本是Excel 200320072010,如何让自己的程序可以兼容多个版本呢?例如Excel新版本相对2003增加了行列数、增加了Sort对象强化排序、增加了去重复值功能、去除了FileSearch对象、对单元格颜色大大改进等,如何让程序在Excel 200320072010中都可以顺利执行呢?
è解决方案
为了体现兼容性,通常采用3种思路:一是让程序自动判断Excel版本变化后的实际数据,例如行列数变化;二是写两段代码,让程序根据当前Excel版本调用对应的一段代码;三是使用低版本的方式,因为通常低版本Excel无法使用高版本Excel的部分功能,但高版本可以调用低版本的代码。
í操作方法
步骤1
对于行列数不同引起的兼容性问题,可以利用动态引用的方式处理。Excel 2003及早期版本是65536´256列,Excel 200720101048576´16384列,那么在引用最后一个非空行时,通常采用[a65536].end(xlup)[a1048576].end(xlup)。然而,两种引用方式都不能在多个版本中兼容,正确的引用方式如下。
cells(rows.Count,1)第一列最后一个非空单元格。其中rows.Count用于计算总行数,可以随Excel的版本变化而变化,相对于655361048576有更大的通用性。
cells(1,columns.Count)第一行最后一个非空单元格。其优点同上。
步骤2
对于排序,Excel 2003及早期版本使用Sort方法,而从Excel 2007开始增加了一个Sort对象。Sort对象比Sort方法功能更强大,但无法在Excel 2003及早期版本中使用。所以为了兼容性,可以如下方式处理:

  1. Sub 排序()  '根据版本号执行不同代码
  2.   Dim rng As Range
  3.   Set rng = ActiveSheet.UsedRange  '将当前表已用区域赋予变量rng
  4.   '根据版本号执行对应的排序代码,Excel 2007的版本号是12,Excel 2010的版本号是14
  5.   If Application.Version * 1 < 12 Then GoTo line1 Else GoTo line2
  6. line1:    '2007以前的版本使用
  7.   rng.Offset(1, 0).Sort Key1:=Range("B2"), Order1:=xlAscending, Header:
  8.   =xlGuess, _OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom,
  9.   DataOption1:=xlSortNormal
  10.   Exit Sub
  11. line2:    'Excel 2007和2010专用
  12.   With ActiveSheet.Sort  '利用排序对象进行排序
  13.     .SortFields.Clear  '清除原有的SortFields对象,该对象存储了排序状态
  14.     .SortFields.Add Key:=Range("B2"), SortOn:=xlSortOnValues, Order:=
  15.     xlAscending, DataOption:=xlSortNormal  '添加排序条件
  16.     .SetRange rng  '设置排序的区域为rng
  17.     .Orientation = xlTopToBottom  '排序方向为纵向
  18.     .Apply    '根据当前应用的排序状态对区域进行排序
  19.   End With
  20. End Sub

复制代码
步骤3
对于查找重复值,Excel 20072010有专用的RemoveDuplicates方法实现,而Excel 2003及更早的版本只能通过高级筛选完成。那么为了通用性,同样可以采取步骤2相同的思路。代码如下:

  1. Sub 消除重复值()   '根据版本号执行不同代码
  2.   Dim rng As Range
  3.   Set rng = Range([a1], Cells(Rows.Count, 1).End(xlUp)) '将A列所有已用单元
  4.   格赋值给变量rng
  5.   If Application.Version * 1 < 12 Then GoTo line1 Else GoTo line2
  6.   '根据版本号执行对应的排序代码
  7. line1: '2007以前的版本使用(虽然2007和2010也可以使用,但效率不如Remove Duplicates方法)
  8.   With rng
  9.    '高级筛选不重复值,将它保存在最后一列
  10.     .AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Cells(1,
  11.     Columns.Count), Unique:=True
  12.     .Clear  '清除原有数据
  13.     Cells(1, Columns.Count).CurrentRegion.Copy .Item(1)  
  14.     '将筛选后的不重复值复制到A列
  15.     Cells(1, Columns.Count).CurrentRegion.Delete  '清除辅助区数据
  16.   End With
  17.   Exit Sub  '退出过程,避免执行Line2
  18. line2:    'Excel 2007和2010专用
  19.   Intersect(rng, rng.Offset(1, 0)).RemoveDuplicates Columns:=1, Header:
  20.   =xlNo '取不重复值
  21. End Sub
复制代码
步骤4
Excel 2007
以前的版本有FileSearch对象,可以方便地进行文件查找;Excel 20072010删除了该功能,但可以利用DIR实现相同功能。本例通过DIR方法完成文件查找,替代FileSearch对象,且代码在所有版本中通用:

  1. Sub 查找文件()  'DIR替代FileSearch对象实现文件查找
  2.     Dim 路径 As String, 文件对象 As String, 文件名称 As String
  3. 路径 = "D:"  '搜索D盘文件
  4. 文件对象 = "*.*"  '搜索所有文件
  5. 文件名称 = Dir(路径& "" &文件对象)  '获取文件名
  6.     Do  '开始循环,直到
  7.     Range("A" & i + 1) =文件名称  '将找到的文件名写入A列单元格
  8.     文件名称= Dir  '查找其他文件
  9.          i = i + 1
  10.     Loop Until 文件名称 = ""
  11. End Sub

复制代码
步骤5
Excel 2007
开始对单元格的可用颜色从56种升级到43亿种,在Excel 2003中可以使用ColorIndex来表示所有颜色值,但对于Excel 20072010则远远不足。如果利用ColorIndex获取或者设置单元格背景,大部分情况下会产生颜色偏差。例如将A1:A5的背色复制到B1:B5使用以下代码在Excel中完全可行,但在新版中则部分正确、部分错误,如所示。

  1. Sub 复制颜色()
  2.     For i = 1 To 5
  3.         Cells(i, 2).Interior.ColorIndex = Cells(i, 1).Interior.ColorIndex
  4.     Next
  5. End Sub
复制代码


=============================
上摘自《EXCEL2010编程与实践》

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2011-2-7 14:58 | 显示全部楼层
回复

使用道具 举报

发表于 2011-4-9 21:23 | 显示全部楼层
回复

使用道具 举报

发表于 2012-6-9 22:36 | 显示全部楼层
这个只能叫版本优化,说成版本兼容不妥吧
Sort对象 2007中才有,Sub 排序()  的代码在2003是无法运行的,会提示sort对象错误,在运行前无法通过编译的。
VBA的条件编译功能太弱,如能用条件编译方法解决可能不错

回复

使用道具 举报

发表于 2013-7-28 21:17 | 显示全部楼层
支持小妖 呵呵
回复

使用道具 举报

发表于 2013-7-31 20:41 | 显示全部楼层
精典!楼主真行!赞一个!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-1 21:22 , Processed in 0.116706 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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