【问题标题】:Macro handling difference between MS Excel 2010 and MS Excel 2013MS Excel 2010 和 MS Excel 2013 之间的宏处理差异
【发布时间】:2014-06-20 02:34:46
【问题描述】:

我目前正在修改 2005 年初制作并在早期版本的 Excel 上运行的宏。最近它被用于 MS Excel 2010,但我正在使用 MS Excel 2013 来修改代码。会不会有任何效果或兼容性问题?

非常感谢提供解释在不同版本的 Excel 上处理宏的链接。谢谢。

【问题讨论】:

  • 你试过谷歌吗?这是一个很好的链接资源。
  • 是的,很遗憾,我没有找到我要找的东西,这就是为什么我发布这个是为了从人们那里得到一些答案或获取链接。

标签: vba excel compatibility


【解决方案1】:

这里有一个需要注意的“问题”:Microsoft 在 Excel 2007 中引入了“大网格”。这是可用行数和列数的巨大飞跃,您的用户可能已经开始利用它们。

也许您在 2005 年有一个有远见的团队为您的企业编写 VBA,但在我的旧工作中,以下是识别最后一行的现状:

LastRow = Range("A65536").End(xlUp).Row

如果 2007、2010 或 2013 工作表的填充行超过 65,536 行,以上将不会返回预期结果,并且您的旧脚本将失败,或者更糟糕的是,将返回不正确的结果。

您应该像上面那样嗅出任何最后一行(或最后一列)标识,并使用@SiddharthRout 在查找最后一行的权威帖子中描述的技术对其进行重构:Error in finding last used cell in VBA... 简而言之:

查找列中的最后一行(下面查找 Sheet1 上 A 列中最后占用的行)

With Sheets("Sheet1")
    LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
End With

查找工作表中的最后一行(下面使用CountA 防止出现空工作表1)

With Sheets("Sheet1")
    If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
        lastrow = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Row
    Else
        lastrow = 1
    End If
End With

【讨论】:

  • +1,但不只是提到正确、灵活的语法?
  • +1 这在我必须得到最后一列时很有用。
  • 你是对的@DougGlancy,我在上面的答案中添加了链接帖子中的亮点
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
相关资源
最近更新 更多