Excel宏:遍历行和组合循环

时间:2017-03-13 16:38:23

标签: excel excel-vba loops vba

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

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

我的目标:我想只保留C列和D列部分内容匹配的行(参与者编号,从101开始)。我试图将两个循环组合在一起,以便第一个(“内部”)循环通过列C中的所有参与者编号和一行中的D(直到参与者编号170)搜索匹配,如果没有匹配则删除行/如果有一场比赛进入下一排。 “outter”循环应该为包含数据的所有行重复“内部”循环的步骤(此处直到第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

注意:我知道GoTo功能是邪恶的,但直到现在我还没有办法解决它。

我希望我已经清楚地解释了自己。

提前感谢您的帮助!

干杯,J

1 个答案:

答案 0 :(得分:0)

你的逻辑几乎没问题,但是.find是获得比赛的更快捷方式。此外,除非您从下往上开始,否则在尝试跟踪行号时删除行是不可能的。试试这个。它将创建一个新工作表,并将所有好行写入新工作表。在运行之前,请确保您的活动工作表是正确的。

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