2017-09-27 37 views
-1

我們有一位用戶使用舊版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

我瞭解你的情況,但我沒有機會在這裏找到這樣的問題。代碼不會做任何壯觀的事情,只需一個複製粘貼操作,一個自動填充操作(可能會複製一個公式)並刷新一些查詢表。而已。但幾乎不可能說出你剛纔展示的這段代碼的外觀出了什麼問題(看起來很亂,因爲它被錄製了,但我沒有看到任何問題)。這可能是提出這樣一個問題的錯誤地方。或者,您需要聘請能夠檢查整個文件的人,包括公式和查詢表。 –

回答

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 

看看這是否仍然給出錯誤。

0

目前我還沒有找到任何可能與此問題有關的2016年變化。

我剛纔提出的手動校正由宏首次運行時產生的無效引用,並允許它重新運行(顯然是成功以後每一次)。

我已要求最終用戶不斷監測工作簿中的數據,以確保它是正確的,並且將解決任何未來的工作簿以類似的方式,同一種問題。