如何用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( iLastRow应该可能是长整数,而不是未指定的变体types)。

If语句可以包含Or连接,但必须是这样的:

 If Cells(i, "G").Value = "Ohio" Or Cells(i, "G").Value = "Indiana" Or Cells(i, "G").Value = "Kentucky" 

既然你希望能够把macros用于其他string,当然你可以进入和编辑“俄亥俄州”或“印第安纳州”等的每个实例,但是这可能是乏味和容易出错的。

你可以做这样的事情,而不是重新使用它的任何数量的状态列表,只是改变分配到statesvariables。

 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,则只删除该行。