如何用“!”复制所有单元格在公式和粘贴值的顶部?

时间:2016-04-08 16:11:29

标签: vba excel-vba excel

我在VBA中绝对是零初学者,我唯一知道的是我打算通过Excel中的可用功能来实现,并且需要VBA代码。所以,如果有人愿意帮助,我需要一个完整的VBA代码准备好运行!感谢。

任务:在一张非常大的工作表中,我需要复制包含“!”的所有单元格(散落在周围)在他们的公式中(即所有引用其他表格的单元格),并用它们各自的值替换它们(类似于“粘贴值”)。此任务的目的是消除对其他工作表的所有引用,以实现完全独立的工作表,同时保持所有值不变。

所以我想我需要的是一个遍历整个工作表的循环,如果在其公式中有一个感叹号,则复制一个单元格,并将该值粘贴到完全相同的位置。循环应覆盖整张纸。

这有意义吗?

1 个答案:

答案 0 :(得分:2)

怎么样:

Sub dural()
    Dim r As Range

    For Each r In ActiveSheet.UsedRange.Cells.SpecialCells(xlFormulas)
        If InStr(r.Formula, "!") > 0 Then r.Value = r.Value
    Next r
End Sub
  • 声明一个对象变量来保存对您将要迭代的单元格的引用。

    Dim r As Range
    
  • 获取活动工作表中具有公式

    的所有单元格
    ActiveSheet.UsedRange.Cells.SpecialCells(xlFormulas)
    
  • 循环通过所有获得的细胞;每个单元格是一个Range对象,跨越1行和1列,因此您使用r对象变量作为"迭代变量",并使用For Each循环构造迭代所有单个细胞:

    For Each r In ActiveSheet.UsedRange.Cells.SpecialCells(xlFormulas)
    

    你也可以提取一个对象变量来保存你将要迭代的单元格:

    Dim cellsWithFormula As Range
    Set cellsWithFormula = ActiveSheet.UsedRange.Cells.SpecialCells(xlFormulas)
    
    For Each r In cellsWithFormula
    
  • 您可以使用其Formula属性访问单元格的公式,并使用内置的InStr函数来验证它是否包含感叹号:

    If InStr(r.Formula, "!") > 0 Then
    

    InStr会返回您要查找的字符串的起始索引(如果找到的话);如果找不到,则返回0 - 因此,如果返回值大于0,我们知道公式包含感叹号。如果公式在第20个字符处包含感叹号,则该函数将返回20. / p>

  • 要将公式替换为其值,只需将其指定为Value

    即可
    r.Value = r.Value
    

    这消除了公式并将其替换为上次评估的公式。请注意,如果由于Application.Calculation设置为xlCalculationManual而未计算工作表,则表示这样做会写入错误的值。您可以通过在覆盖公式之前调用其Calculate方法来强制重新计算单个单元格,如下所示:

    r.Calculate