¿Guardar valores (no fórmulas) de una hoja a un nuevo libro?

Estoy usando la siguiente function para save una hoja de trabajo de un libro de trabajo y savela en un libro de trabajo por separado. Sin embargo, está guardando las fórmulas, mientras que prefiero que los valores terminen en el libro de trabajo final. ¿Cómo puedo modificar esto para que el libro resultante no contenga fórmulas y solo valores?

Sub Sheet_SaveAs(FilePath As String, SheetToSave As Worksheet) Dim wb As Workbook Set wb = Workbooks.Add(xlWBATWorksheet) With wb SheetToSave.Copy After:=.Worksheets(.Worksheets.Count) Application.DisplayAlerts = False .Worksheets(1).Delete Application.DisplayAlerts = True .SaveAs FilePath .Close False End With End Sub 

Usando el enlace amablemente siempre que intenté esto, pero fue en vano:

 Sub Sheet_SaveAs(FilePath As String, SheetToSave As Worksheet) Dim wb As Workbook Set wb = Workbooks.Add(xlWBATWorksheet) With wb SheetToSave.Copy After:=.Worksheets(.Worksheets.Count) Application.DisplayAlerts = False .Worksheets(1).Delete .Worksheets(1).Copy .Worksheets(1).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.DisplayAlerts = True .SaveAs FilePath .Close False End With End Sub 

pero obtengo un error en la línea pastespecial ??

 .Worksheets(1).Copy 

Esto copy la hoja en sí y no se relaciona con PasteSpecial . Podrías usar:

 .Worksheets(1).UsedRange.Copy 

o similar. Por ejemplo, Worksheets(1).Cells.Copy .

Supongo que deberían ser Worksheets(.Worksheets.Count) .

A continuación, uso SpecialCells para identificar solo las fórmulas en la spreadsheet y establezco rng.Value = rng.Value para convertirlas a los resultados de las fórmulas.

 Sub Sheet_SaveAs(FilePath As String, SheetToSave As Worksheet) Dim wb As Workbook Dim ws As Worksheet Dim rngFormulas As Range, rng As Range Set wb = Workbooks.Add(xlWBATWorksheet) With wb SheetToSave.Copy After:=.Worksheets(.Worksheets.Count) Set ws = .Worksheets(.Worksheets.Count) Application.DisplayAlerts = False .Worksheets(1).Delete Application.DisplayAlerts = True With ws Set rngFormulas = ws.Cells.SpecialCells(xlCellTypeFormulas) For Each rng In rngFormulas rng.Value = rng.Value Next rng End With .SaveAs FilePath .Close False End With End Sub 

Necesitará agregar algún código de event handling errores para manejar el caso donde no hay fórmulas en la hoja de trabajo copyda. (Las fórmulas de matriz también pueden necesitar ser contabilizadas).

La forma más fácil de copyr los valores es hacerlo en 2 pasos:
Copie la hoja, luego reemplace las fórmulas con sus valores

Después:

 .Worksheets(1).Delete 

en su código original, agregue las líneas:

 With Range(Worksheets(.Worksheets.Count).UsedRange.Address) .Value = .Value End With 

El .value=.value está diciendo a Excel que reemplace cada valor con el valor que se muestra actualmente, por lo que todas las fórmulas se replaceán por su valor calculado

Lo siento, la respuesta estaba empezando a parecer un desastre, así que elimínalo y comienza de nuevo. He escrito esto, parece funcionar bien cuando lo probé, solo necesitas una línea adicional para save cualquier spreadsheet resultante. 🙂

 For Each Cell In ActiveSheet.UsedRange.Cells Cell.Copy Cell.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Next