使用VBA从Excel中的所有工作表中删除公式

使用VBA从Excel中的所有工作表中删除公式,excel,vba,excel-formula,Excel,Vba,Excel Formula,我让toubles从Excel的单元格中删除公式,只保留值(以防有数字)。问题是由于不同的电子表格中也有透视表(以及GETPIVOTDATA单元格) 我目前正在尝试此代码,但它仅适用于普通电子表格: Sub fun() Dim ws As Worksheet Dim pt As PivotTable Dim pf As PivotField Dim pi As PivotItem Dim pc As PivotCell For Each ws In ThisWorkbook.Workshee

我让toubles从Excel的单元格中删除公式,只保留值(以防有数字)。问题是由于不同的电子表格中也有透视表(以及GETPIVOTDATA单元格)

我目前正在尝试此代码,但它仅适用于普通电子表格:

Sub fun()

Dim ws As Worksheet
Dim pt As PivotTable
Dim pf As PivotField
Dim pi As PivotItem
Dim pc As PivotCell

For Each ws In ThisWorkbook.Worksheets
    ws.Activate
    With ws.UsedRange
        .Value = .Value
    End With
Next ws


For Each ws In ThisWorkbook.Worksheets
    For Each pt In ws.PivotTables
        For Each pf In pt.PivotFields
            For Each pi In pf.PivotItems
                pi.Value = pi.Value
            Next pi
        Next pf
    Next pt
Next ws

End Sub

你能帮我修改代码,让每个单元格都被设置为值吗

你一个问题也没问。请根据具体情况提问。还包括示例数据或屏幕截图。请注意,“不工作”不是完整的错误描述。相反,请解释哪些不起作用,哪些发生了,而不是您预期会发生什么。您是否尝试将pivot表复制并“粘贴为值”,而不是
pi.Value=pi.Value
?因为
pi.Value=pi.Value
只会将公式转换为值。透视表单元格已显示值,而不显示公式。为什么需要替换它们?是的,但您可以使用透视表中的值在同一电子表格的其他单元格中生成公式…并且运行此代码不会将这些单元格设置为值。这就好像分析中不包括包含透视表的工作表,或者看起来是这样。不,
pi.Value=pi.Value
只会将公式转换为值。因此,如果在枢轴选项卡中没有公式,枢轴将不会发生任何变化。你认为pivot表会发生什么?你没有问任何问题。请根据具体情况提问。还包括示例数据或屏幕截图。请注意,“不工作”不是完整的错误描述。相反,请解释哪些不起作用,哪些发生了,而不是您预期会发生什么。您是否尝试将pivot表复制并“粘贴为值”,而不是
pi.Value=pi.Value
?因为
pi.Value=pi.Value
只会将公式转换为值。透视表单元格已显示值,而不显示公式。为什么需要替换它们?是的,但您可以使用透视表中的值在同一电子表格的其他单元格中生成公式…并且运行此代码不会将这些单元格设置为值。这就好像分析中不包括包含透视表的工作表,或者看起来是这样。不,
pi.Value=pi.Value
只会将公式转换为值。因此,如果在枢轴选项卡中没有公式,枢轴将不会发生任何变化。您希望透视表会发生什么情况?它可以工作…非常感谢:DI将此限制为
此工作簿。工作表
或其他内容。这在错误的工作簿上运行(如果您打开了多个工作簿),并且无法返回(使用vba撤消不起作用)!所以,你必须小心:)@Pᴇʜ这是真的……非常感谢:DI将此限制为
此工作簿、工作表或其他内容。这在错误的工作簿上运行(如果您打开了多个工作簿),并且无法返回(使用vba撤消不起作用)!所以,你必须小心:)@Pᴇʜ这是真的
Option Explicit

Sub test1()
    Dim ws As Worksheet, a, area As String
    For Each ws In ThisWorkbook.Worksheets
        a = ws.UsedRange
        area = ws.UsedRange.Address
        ws.Cells.ClearContents
        ws.Range(area) = a
    Next
End Sub