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