2016-08-01 19 views
0

Mein Blatt enthält eine dynamische Anzahl von Zeilen in Spalte A. Ich möchte eine dynamische Anzahl von Zeilen auswählen, von der ersten Bedingung, die eine Bedingung erfüllt, bis zum letzten Mal.Wählen Sie einen dynamischen Bereich in VBA

In Spalte A habe ich Namen, die nur in Blöcken erscheinen. Zum Beispiel von A1 bis A10 "Alfred", von A11 bis A13 "Flo", von A14 bis A27 "Dave".

Ich möchte von A1 bis A10 wählen können, wenn die Variable Name = „Alfred“ A11 bis A13 wählen, wenn die Variable Name = „Flo“ usw.

Ich weiß nie, wenn der Anfang oder Ende, aber ich weiß, dass sie in Blöcken sind. Meine Idee ist es, eine Schleife von A1 bis zur letzten Zeile, , aber ich weiß nicht, wie ein Wert am Anfang des Bereichs und ein anderes bis zum Ende, damit ich es auswählen kann.

In dem ganzen Post, den ich gefunden habe, kennen wir den Anfang des Bereichs, aber nicht das Ende, also können wir xlUp oder xltoLeft verwenden, aber in meinem Fall kann ich nicht.

Können Sie mir bitte dabei helfen, die Schleife zu machen? Vielen Dank.

+0

sortieren die Daten und dann zu ändern Verwenden Sie Autofilter wie hier gezeigt [http://stackoverflow.com/questions/11631363/how-to-copy-a-line-in-excel-using-a-specific-word-and-pasting-to-another-] excel-s/11633207 # 11633207) Konstruieren Sie Ihre Reichweite. –

Antwort

2

Da Sie so schön gefragt, hier gehen Sie:

Dim blockBeginning, blockEnd, searchedColumn, firstRowSearched, lastRowSearched As Integer, searchString As String 

searchString = "Flo" 
searchedColumn = 1 
firstRowSearched = 1 
lastRowSearched = 30 

blockBeginning = -1 
For i = firstRowSearched To lastRowSearched 
    If (Cells(i, searchedColumn).Value = searchString) Then 
     If (blockBeginning = -1) Then 
      blockBeginning = i 
     End If 
     blockEnd = i 
    End If 
Next i 

If (blockBeginning = -1) Then 
    MsgBox ("Column <" & searchedColumn & "> does not have any entry with <" & searchString & ">") 
Else 
    Range(Cells(blockBeginning, searchedColumn), Cells(blockEnd, searchedColumn)).Select 
End If 
1

Es ist nicht wirklich eine Schleife brauchen, dies zu tun.

Public Sub SelectBlockRange(searchTerm As String, inColumn As String) 
    Dim rng As Range 
    Dim blockStart As Long, blockLength As Long 

    On Error Resume Next 

    blockStart = CLng(WorksheetFunction.Match(searchTerm, Columns(inColumn), 0)) 
    blockLength = CLng(WorksheetFunction.CountIf(Range(Columns(inColumn).Cells(blockStart), _ 
                 Columns(inColumn).Cells(Rows.Count)), _ 
               searchTerm)) 

    If blockStart > 0 And blockLength > 0 Then 
     Set rng = Range(Columns(inColumn).Cells(blockStart), _ 
         Columns(inColumn).Cells((blockStart + blockLength - 1))) 
     rng.Select 
    End If 
End Sub 

Und dann kann man es so nennen:

SelectBlockRange "Flo", "A" 
+0

Getestet - funktioniert. Guter Ansatz. –

0

Ein weiterer Trick ist, den Wert der Formel und wählen Sie alle Formeln im Bereich

Set columnA = UsedRange.Resize(, 1) 
columnA.Value2 = columnA.Value2  ' optional to convert any formulas to values 
columnA.Replace "Flo", "=""Flo"" " 
columnA.SpecialCells(xlCellTypeFormulas).Select 
columnA.Value2 = columnA.Value2  ' optional to convert the formulas back to values 
Verwandte Themen