Excel 2013与2016之间的宏是否存在任何兼容性问题

问题描述:

我们有一位用户使用旧版97-2003 Excel文档,其中包含宏,这些宏正在2013年使用并运行,没有问题。Excel 2013与2016之间的宏是否存在任何兼容性问题

我们现在已经升级至2016年在周末,并在工作簿运行第一个宏时,细胞通常会向我们展示一个值,现在显示#REF!

奇怪的是,如果我们纠正一些宏观运行后手动引用,然后再次运行宏,它不会有同样的问题,第二次左右。

我们想知道2016年是否有任何变化可能导致宏以这种方式表现?

我们正在运行第一个宏低于:

Sub Update() 
' 
' Macro1 Macro 
' Macro recorded 28/06/2007 by PETER WILSON 
'' 
' 
    Sheets("DCodes2").Select 
    Range("C4").Select 
    Application.CutCopyMode = False 
    Selection.QueryTable.Refresh BackgroundQuery:=False 
    Sheets("Summary").Select 
    Range("D23").Select 
    Sheets("Sales Inv").Select 
    Range("a2").Select 
    Selection.QueryTable.Refresh BackgroundQuery:=False 
    Range("K5").Select 
    Sheets("Invoices").Select 
    Selection.QueryTable.Refresh BackgroundQuery:=False 
    Sheets("Job Costs").Select 
    ActiveWindow.LargeScroll ToRight:=-1 
    Range("C2").Select 
    Selection.QueryTable.Refresh BackgroundQuery:=False 
    ActiveWindow.SmallScroll ToRight:=6 
    Range("N2:T2").Select 
    Selection.AutoFill Destination:=Range("N2:T284") 
    Range("N2:T284").Select 
    Range("N3").Select 
    Range("J28").Select 
    Sheets("Job Costs").Select 
    ActiveWindow.SmallScroll ToRight:=-1 
    Range("N2:T2").Select 
    ActiveWindow.LargeScroll ToRight:=-2 
    ActiveWindow.SmallScroll ToRight:=9 
    Selection.AutoFilter Field:=1 
    Range("N2:T2").Select 
    Selection.Copy 
    Range("N3").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    ActiveSheet.Paste 
    Sheets("Daybook").Select 
    Range("B2").Select 
    Application.CutCopyMode = False 
    Selection.QueryTable.Refresh BackgroundQuery:=False 
    Sheets("Job Costs").Select 
    Range("N2:U2").Select 
    Sheets("Summary").Select 
    Range("I8").Select 


' 
End Sub 

我不是什么宏应该做清楚的,所以我很犹豫要经过,并尝试手动正确的用户case我得到了一些错误,并且我不太了解Visual Basic来确定上面的代码在每个步骤中都在做什么。

+0

“*我不清楚宏应该做什么*”如果即使*你*不知道代码在做什么,我们该如何帮助?代码看起来像是值得彻底重写它(看起来像一堆坏习惯),但是因此您需要知道它应该先做些什么。 –

+0

由于该宏是在10年前记录的,我们大多数IT人员和使用该报告的最终用户当时都不在公司。记录宏的用户不再使用该业务,所以我们不能问他们宏观背后的意图是什么。最终用户可以告诉我们他们期望通过宏来调整哪些字段,并且明显突出显示了错误,但我的意思是,我不知道宏如何实现其目标(即实际的代码)。 – Eds

+0

我了解你的情况,但我没有机会在这里找到这样的问题。代码不会做任何壮观的事情,只需一个复制粘贴操作,一个自动填充操作(可能会复制一个公式)并刷新一些查询表。而已。但几乎不可能说出你刚才展示的这段代码的外观出了什么问题(看起来很乱,因为它被录制了,但我没有看到任何问题)。这可能是提出这样一个问题的错误地方。或者,您需要聘请能够检查整个文件的人,包括公式和查询表。 –

看起来像一些原始代码被记录。这(下面)似乎给出相同的功能,删除多余和不必要的代码。 (但我看不到原来的床单,当然这样慎重对待)

Sub EquivalentFunctIonality 
Dim qt as QueryTable 
Dim ws as Worksheet 
For each ws in Worksheets 
For Each qt in ws.querytables 
qt.refresh BackgroundQuery:=False 
Next qt 
next ws 
With Worksheets("Job Costs") 
.Range("N2:T2").Copy .range(Range("N3"),.range("n3").End(xlDown)) 
End With 
End Sub 

看看这是否仍然给出错误。

目前我还没有找到任何可能与此问题有关的2016年变化。

我刚才提出的手动校正由宏首次运行时产生的无效引用,并允许它重新运行(显然是成功以后每一次)。

我已要求最终用户不断监测工作簿中的数据,以确保它是正确的,并且将解决任何未来的工作簿以类似的方式,同一种问题。