根据条件提取excel行

时间:2017-01-19 00:36:16

标签: excel vba excel-vba excel-formula

您好我在下面有一个Excel表格列

   RowNo    ID  CancelledBy
   1    12345   Provider
   2    12345   Provider
   3    12345   Patient
   4    12345   Patient
   5    12345   Patient
   6    12345   Provider
   7    12345   Patient
   8    12345   Provider
   9    54321   Patient
  10    54321   Provider
  11    54321   Provider
  12    54321   Patient
  13    54321   Provider

从上表中我想选择那些行,如果一行包含“provider”并且紧接的下一行包含“Patient”,那么我想为该患者提取两行。 基本上是“提供者”行,后跟“患者”行,如下所示。

 RowNo  ID  CancelledBy
  2  12345  Provider
  3  12345  Patient
  6  12345  Provider
  7  12345  Patient
 11  54321  Provider
 12  54321  Patient

是否有excel公式/ vbscript或宏来执行此操作。我整天都在尝试,但没有快乐。

感谢

3 个答案:

答案 0 :(得分:1)

已修改以下内容可能有所帮助。数据应该在工作表“MyData”中(带有命令按钮),结果写在工作表“Extracted”中。代码可以缩短,但为了便于阅读,我将其保留为硬编码。

Sub Button1_Click()
    Dim lLastRow As Long
    Dim i As Integer
    Dim k As Integer

    lLastRow = Worksheets("MyData").UsedRange.Rows.Count
    k = 1
    For i = 1 To lLastRow
        If ((Worksheets("MyData").Cells(i, 3) = "Provider" And Worksheets("MyData").Cells(i + 1, 3) = "Patient") And (Worksheets("MyData").Cells(i, 2).Value = Worksheets("MyData").Cells(i + 1, 2).Value)) Then

            Worksheets("Extracted").Cells(k, 1) = Worksheets("MyData").Cells(i, 1)
            Worksheets("Extracted").Cells(k, 2) = Worksheets("MyData").Cells(i, 2)
            Worksheets("Extracted").Cells(k, 3) = Worksheets("MyData").Cells(i, 3)

            Worksheets("Extracted").Cells(k + 1, 1) = Worksheets("MyData").Cells(i + 1, 1)
            Worksheets("Extracted").Cells(k + 1, 2) = Worksheets("MyData").Cells(i + 1, 2)
            Worksheets("Extracted").Cells(k + 1, 3) = Worksheets("MyData").Cells(i + 1, 3)

            k = k + 2
        End If
    Next
End Sub

答案 1 :(得分:0)

假设您的数据位于从def up (a, s, Bmax): counter = 0 while True: if counter == s : break if a == Bmax : break if a == 255 : break a += 1 counter += 1 开始的AB列中。使用这些公式

C2 = AND(B2 ="提供者",B3 ="患者")

完全填充公式

row 2

填写D2 =IF(MOD(ROW(D2)-ROW($D$2),2)=0,1/AGGREGATE(14,6,1/(--($C$2:$C$14)*(ROW($C$2:$C$14))*(ROW($C$2:$C$14)>1)),1),1) D3 =IF(MOD(ROW(D3)-ROW($D$2),2)=0,1/AGGREGATE(14,6,1/(--($C$2:$C$14)*(ROW($C$2:$C$14))*(ROW($C$2:$C$14)>D2-1)),1),D2+1) ,直到您开始D3。这将填充从中获取数据所需的所有行号。

#NUM

E2 =INDEX($A$1:$B$14,D2,1) F2 =INDEX($A$1:$B$14,D2,2) 完全填满。这应该填充您想要的结果。

修改

修订了INDEX公式 Screenshot

答案 2 :(得分:0)

你可以试试这个:

如果“CancelledBy”在C列中,您可以在D2中使用此公式

= IF(OR(AND(C2 = “提供者”,D1 = 1),和(C2 = “提供者”,C3 = “患者”)),1,0)

然后复制到D3到D14的所有行

您需要的所有行都将等于1,然后您可以使用1值过滤D列。

我希望这可以提供帮助。

由于