作者:iamlaosong
首先要说这是两个不同的东东,一个指excel应用本身的版本号,是软件程序,比如Excel2007,另一个是指Excel文档保存格式。在进行VBA编程时,写好的宏往往要在不同的版本下使用,其本身可以用不同的版本保存,VBA处理的文档也可能是不同的版本,有时,同一问题的处理,不同的版本处理有可能不一样,这就需要判断Excel应用的版本号和文档的版本号,以便做针对性的处理。比如,取工作表的有效行数,Excel2003和2007是不同的,就需要先判断文档的类型,再取行数:
Excel2003采用语句:maxrow = [A65536].End(xlUp).Row
Excel2007采用语句:maxrow = [A1048576].End(xlUp).Row
判断应用的版本和文档的版本,见下面程序:
Sub tt() Do While True MsgBox Application.Version MsgBox ActiveWorkbook.FileFormat Loop End Sub
Application.Version取值("8.0", "9.0", "10.0", "11.0", "12.0", "14.0")对应的版本是("97", "2000", "2002", "2003", "2007", "2010"),而文档版本号是个数值,目前常见的有56(excel2003一般是这种格式)、51(excel2007普通文档用这种格式)、52(excel2007带有宏的文档用这种格式),其它格式见下面链接,不过其中名称的翻译是机器干的,有点够呛,幸好有提示“此文章由机器翻译。 将光标移到文章的句子上,以查看原文。”。
需要注意的是:同一文件在不同版本的Excel下检测的结果是不一样的,实测表明,Excel2003保存的文件(扩展名是xls)在2003环境检测的版本值是-4143(常规工作簿),在2007环境检测的版本值是56(Excel8),而Excel2007文档(扩展名是xlsx),两种环境下检测都是51(默认工作簿,也就是开放XML格式工作簿)。
为保持兼容性,采用下面的检测语句:
If Application.Version >= "12.0" And (ActiveWorkbook.FileFormat = 51 _
Or ActiveWorkbook.FileFormat = 52) Then
maxrow = Cells(1048576, pos_ems).End(xlUp).Row
Else
maxrow = Cells(65536, pos_ems).End(xlUp).Row
End If
xlFileFormat枚举