我正在努力找出代码中的错误。
情况如下:我正在写我的硕士论文并做了一个实验,我观察了人们的非言语行为。我在一个特定的程序中编写了这种非语言行为,现在作为输出我有一张包含所有观察数据的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
答案 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