【问题标题】:VBA - saving every sheet as values in excel workbookVBA - 将每张工作表保存为excel工作簿中的值
【发布时间】:2015-08-17 17:22:45
【问题描述】:

我正在尝试编写一个宏来遍历活动工作簿中的每个工作表,并将所有公式保存为值。为此,对于每个工作表,首先我遍历每个数据透视表,然后选择该表并复制并粘贴为值。然后我尝试使用worksheet.activerange.value = .value 方法来保存工作表中的其余单元格。

我在 wks.UsedRange.Value = wks.UsedRange.Value 行收到 1004 运行时错误。

我有两个问题:

1) 如何修复我的运行时错误?

2) 有没有办法让 .value = .value 与数据透视表一起使用?在以前的宏中,这从未与枢轴一起使用,因此我必须使用复制和粘贴,如下所示。

非常感谢您的帮助!

Sub LockWorkbook()

Dim pvt As PivotTable
Dim wks As Worksheet
Dim i As Integer
Dim n As Integer

n = 1

For Each wks In ActiveWorkbook.Worksheets
    i = 1
    For Each pvt In wks.PivotTables
        wks.PivotTables(i).TableRange2.Select
        With Selection
            .Copy
            .PasteSpecial xlValues
            .PasteSpecial xlFormats
        End With
        i = i + 1
        Next pvt

    Set wks = ActiveWorkbook.Worksheets(n)
    wks.UsedRange.Value = wks.UsedRange.Value
    n = n + 1

    Next wks

End Sub

【问题讨论】:

  • 是否应该使用range.formula = usedrange.value。对不起,我可能错了。
  • 另外,数据透视表不能包含公式。它们只能包含值,因此您不需要这样的宏。
  • Wouldnt cells.copy cells.pastespecial xlValues 适用于包括枢轴在内的整个工作表

标签: vba excel


【解决方案1】:

在国王的观点上,您可以简单地复制并粘贴整个工作表作为值。

Sheets("Sheet1").cells.copy
Sheets("Sheet1").cells.PasteSpecial Paste:=xlPasteValues

如果您想将其放入一个简单的循环中以对所有页面执行此操作,它可能如下所示:

Sub Test1()

    Dim WS_Count As Integer
    Dim I As Integer


    WS_Count = ActiveWorkbook.Worksheets.Count

    For I = 1 To WS_Count

        ActiveWorkbook.Worksheets(I).Cells.Copy
        ActiveWorkbook.Worksheets(I).Cells.PasteSpecial Paste:=xlPasteValues

    Next I

End Sub

如果有帮助,请告诉我!

【讨论】:

    【解决方案2】:

    最新编辑消除了运行时错误“1004”(不包括数据透视表从转换为值)

    Option Explicit
    
    Public Sub ConvertFormulasToValuesInUsedRangeExceptPivotTables()
        Dim ws As Worksheet, ur As Range, cel As Range
        Dim pvt As PivotTable, nonPivot As Range, isPvt As Boolean
    
        For Each ws In ThisWorkbook.Worksheets
            Set ur = ws.UsedRange
    
            For Each cel In ur
    
                For Each pvt In ws.PivotTables      'excludes pivot tables
                    isPvt = Not Intersect(cel, pvt.TableRange2) Is Nothing
                    If isPvt Then Exit For
                Next
    
                If Not isPvt Then
                    If Len(cel.Formula) > 0 Then    'excludes empty cells
                        If nonPivot Is Nothing Then
                            Set nonPivot = cel
                        Else
                            Set nonPivot = Union(nonPivot, cel)
                        End If
                    End If
                End If
    
            Next cel
    
            nonPivot.Value = nonPivot.Value
            Set nonPivot = Nothing
    
        Next ws
    
    End Sub
    

    【讨论】:

    • 我仍然在“ws.usedrange.value = ws.usedrange.value”行收到“运行时错误'1004':应用程序定义或对象定义错误”。有什么想法吗?
    • 好的,所以它适用于一个简单的工作簿(我打开一个新文件并通过几个 sum() )。但它不适用于更复杂的文件(包含枢轴、条件格式、合并单元格和指向其他文件的链接)。你知道是什么原因造成的吗?
    • 您的最后一条评论很好——我只用一个简单的文件(带有 3 个数据透视表)对其进行了测试。我认为枢轴不会导致问题,但我将添加更多公式、验证规则、条件格式、合并单元格和指向其他文件的链接。你在文件里还有什么吗?另外 - 错误编号和描述是什么?
    • 总是“运行时错误'1004':应用程序定义或对象定义错误”。
    • 最新编辑(非常晚)消除了运行时错误“1004”(不包括数据透视表转换为值)
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多