ET疑难千寻千解丛书之EXCEL2010编程与实践 罗刚君 章兰新 黄朝阳 编著
疑难19
程序的兼容性体现在哪些方面 如果编写自定义函数或者开发的插件发送给不确定用户使用,且不能限制其使用指定的Office版本和Windows版本,那么就一定存在代码兼容性问题。通常兼容性问题体现在哪些方面呢? è解决方案 操作系统不同、Office版本不同将带来兼容性问题,不同用户处理的对象不同,例如图形对象个数不同、单元格区域大小不同等,在使用相同代码处理不同对象时也一定会产生兼容性问题。本例从三方面进行分析。 í操作方法 操作系统对VBA的影响
不同操作系统对VBA是有影响的。例如Windows 2000、XP和7中API函数有部分不同;由于桌面主题不同造成对所有窗口的宽度也不同,那么设计需要严格计算边距与高度的窗体时就会产生偏差;部分程序的参数也不同,例如Windows 2000中DOS命令的“CD”命令不支持“CD/D”这个参数,而XP开始,以后的各种操作系统都支持;最后是Windows中一些默认程序也有变化。例如Windows 2000和XP都有“Outlook Express”,而Vista和Windows 7中删除了该程序,所以操作系统的版本也对VBA调用邮件程序有着极大的影响。 如果需要在执行主体程序前判断当前操作系统的版本,以当前常用的四大操作系统Windows 2000、XP、Vista和7为例,判断操作系统的方式如下:
- Sub 当前系统()
- MsgBox WorksheetFunction.HLookup(Split(Application.OperatingSystem, " ")
- (UBound(Split(Application.OperatingSystem, " "))), [{"5.0","5.01","6.0","6.01";"WIN 2000","WIN XP","VISTA","WIN7"}], 2, 0)
- End Sub
复制代码执行程序后,将在对话框中告知当前操作系统版本名称。Windows 2000、XP、Vista和7的版本号分别对应5.0、5.01、6.0、6.01。 而对于Office版本不同带来的兼容性问题则远远多于Windows版本带来的兼容性问题。例如: 工作表函数不同:每次版本更新都会加入新的函数。当VBA中使用该函数后,程序在低版本中就无法运行。 单元格行列数不同:Excel 2007以前的版本有65536行´256列,而Excel 2007和2010有1048576行´16384列。调用单元格时会产生兼容性问题。 VBA中的对象有增减:例如Excel 2007开始增加了图标集、色阶条件格式,VBA中也相应地增加对象和方法。那么调用这些新对象的代码在2007以前的版本一定会出错;而Excel 2003所具备的FileSearch属性也从Excel 2007版开始删除了,通常在新版中利用DIR方法来替代FileSearch进行文件搜索。 对部分内置方法进行修改、完善:例如Excel 2007开始对早期版本的排序Sort做了修改,新版的Sort和早期版本完全不兼容;对于定义名称Name也有不同的处理方式,从Excel 2007开始可以对名称添加备注,而早期版本无此属性。 颜色不同:Excel 2003的单个工作簿可以使用的颜色数量是56种(索引颜色),而Excel 2007开始采用43亿种(32位真彩色)。对颜色的处理,在Excel 2003中通常采用ColorIndex,而鉴于ColorIndex本身的限制,它无法准确地体现Excel 2007的颜色值,所以为了体现兼容属性,通常改用Color。例如获取单元格的颜色编码,那么必须使用以下代码才具有兼容性: MsgBox ActiveCell.Interior.Color 除了以上版本差异带来的兼容性问题外,不同用户在同一版本中使用同一程序时也会有兼容性问题。因为不同用户制表时会有不同习惯,标题行数不同,或者待汇总的工作表数量不同、路径不同等,那么在开发工具时,为了体现兼容性,通常不使用硬编码,而用动态引用方式,使代码可以适应变化。 例如多表汇总,虽然工作表名称是“Sheet1”、“Sheet2”、“Sheet3”,但仍然不使用“Sheet1”方式引用工作表,而是“Sheets(1)”,即通过索引号调用工作表,避免改名后程序出错;而对于单元格的引用也不使用“[A1:c20]”这种硬编码,而是“ActiveSheet.Usedrange”实现动态调用,适应数据的增减变化。对于文件路径,也不能使用“d:\生产表”这种明文方式,而是调用对话框让用户自由选择,从而大大提升程序的兼容性,保证在不同环境下都可以正确执行。
============================= 以上摘自《EXCEL2010编程与实践》 |