2017-03-04 3 views
0

Ich möchte die Spalte G für diese beiden alternierenden Texte suchen und ihre Zeilennummern in Spalte B beginnend bei B2 ausgeben.Zeilenanzahl von Zellen finden, die zwei alternierende Texte enthalten

Die Daten sehen etwa so aus:

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

Aktuelle Zeit findet nur das erste „Charge“, und der Ausgang wäre als „$ G $ 1“, aber es wird nicht jeden anderen Wert finden fortzusetzen. Ich mag auch für die Ausgabe nur „1“ anstelle von „$ 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 - danke! Jetzt besteht das einzige Problem darin, dass es nicht zwischen Charge und Discharge läuft, um alle Instanzen in der Spalte –

+0

zu finden. Bitte bearbeiten Sie Ihren Code nicht, um Änderungen zu berücksichtigen, es bedeutet, dass die Leute Ihr Problem in Zukunft nicht replizieren können – CallumDA

Antwort

1

sein, wenn Sie meinen, dass Sie durch ein Komma getrennt in B2 die beiden Linien haben wollen, dies tun soll:

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

Ausgabe in "B2": 1,4

Oder wenn Sie wollen, dass sie in B2 und C2:

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

Und haben sie in B2 und B3:

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

Schließlich wollen Sie sie alle, aber in Folge zu finden:

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

Danke für Ihren Beitrag, aber ich meine, dass es es nach unten auflistet, so B2 hat "1" und B3 hat "4" usw. –

+0

B2 und B3 ok, einfache Änderung, aber mein Problem ist mit der "etc". Das ist der unklare Punkt in Ihrer Frage. –

+0

Im Wesentlichen möchte ich, dass es die Spalte B mit allen Zeilennummern aller Zellen füllt, die "Charge" und "Discharge" gefunden haben. Entschuldigung für Verwirrung –

1

eine weitere Möglichkeit, mit Autofilter(), so vermeidet Schleifen:

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 

wo, wenn Spalte G einen "Header" in Zeile 1 hat ändern, können Sie:

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) 

zu:

If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then Set founds = .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible) 
Verwandte Themen