2015-08-27 49 views
0

我需要一個宏,它可以創建一個包含所有工作表(除「數據列表」)和所有宏/用戶表單的重複工作簿。這是我到目前爲止:Excel保存後得到公式#REF

fname = Application.GetSaveAsFilename(FileFilter:="Excel Files (*.xlsm), *.xlsm") 
ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=52 

Application.DisplayAlerts = False 
Worksheets("Data List").Delete 

問題是,我的公式停止工作,因爲他們引用回「數據列表」。我該如何解決這個問題?

上下文/編輯:

對不起,我的問題是措辭不當。我忘記了包含我得到#REF錯誤的事實,因爲有些公式引用了原來的工作簿,它有「數據列表」工作表。之前,我將除「數據列表」之外的所有工作表複製到一個新的工作簿中,並且在我將文件發送給另一個人之前,所有工作都像魅力一樣,然後所有宏都失敗了。所以我正在尋找解決此問題的方法,因此保存了整個工作簿,然後刪除了一個工作表。但是,現在我的公式不起作用。

+0

爲什麼不重新打開原件? – Jeeped

+0

對不起,我的問題措辭不佳。我忘記了包含我得到#REF錯誤的事實,因爲有些公式引用了原來的工作簿,它有「數據列表」工作表。之前,我將除「數據列表」之外的所有工作表複製到一個新的工作簿中,並且在我將文件發送給另一個人之前,所有工作都像魅力一樣,然後所有宏都失敗了。所以我正在尋找解決此問題的方法,因此保存了整個工作簿,然後刪除了一個工作表。但是,現在我的公式不起作用。 – jwoff

+0

for w = 1 to worksheets.count:工作表(w).cells =工作表(w).cells .value:next w:工作表(「數據列表」)刪除 – Jeeped

回答

1

這是一個基本框架。如果你喜歡,你應該可以添加花裏胡哨的東西。

Sub flatten_WB() 
    Dim fn As String, w As Long 

    fn = Application.GetSaveAsFilename(FileFilter:="Excel Files (*.xlsm), *.xlsm") 

    On Error Resume Next 'don't know if one worksheet may have zero formulas 
    Application.DisplayAlerts = False 'might need this for the SaveAs as well as delete worksheet 

    With ActiveWorkbook 
     '.Save 'I would save the original before saving as a new workbook 
     .SaveAs Filename:=fn, FileFormat:=52 

     For w = 1 To .Worksheets.Count 
      With .Worksheets(w) 
       If .Name <> "Data List" Then 'don't bother doing the one we are nuking 
        .Cells.SpecialCells(xlCellTypeFormulas) = _ 
         .Cells.SpecialCells(xlCellTypeFormulas).Value 
       End If 
      End With 
     Next w 

     .Worksheets("Data List").Delete 
    End With 
    Application.DisplayAlerts = True 
    On Error GoTo 0 
End Sub 
  1. 得到一個新的文件名。
  2. 另存爲新文件名(作爲啓用宏的工作簿)。可能要考慮在SaveAs之前保存原件。
  3. 在所有工作表中循環(除了要刪除的工作表)並將所有公式轉換爲它們的返回值。
  4. 刪除'數據列表'工作表。
  5. 恢復應用程序環境。