VBA:内容删除替换

时间:2019-01-17 09:24:36

标签: excel vba

是否有“更整齐”的方法来做到这一点?我的宏继续像这样的10英里长块。

是否可以删除多个单元格?如果我删除了多个单元格,则它不会替换空单元格。

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("P9:P381")) Is Nothing Then
    If IsEmpty(Target) = True Then
        Range("P8").Select
        Selection.Copy
        Range("P" & Target.Row).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    End If
End If
If Not Intersect(Target, Range("R9:R381")) Is Nothing Then
    If IsEmpty(Target) = True Then
        Range("R8").Select
        Selection.Copy
        Range("R" & Target.Row).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    End If
End If

我是vba的初学者,我相信您会注意到这一点。

先谢谢您。

2 个答案:

答案 0 :(得分:0)

您可以替换

Range("P8").Select
Selection.Copy
Range("P" & Target.Row).Select
ActiveSheet.Paste
Application.CutCopyMode = False

使用

Range("p8").Copy Range("P" & Target.Row)

要删除一个单元格块,您需要指定要将单元格从哪个方向“滑入”。所以

Range("D3:F4").Delete xlShiftToLeft

会将右边的单元格带入间隙,而

Range("D3:F4").Delete xlShiftUp

将向上移动单元格。

编辑以添加: 如果要更改单元格更改事件中的单元格,则可能会遇到无限循环的危险,在此循环中,更改会触发代码中的另一个循环。为避免这种情况,您需要在代码开始时关闭事件,然后在结束时将其重新打开 所以:

    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = false

然后在最后

   Application.EnableEvents = true
   End Sub

答案 1 :(得分:0)

您必须循环访问c中的所有单元格Target,并检查每个单元格是否为空。

Dim c As Range
If Not Intersect(Target, Range("P9:P381")) Is Nothing Then
    For Each c In Intersect(Target, Range("P9:P381"))
        If IsEmpty(c) = True Then
            Application.EnableEvents = False
            c.Value = Range("P8").Value
            Application.EnableEvents = True
        End If
    Next c
End If

与其他范围相同。