Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel宏:遍历行和组合循环_Excel_Loops_Vba - Fatal编程技术网

Excel宏:遍历行和组合循环

Excel宏:遍历行和组合循环,excel,loops,vba,Excel,Loops,Vba,我正在努力找出代码中的错误所在 情况如下:我正在写我的硕士论文,并做了一个实验,观察人们的非言语行为。我把这种非言语行为编码在一个特定的程序中,现在作为输出,我有一张Excel表格,里面有所有的观察数据。问题是,很多行包含我不需要的信息,所以我想删除它们 我的目标:我只想保留C列和D列部分内容匹配的行(参与者编号,从101开始)。我尝试将两个循环组合在一起,以便第一个(内部)循环通过一行中C列和D列中的所有参与者编号搜索匹配项(直到参与者编号170),如果没有匹配项,则删除该行/如果有匹配项,则

我正在努力找出代码中的错误所在

情况如下:我正在写我的硕士论文,并做了一个实验,观察人们的非言语行为。我把这种非言语行为编码在一个特定的程序中,现在作为输出,我有一张Excel表格,里面有所有的观察数据。问题是,很多行包含我不需要的信息,所以我想删除它们

我的目标:我只想保留C列和D列部分内容匹配的行(参与者编号,从101开始)。我尝试将两个循环组合在一起,以便第一个(内部)循环通过一行中C列和D列中的所有参与者编号搜索匹配项(直到参与者编号170),如果没有匹配项,则删除该行/如果有匹配项,则转到下一行。对于包含数据的所有行,“outter”循环应该重复“inner”循环的步骤(在这里直到第2732行)

我的代码到目前为止:

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
的内容。您可能对以下帖子感兴趣:无论如何,我建议您在您的案例中使用数组。但所有这些都更适合而不是用于堆栈溢出。