需要仅将值从一个范围复制到另一个范围而不覆盖现有数据

时间:2018-01-29 20:49:58

标签: excel vba excel-vba

我一直在搜索和玩弄没有运气。我尝试将值(而非公式)从一个范围n5:n250复制到另一个m5:m250,但我不想覆盖m中的任何现有值(如果存在)。即,如果m5为空白,我希望我的sub将n5中的内容复制到m5。如果它已经有了价值,我希望它一个人留下。

这就是我一直没有运气的尝试:

Sub Reconcile()
     Dim i As Long
    For i = 5 To 250
    If Not IsEmpty(Range("M" & i)) Then _
        Range("M" & i) = Range("N" & i)
    Next i
    Worksheets("Master Task List").Range("e5:e58").ClearContents
End Sub

工作表行是第二个功能,当我点击相应的按钮时,我喜欢子功能。

我非常感谢一些帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以遍历M列中的行,如果值等于vbNullString,请将值设置为N列中的值。

Sub Reconcile()

    Dim i As Long

    With ThisWorkbook.Worksheets(1)
        For i = 5 To 250

            If .Cells(i, "M") = vbNullString Then
                .Cells(i, "M") = .Cells(i, "N")
            End If

        Next
    End With

End Sub

这是使用IsEmpty的例程。您使用Not IsEmpty的示例。当IsEmpty = True时,这意味着它是空的。如果您将Not放在前面,则表示不为空

Sub Reconcile()

    Dim i As Long

    With ThisWorkbook.Worksheets(1)
        For i = 5 To 250

            If IsEmpty(.Cells(i, "M")) Then
                .Cells(i, "M") = .Cells(i, "N")
            End If

        Next
    End With

End Sub

请注意,Worksheets(1)仅用于说明目的。您可能需要为特定工作表更改此内容。

答案 1 :(得分:0)

你可以选出空白单元格,然后将它们移动到一个循环中 我在设置范围时添加了On Error Resume Next,因为我不知道如果没有空白单元格,可以捕获任何其他方法来捕获错误。

Sub Reconcile()

    Dim rBlanks As Range
    Dim rCell As Range

    With ThisWorkbook.Worksheets("Sheet1")
        On Error Resume Next
        Set rBlanks = .Range("M5:M250").SpecialCells(xlCellTypeBlanks)
        On Error GoTo 0

        If Not rBlanks Is Nothing Then
            For Each rCell In rBlanks
                rCell = .Cells(rCell.Row, "N") 'Could also use 14 or rcell.Offset(,1) in place of "N"
            Next rCell
        Else
            MsgBox "No blanks found."
        End If
    End With

End Sub