Excel宏:遍历行和组合循环
我正在努力找出代码中的错误所在 情况如下:我正在写我的硕士论文,并做了一个实验,观察人们的非言语行为。我把这种非言语行为编码在一个特定的程序中,现在作为输出,我有一张Excel表格,里面有所有的观察数据。问题是,很多行包含我不需要的信息,所以我想删除它们 我的目标:我只想保留C列和D列部分内容匹配的行(参与者编号,从101开始)。我尝试将两个循环组合在一起,以便第一个(内部)循环通过一行中C列和D列中的所有参与者编号搜索匹配项(直到参与者编号170),如果没有匹配项,则删除该行/如果有匹配项,则转到下一行。对于包含数据的所有行,“outter”循环应该重复“inner”循环的步骤(在这里直到第2732行) 我的代码到目前为止:Excel宏:遍历行和组合循环,excel,loops,vba,Excel,Loops,Vba,我正在努力找出代码中的错误所在 情况如下:我正在写我的硕士论文,并做了一个实验,观察人们的非言语行为。我把这种非言语行为编码在一个特定的程序中,现在作为输出,我有一张Excel表格,里面有所有的观察数据。问题是,很多行包含我不需要的信息,所以我想删除它们 我的目标:我只想保留C列和D列部分内容匹配的行(参与者编号,从101开始)。我尝试将两个循环组合在一起,以便第一个(内部)循环通过一行中C列和D列中的所有参与者编号搜索匹配项(直到参与者编号170),如果没有匹配项,则删除该行/如果有匹配项,则
Dim ColumnC As String
Dim ColumnD As String
Dim ParticipantNumber As String
Dim RowNumber As Integer
Sub SearchAndDeleteRows()
RowNumber = 2
ParticipantNumber = 101
ColumnD = "D" & RowNumber
ColumnC = "C" & RowNumber
Do While RowNumber < 2733
Do While ParticipantNumber < 170
If InStr(Range(ColumnD).Value, ParticipantNumber) = 0 And InStr(Range(ColumnC).Value, ParticipantNumber) > 0 Or InStr(Range(ColumnD).Value, ParticipantNumber) > 0 And InStr(Range(ColumnC).Value, ParticipantNumber) = 0 Then
Rows(RowNumber).Select
Selection.Delete Shift:=xlUp
Else: GoTo NextParticipant
End If
NextParticipant:
ParticipantNumber = ParticipantNumber + 1
If ParticipantNumber = 170 Then GoTo NextRow
End If
Loop
NextRow:
RowNumber = RowNumber + 1
Loop
End Sub
Dim列C作为字符串
列为字符串
Dim ParticipantNumber作为字符串
将行数设置为整数
子搜索和删除行()
行数=2
参与者人数=101
ColumnD=“D”&行数
ColumnC=“C”&行数
当行数<2733时执行此操作
当参与者人数<170时执行
如果InStr(范围(列D).Value,ParticipantNumber)=0和InStr(范围(列C).Value,ParticipantNumber)>0或InStr(范围(列D).Value,ParticipantNumber)>0和InStr(范围(列C).Value,ParticipantNumber)=0,则
行(行号)。选择
选择。删除移位:=xlUp
其他:转到下一个参与者
如果结束
下一参与方:
参与者编号=参与者编号+1
如果ParticipantNumber=170,则转到下一步
如果结束
环
下一步:
RowNumber=RowNumber+1
环
端接头
注意:我知道GoTo函数是邪恶的,但直到现在我才想出一个解决方法
我希望我已经解释清楚了
提前感谢您的帮助
干杯,J你的逻辑基本上是正确的,但是。寻找是一种更快的获得比赛的方法。此外,除非从下至上开始,否则在尝试跟踪行号的同时删除行是不可能的。试试这个。它将创建一个新的工作表,并将所有好的行压缩到新的工作表中。运行活动工作表之前,请确保它是正确的
Sub copyNOTdelete()
Dim ParticipantNumber As Long, RowNumber As Long
Dim wsMain As Worksheet, WSnew As Worksheet, newRowNumber As Long
Set wsMain = ActiveSheet
Set WSnew = Sheets.Add
wsMain.Activate
RowNumber = 2
newRowNumber = 1
ParticipantNumber = 101
For ParticipantNumber = 101 To 170
With wsMain.Range("c2:c2733")
Set c = .Find(CStr(ParticipantNumber), LookIn:=xlValues)
If Not c Is Nothing Then
firstaddress = c.Address
Do
If wsMain.Range("D" & Right(c.Address, 1)) = ParticipantNumber Then
WSnew.Rows(newRowNumber).EntireRow.Value = wsMain.Rows(Right(c.Address, 1)).Value
newRowNumber = newRowNumber + 1
End If
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstaddress
End If
End With
Next ParticipantNumber
End Sub
子copyNOTdelete()
将参与者编号变长,行编号变长
将wsMain设置为工作表,WSnew设置为工作表,newRowNumber设置为长
设置wsMain=ActiveSheet
设置WSnew=Sheets.Add
wsMain,激活
行数=2
newRowNumber=1
参与者人数=101
对于参与者编号=101至170
带wsMain.Range(“c2:c2733”)
集合c=.Find(CStr(参与者编号),查找:=xlValues)
如果不是,那么c什么都不是
firstaddress=c.地址
做
如果wsMain.Range(“D”和Right(c.Address,1))=参与者编号,则
WSnew.Rows(newRowNumber).EntireRow.Value=wsMain.Rows(右(c.Address,1)).Value
newRowNumber=newRowNumber+1
如果结束
集合c=.FindNext(c)
循环而不是c为Nothing,c.Address为firstaddress
如果结束
以
下一个参与者编号
端接头
删除行往往会使循环有点不可靠。将好的行复制(或插入,如果相反的顺序可以)到新的工作表中可能是一个好的计划。每次删除一行时,您都将跳过一行,对于您的外部循环,最好使用类似于for RowNumber=2733 to 1 step-1
的内容。您可能对以下帖子感兴趣:无论如何,我建议您在您的案例中使用数组。但所有这些都更适合而不是用于堆栈溢出。