Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 基于条件提取excel行_Vba_Excel_Excel Formula - Fatal编程技术网

Vba 基于条件提取excel行

Vba 基于条件提取excel行,vba,excel,excel-formula,Vba,Excel,Excel Formula,嗨,我有一个Excel表格a列在下面 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

嗨,我有一个Excel表格a列在下面

   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或宏可以执行此操作。我试了一整天,但没有乐趣


谢谢编辑

以下内容可能会有所帮助。数据应该在“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

假设您的数据位于列
A
B
中,从
第2行开始。使用这些公式

C2=和(B2=“提供者”,B3=“患者”)

一路填写公式

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)
一直向下填充E2:F2
。这将填充您想要的结果

编辑:

修正指数公式 您可以尝试以下方法:

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

=如果(或(和(C2=“提供者”,D1=1)和(C2=“提供者”,C3=“患者”),1,0)

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

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

我希望这能有所帮助


谢谢

为什么不在输出中包括第8行和第9行?它似乎符合你的标准…你尝试了什么配方?您不能将
If()
公式与
和()
一起使用吗?您好,CMArg,第8行和第9行不在输出中,因为其不同的患者ID 8 12345 9 54321,因此还有一个标准。。。检查我编辑的答案。很高兴我能帮忙