Excel VBA复制/粘贴宏:忽略具有公式的单元格

时间:2014-08-27 02:46:19

标签: excel excel-vba vba

我在excel中创建了一个工具,它可以使用两个电子表格,并在我们对工作表本身进行更新时将内容从一个复制到另一个。

该工具纯粹是为复制/粘贴工具而设计的,当前代码将从表到工作表复制和粘贴值。

我必须在工具中包含逻辑以跳过包含公式的单元格,如果工具将当前在源表格中的公式复制并粘贴到目标工作表,它们将不再匹配并抛出#REF错误。关于如何在这里或类似的东西放置for循环的任何建议,以允许它检查和忽略公式的单元格?我只需要复制/粘贴带有数字或值的单元格。

Sub CopyWorkbook()
Dim wb1 As Workbook, wb2 As Workbook

wb1.Sheets("Capex").Range("H1124:AT1173").Copy
wb2.Sheets("Capex").Range("H529:AT578").PasteSpecial Paste:=xlPasteAll
wb1.Sheets("Capex").Range("H1275:AT1284").Copy
wb2.Sheets("Capex").Range("H580:AT589").PasteSpecial Paste:=xlPasteAll

3 个答案:

答案 0 :(得分:3)

如果您真的想跳过包含公式的单元格,可以使用此示例作为开头。 该代码假定只有公式以等号开头。 编辑:使用问题中的范围扩展示例。

Sub example()
    Dim source As Range
    Dim target As Range
    Set source = ActiveSheet.Range("A1:B6")
    Set target = ActiveSheet.Range("D1:E6")
    copy_non_formulas source:=source, target:=target

    'Extended example using the ranges posted in the question
    'For the sake of formatting, I omitted the fully qualified
    'range names.
    copy_non_formulas source:=Range("H1124:AT1173"), target:=Range("H529:AT578")
    copy_non_formulas source:=Range("H1275:AT1284"), target:=Range("H580:AT589")       
End Sub


Public Sub copy_non_formulas(source As Range, target As Range)
    'Assumes that all formulas start with '=' and all non formulas do not
    Dim i As Long
    Dim j As Long
    Dim c As Range

    For i = 1 To source.Rows.Count
        For j = 1 To source.Columns.Count
            Set c = source(RowIndex:=i, ColumnIndex:=j)
            If Left(c.Formula, 1) <> "=" Then
                target(RowIndex:=i, ColumnIndex:=j).Value = c.Value
            End If
        Next j
    Next i
End Sub

答案 1 :(得分:3)

您可以使用SpecialCells来识别公式

,而不是逐个循环

有两个选项

  1. 仅将Constant单元格复制到目标
  2. 从目标
  3. 中删除所有Formula个单元格

    如果你的公式出现在一个有条件的块中,那么(1)很容易工作,否则这将导致需要复制的许多区域。所以(2)是优选的

    您的第一个范围可以如此涵盖。

    Dim rng1 As Range
    Set rng1 = Range("H1124:AT1173")
    rng1.Copy [h1275]
    
    On Error Resume Next
    [h1275].Resize(rng1.Rows.Count, rng1.Columns.Count).SpecialCells(xlFormulas) = vbNullString
    On Error GoTo 0
    

答案 2 :(得分:0)

你不能只对所有细胞使用Paste:=xlPasteValues吗?这样,没有公式被复制到目标表。