如果一个单元格为空白而另一个单元格为

时间:2018-11-05 21:55:17

标签: excel vba

因此,随着代码继续运行,数据将粘贴到B列中,它将进行条件检查以查看B列中是否有任何值,并将值粘贴到相邻的A列中。我需要这样做两个条件检查:

如果b列中有值,但是在粘贴之前先检查A列中是否有值,这样它就不会覆盖已经粘贴的其他数据。

For Each Cell In y.Sheets("Compiled").Range("A:B")
    If Range("B:B").Value <> "" And Range("A:A").Value = "" Then
    Cell.Offset(0, -1).PasteSpecial xlPasteValues
    End If
Next

2 个答案:

答案 0 :(得分:1)

您接近了,不要尝试在多列范围内循环

Sub Test()

For Each Cell In y.Sheets("Compiled").Range("B:B")
    If Cell.Value <> "" And Cell.Offset(0, -1).Value = "" Then
        Cell.Offset(0, -1).Value = Cell.Value
    End If
Next

End Sub

注意::您正在遍历Range("B:B")中的每个单元格,这可能是不必要的。如果您使用lastrow值或Range("B2:B1000")这样的静态范围会更好。或者,您可以使用诸如If Cell.Value = "" Then Exit For之类的条件退出循环。

答案 1 :(得分:0)

这是实现dwirony在回答中提到的lastrow值的代码版本。这也会将所有内容都放入数组,因此如果您有非常大的数据集,它可能会更快一些。

Option Explicit
Sub test()
    Dim ACol As Variant
    Dim BCol As Variant
    Dim lastrow As Long
    Dim i As Long

    lastrow = Range("B:B").Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).row
    BCol = Range("B1:B" & lastrow).Value
    ACol = Range("A1:A" & lastrow).Value

    For i = LBound(BCol) To UBound(BCol)
        If IsEmpty(ACol(i, 1)) And Not IsEmpty(BCol(i, 1)) Then
            ACol(i, 1) = BCol(i, 1)
        End If
    Next i

    Range("A1:A" & lastrow).Value = ACol
End Sub