Vba 如何根据Excel中的单元格值有条件地向电子表格添加行

Vba 如何根据Excel中的单元格值有条件地向电子表格添加行,vba,excel,Vba,Excel,我希望使用Excel执行以下操作: 下面是布尔值和唯一标识符的表格 这就是我想要实现的目标。如果第一列显示“否”,我希望代码在单独的电子表格中自动添加一个全新的行,并且在新行的第一列中具有唯一标识符(如下所示为电子表格1) 在这种情况下,C4和C5将是下面例示的两行(电子表格2) 代码更新: Sub AddID() Dim c As Range Dim j As Integer Dim Source As Worksheet Dim Target As Wor

我希望使用Excel执行以下操作:

下面是布尔值和唯一标识符的表格

这就是我想要实现的目标。如果第一列显示“否”,我希望代码在单独的电子表格中自动添加一个全新的行,并且在新行的第一列中具有唯一标识符(如下所示为电子表格1)

在这种情况下,C4和C5将是下面例示的两行(电子表格2)

代码更新:

Sub AddID()
    Dim c As Range
    Dim j As Integer
    Dim Source As Worksheet
    Dim Target As Worksheet

    Set Source = ActiveWorkbook.Worksheets("Questionnaire")
    Set Target = ActiveWorkbook.Worksheets("AI Tracker")

    j = 1
    For Each c In Source.Range("C4:C54")
        If c = "No" Then
           Target.Cells(j + 4, "A").Value = c.Offset(, 1).Value
           j = j + 1
        End If
    Next c
End Sub
这将正确地更新目标工作表,但如果源工作表被更改,我需要它进行更新(即,如果某些内容更改为“否”,则函数应将新行添加到目标工作表)

我编写了以下代码来检测更改,但它不起作用:

Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, ActiveWorkbook.Worksheets("Questionnaire").Range("C4:C54")) _
       Is Nothing Then
        Call Module2.AddID
        MsgBox "Cell has changed"
    End If
End Sub
而不是

Source.Rows(c.Row).Copy Target.Rows(j)
使用


Target.Cells(j,“A”).Value=c.Offset(,1).Value'事情大大简化了,我提出了以下解决方案:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n
    Dim a

    Set dest = ActiveWorkbook.Worksheets("AI Tracker")

    If Intersect(Target, ActiveWorkbook.Worksheets("Questionnaire").Range("C4:C54")) Is Nothing Then
        Exit Sub
    Else

        a = Target.Address
        n = Range(a).Offset(, 1).Value

            If Target.Value = "No" Then
                dest.Range("A" & Rows.Count).End(xlUp).Offset(1).Value = n
            End If
    End If
End Sub

这将检测到“否”,然后在目标工作表中找到下一个空行,并将唯一标识符(与“否”关联)添加到该行的第一个单元格中。

您尝试了什么?请发布您的代码我已经添加了一个代码片段@litelite我已经做了更改,但是代码不会自动检测到更改,因此会将它们添加到目标工作表中。它只在我运行代码时更新。它可以工作,但需要在更改期间处于活动状态,如果我的答案满足您的原始问题,请将其标记为已接受。谢谢。如果我想检查“否”,那么不仅要将一个单元格复制到目标工作表中,还要将相邻的单元格复制到目标工作表中,我将如何编辑此代码?使用Range对象的Resize(rows,columns)方法,允许您将调用它的范围水平和垂直扩展到所需的大小。所以,若要将myRange水平扩展一个单元格(列),您需要使用myRange.Offset(,2),即不要求调整行和列的大小。dest.Range(“A”&dest.Rows.Count).End(xlUp).Offset(1).Resize(,2).Value=Target.Offset(,1).Resize(,2).Value有关当前需要的信息,请参阅我编辑的答案。考虑一下我对你原创的评论。
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Intersect(Target, ActiveWorkbook.Worksheets("Questionnaire").Range("C4:C54")) Is Nothing Then Exit Sub '<~~ use just one row and avoid the "Else-End If" block. it increases readability

    Dim dest As Worksheet '<~~ Dim only if needed, i.e. if you didn't exit the sub
    Set dest = ActiveWorkbook.Worksheets("AI Tracker") '<~~ Set only if needed,i.e. if you didn't exit the sub
    If Target.Value = "No" Then dest.Range("A" & dest.Rows.Count).End(xlUp).Offset(1).Value = Target.Offset(, 1).Value '<~~ Target has already all you need and it's already a range

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n
    Dim a

    Set dest = ActiveWorkbook.Worksheets("AI Tracker")

    If Intersect(Target, ActiveWorkbook.Worksheets("Questionnaire").Range("C4:C54")) Is Nothing Then
        Exit Sub
    Else

        a = Target.Address
        n = Range(a).Offset(, 1).Value

            If Target.Value = "No" Then
                dest.Range("A" & Rows.Count).End(xlUp).Offset(1).Value = n
            End If
    End If
End Sub