如何用Excel中的单元格中的string与if /或运算符匹配,并删除行
免责声明:我从来没有使用Visual Basic,我从来没有做过一个macros。
我正在尝试在Microsoft Excel 2010中创build一个macros,它将删除列G和列I都不包含string“Ohio”,“Indiana”或“Kentucky”的所有行。 为了澄清,如果单元格不包含这三个状态名称中的任何一个,则该行应该被删除。 我希望macros从第6行开始,因为1-5行包含重要信息。 整张纸包含14000多行,其中只有1.5%实际上是有用的。
此外,我期望能够重用这个macros,但除了俄亥俄州,印第安纳州和肯塔基州以外的其他栏目(除G和I)之外的其他术语。
如果可以的话,它也可以帮助我,除了纠正这个问题之外,解释我到底在说什么。 也许用Java来说,或者Python也没关系。 没有必要,但可能有所帮助。
Sub DeleteIfNotKYINOH() Dim i, LastRow LastRow = Range("G" & Rows.Count).End(xlUp).Row For i = LastRow To 6 Step -1
下一行出现types不匹配错误。
If Cells(i, "G").Value = "Ohio" Or "Indiana" Or "Kentucky" Then Cells(i, "G").Value = True End If If Cells(i, "I").Value = "Ohio" Or "Indiana" Or "Kentucky" Then Cells(i, "I").Value = True End If If Cells(i, "G").Value Or Cells(i, "I").Value = False Then Cells(i, "G").EntireRow.Delete End If Next ' DeleteIfNotKYINOH Macro ' Delete all rows that do not contain Ohio, Indiana, or Kentucky, as a state. ' ' End Sub
有几件事情需要考虑,看起来你是在正确的轨道上,但是,你甚至会对这个集合进行反向迭代(这会让很多人失望!)。
确保正确地声明你的variables( i
和LastRow
应该可能是长整数,而不是未指定的变体types)。
If
语句可以包含Or
连接,但必须是这样的:
If Cells(i, "G").Value = "Ohio" Or Cells(i, "G").Value = "Indiana" Or Cells(i, "G").Value = "Kentucky"
既然你希望能够把macros用于其他string,当然你可以进入和编辑“俄亥俄州”或“印第安纳州”等的每个实例,但是这可能是乏味和容易出错的。
你可以做这样的事情,而不是重新使用它的任何数量的状态列表,只是改变分配到states
variables。
Const states as String = "Ohio,Indiana,Kentucky" Sub TestDeleteIfNot() Dim i as Long, LastRow as Long Dim cl as Range LastRow = Range("G" & Rows.Count).End(xlUp).Row For i = LastRow To 6 Step -1 With Cells(i, "G") If Not(InList(.Value, states)) And Not(InList(.Offset(0,2).Value, states)) .EntireRow.Delete End If End With Next End Sub
这个例程调用一个函数InList
,它接受两个string作为参数。 第一个string应该是被比较的值,第二个string是逗号分隔的“允许值列表”。
Function InList(strVal as String, list as String) As Boolean Dim a as Variant For each a in Split(list, ",") If strVal = a Then InList = True Exit For End If Next End Function
该函数将列表转换为数组,并对比较值进行迭代。 如果找不到值,它应该返回False
。 那么调用子的逻辑运行在COlumn G和Column I的单元上,如果BOTHtesting返回False,则只删除该行。