首页 文章

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

提问于
浏览
1

我在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

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

    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
    
  • 3

    您可以使用 SpecialCells 来识别公式,而不是逐个循环

    有两种选择

    • 仅将 Constant 单元格复制到目标

    • 从目标中删除任何 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
    
  • 3

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

相关问题