根据当前单元格上的第一个特定文本串查找另一个单元格的内容

我试图想出一个可以在不同的工作表中运行的公式,并引用下面的数据。

本质上对于D中的每个单元格,我想检查向上,当我findstring“发票”,我select上面的第二行和列B.本质上,我会每次都find公司名称。 如您所见,每家公司的logging行数可能有所不同。

更简单地说,公式可以在列B上工作,并在string“Status”的第一个出现处直接返回string。

我不喜欢这是多么复杂,但我无法控制我收到的数据格式,并且来源拒绝改变它。

原始数据

ABCD 1 ABC Widgets, Inc. 2 Account Status Date Invoice 3 1423 Open 4/25/2011 123748 4 1423 Closed 5/1/2011 432741 5 1423 Open 5/2/2011 522211 6 7 XYZ Sprockets, Inc. 8 Account Status Date Invoice 9 3222 Open 5/3/2011 529999 10 

完成的数据

  ABCDE 2 Account Status Date Invoice Client 3 1423 Open 4/25/2011 123748 ABC Widgets, Inc. 4 1423 Closed 5/1/2011 432741 ABC Widgets, Inc. 5 1423 Open 5/2/2011 522211 ABC Widgets, Inc. 9 3222 Open 5/3/2011 529999 XYZ Sprockets, Inc. 

Nutch的,

虽然我不能让你的VBA代码正常工作(见评论),但它确实让我想出这个代码,发现“状态”的第一次出现,然后偏移上面的1单元格。 这基本上是我想要的,但在公式的格式。

 Sub findFirstStringAbove() ' Cells.Find(What:="Status", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase _ :=False).Offset(-1, 0).Select End Sub 

试试这个公式,input数组公式,即按Ctrl + Shift + Enter ,然后复制下来。

 =INDEX(B:B,IF(ROW()>COUNTIF(B:B,"Status"),"",SMALL(IF($B:$B="Status",ROW($B:$B),2000000000),ROW()))-1) 

要从另一个工作表运行,请从原始工作表中剪切并粘贴,并自动调整参考。

VBA将为您提供比公式更快的答案,尽pipe不是dynamic的。 运行附加的代码,过滤,偏移和复制结果:

 Dim lLastRow As Long, rgResult As Range lLastRow = Cells(Rows.Count, 2).End(xlUp).Row With Range("B1:B" & lLastRow) .AutoFilter field:=1, Criteria1:="Status" Set rgResult = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) .AutoFilter End With Sheets.Add rgResult.Offset(-1).Copy ActiveSheet.Cells(1, 1) 

我讨厌谜题。 至less,这就是我告诉人们的。

好。 我做了第一列作为您的标题。

 A1 = Account B1 = Status C1 = Date D1 = Invoice E1 = Client F1 = Index G1 = Client Index H1 = Client Cnt 

第2行将是您的数据的开始。

 A2 = =INDEX(Sheet1!A$1:A$1000,$F2) B2 = =INDEX(Sheet1!B$1:B$1000,$F2) C2 = =INDEX(Sheet1!C$1:C$1000,$F2) D2 = =INDEX(Sheet1!D$1:D$1000,$F2) E2 = =INDEX(Sheet1!B$1:B$1000,$G2) F2 = =IF(ISNUMBER(F1),IF(INDEX(Sheet1!B$1:B$1000,$F1+1)="",G2+2,F1+1),G2+2) G2 = {=IF(H2=H1,G1,SMALL(IF(Sheet1!$B$1:$B$1000="Status",ROW(Sheet1!$B$1:$B$1000),2000),H2)-1)} H2 = =IF(ISNUMBER(H1),IF(INDEX(Sheet1!B$1:B$1000,$F1+1)="",H1+1,H1),1) 

粘贴下去,直到你得到#REF错误。

Excel对$ B:$ B语法表示不满。 它想要一个真正的范围。 另外,你可能想要一个大于1000美元的数字。

毕竟这个macros是比较直接,适合这个要求的,但是那会有什么好玩的呢。

请享用!

好。 这是VBA。

 Public Sub test() Dim rngStCol As Range Dim rngSt As Range Dim lastRow As Integer Dim rngDB As Range Dim currRow As Integer Set rngStCol = Sheet1.UsedRange.Columns(2) Set rngSt = rngStCol.Find("Status") Do While rngSt.Row > lastRow Set rngDB = rngSt.CurrentRegion Set rngDB = rngDB.Offset(2, 0).Resize(rngDB.Rows.Count - 2) If currRow = 0 Then Sheet3.Range(Sheet3.Cells(1, 1), Sheet3.Cells(1, rngDB.Columns.Count)).Value = rngDB.Offset(-1, 0).Resize(1).Value Sheet3.Cells(1, rngDB.Columns.Count + 1).Value = "Client" currRow = 2 End If Sheet3.Range(Sheet3.Cells(currRow, 1), Sheet3.Cells(currRow + rngDB.Rows.Count - 1, rngDB.Columns.Count)).Value = rngDB.Value Sheet3.Range(Sheet3.Cells(currRow, rngDB.Columns.Count + 1), Sheet3.Cells(currRow + rngDB.Rows.Count - 1, rngDB.Columns.Count + 1)).Value = rngDB.Cells(-1, 2) currRow = currRow + rngDB.Rows.Count lastRow = rngSt.Row Set rngSt = rngStCol.FindNext(rngSt) Loop End Sub