2017-03-04 25 views
0

我想在這兩個交替文本的G列中搜索並在整個B列輸出行號,從B2開始。查找包含兩個交替文本的單元格的行數

的數據看起來類似:

Row  
1 Charge 
2  7 
3  7 
4 Discharge 
5  2 
6 Charge 
7  9 

它目前僅發現的第一個「充電」,輸出將是「$ G $ 1」,但它不會繼續尋找所有其他價值。我也想對輸出僅僅是「1」,而不是「$ G $ 1」

Sub RowFinder() 

    Dim Found As Range 
    Dim SearchVal(1 To 2) As String 

    SearchVal(1) = "Charge" 
    SearchVal(2) = "Discharge" 

    Set Found = ActiveWorkbook.Sheets("General 
    Text").Columns("G").Find(what:=SearchVal(), _ 
    LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext) 

    If Not Found Is Nothing Then 
     ActiveWorkbook.ActiveSheet.Range("B2").Value = Found.Row 
    End If 

End Sub 
+2

'= Found.Row'? – CallumDA

+0

D'oh - 謝謝!現在唯一的問題是,它不會在充電和放電之間循環以找到列中的所有實例 –

+0

請不要編輯您的代碼以合併更改,這意味着人們將不能在將來複制您的問題 – CallumDA

回答

1

如果你的意思是你想在B2用逗號分隔的兩條線,這應該這樣做:

Sub RowFinder() 
    Range("B2").value = Join(Application.Match _ 
     (Array("Charge", "Discharge"), Sheets("General Text").Columns("G"), 0), ",") 
End Sub 

輸出在 「B2」:1,4

或者,如果你想他們B2C2

Range("B2:c2").value = Application.Match _ 
     (Array("Charge", "Discharge"), Sheets("General Text").Columns("G"), 0) 

,並安排在B2B3

Range("B2:B3").value = Application.Transpose(Application.Match _ 
    (Array("Charge", "Discharge"), Sheets("General Text").Columns("G"), 0)) 

最後,你想找到他們,而是在繼承:

Sub RowFinder() 
    Dim rng As Range, j As Long, lastCell As Range, ar 
    ar = Array("Charge", "Discharge") 
    j = 2 
    With Sheets("General Text") 
     Set lastCell = .Cells(.Rows.Count, "G").End(xlUp) 
     Set rng = .Range("G1", lastCell) 
     On Error GoTo Finished 
     Do 
      .Cells(j, "B").value = rng.row - 1 + Application.Match(ar(j Mod 2), rng, 0) 
      Set rng = .Range("G" & .Cells(j, "B").value, lastCell) 
      j = j + 1 
     Loop 
    End With 
Finished: 
End Sub 
+0

感謝您的貢獻,但我的意思是,它會列出它向下,所以B2有「1」和B3有「4」等 –

+0

B2和B3好,很容易改變,但我的問題是與「等」。這是您的問題中的不明確的一點 –

+0

本質上,我希望它能夠繼續填充列B,並找到所有具有「Charge」和「Discharge」的單元格的行號。道歉混淆 –

1

另一種可能性,使用Autofilter(),從而避免循環:

Sub RowFinder() 
    Dim founds As Range 
    With Worksheets("General Text") '<--| reference your worksheet 
     With .Range("G1", .Cells(.Rows.count, "G").End(xlUp)) '<--| reference its column G cells from row 1 (header) down to last not empty one 
      .AutoFilter Field:=1, Criteria1:=Array("Charge", "Discharge"), Operator:=xlFilterValues '<--| filter cells with "Charge" and "Discharge" 
      If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then Set founds = .Resize(.Rows.count - IIf(InStr("ChargeDischarge", .Cells(1)) > 0, 0, 1)).Offset(IIf(InStr("ChargeDischarge", .Cells(1)) > 0, 0, 1)).SpecialCells(xlCellTypeVisible) 
     End With 
     .AutoFilterMode = False 
     If Not founds Is Nothing Then .Range("B2").Resize(founds.count) = Application.Transpose(Split(Replace(founds.Address(False, False), "G", ""), ",")) 
    End With 
End Sub 

其中,如果列G在行1中具有「標題」 ,您可以更改:

If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then Set founds = .Resize(.Rows.count - IIf(InStr("ChargeDischarge", .Cells(1)) > 0, 0, 1)).Offset(IIf(InStr("ChargeDischarge", .Cells(1)) > 0, 0, 1)).SpecialCells(xlCellTypeVisible) 

到:

If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then Set founds = .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible) 
相關問題