2015-08-27 29 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. 恢复应用程序环境。