2017-06-08 3 views
1

Ich habe ein Excel-Blatt mit mehreren Zellen mit einer Zeichenfolge foo in der ersten Zeile. Ich möchte die erste und letzte Spalte finden, in der die Zeichenfolge geschrieben wird. Ich habe versucht, die folgendenFinden der ersten und letzten Eintrag mit einem bestimmten Wert in einer Zeile

Dim first_col As Integer 
Dim last_col As Integer 
Dim col As Integer 
Dim found As Range 
Dim ws_MLB as Worksheet 
Dim foo as String 

set ws_MLB = ThisWorkbook.Sheet(1) 

Set found = ws_MLB.Rows(1).Find(foo) 
If Not found Is Nothing Then 
    col = found.Column 
    first_col = col 
    last_col = col 
    Do 
     found = ws_MLB.Rows(1).FindNext(found) 
     col = found.Column 

     If col < first_col Then 
      first_col = col 
      MsgBox ("This should not happen") 
     ElseIf col > last_col Then 
      last_col = col 
     End If 
    Loop While Not found Is Nothing And col <> first_col 
Else 
    MsgBox ("not found") 
End If 

Aber auf diese Weise ich nur die den ersten Wert für beide first_col und last_col bekommen. Wenn ich mit der integrierten Excel-Suche nach der Zeichenfolge suche, finde ich mehrere Instanzen. Also ist die Schnur da. Habe ich einen Fehler gemacht oder gibt es einen besseren Weg?

Bearbeiten vergessen zu erwähnen, dass ich auch versucht, die Suchrichtung zu ändern, aber ich habe immer noch den ersten Eintrag.

+0

.find ist wunderbar und all das, aber wäre es nicht einfacher, nur für die nächste Schleife zu verwenden? Beginne vorne und schaue in jede Zelle, bis du foo findest, dann beginne am Ende und arbeite rückwärts (für x = letzte Zelle bis 1 Schritt -1), bis du die letzte findest. – Hrothgar

+0

Soweit ich festgestellt habe, ist das Finden viel schneller als das Iterieren. http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/. In diesem Fall könnte es schneller sein, aber ich wollte mich daran gewöhnen, dass ich es nicht mehr finde, aber es hat einfach nicht funktioniert. –

+0

Ja, ohne Zweifel ist das Finden schneller als für/als nächstes, aber wirklich, wie breit kann es sein? Ich habe versucht, in letzter Zeit auch mehr zu finden, wenn auch bisher nur für vertikale Listen. Möglicherweise müssen Sie jedes Mal mehr Optionen aufrufen. Dies ist eine typische Art, wie ich find aufrufen ... Setze FindCell = shSrc.Range ("A1", shSrc.Cells (shBottom, "A")). Finde (Was: = StrValue, nach: = shc.Range ("A1 „), schau: = Special xlValues, LookAt: = xlPart) wenn FindCell Nichts ist dann 'eine Sache Else ' das andere tun Ende, wenn – Hrothgar

Antwort

-1

Ich würde das wie folgt tun:

Public Sub foo() 
    Dim nCol As Integer 
    Dim nFirst As Integer 
    Dim nLast As Integer 

    With ActiveSheet 
    nCol = 1 
    Do Until .Cells(1, nCol) = "" 
     If .Cells(1, nCol) = "foo" Then 
     If nFirst = 0 Then 
      nFirst = nCol 
     Else 
      nLast = nCol 
     End If 
     End If 
     nCol = nCol + 1 
    Loop 
    End With 

    MsgBox "First: " & nFirst & vbCr & "Last: " & nLast 
End Sub 
+0

Gut, das die Brute-Force-Ansatz versucht, ich zu vermeiden. Finden wird verwendet, dass Sie es nicht so machen müssen. –

1

Sie können diese viel einfacher machen, indem Sie den SearchDirection Parameter in .Find Verwendung von xlNext verwenden Sie nach rechts dann xlPrevious Suche nach links rechts links suchen.

Sub FindFL() 

    Dim wbk As Workbook 
    Dim ws As Worksheet 
    Dim fColumn As Long, lColumn As Long 

    Set wbk = ThisWorkbook 'Change this to your workbook 
    Set ws = wbk.Worksheets("Sheet1") 'Change this to your worksheet 

    With ws 
     'Find first column that foo shows up 
     fColumn = .Cells.Find(What:="foo", _ 
      After:=.Cells(1, 1), _ 
      LookIn:=xlValues, _ 
      LookAt:=xlWhole, _ 
      SearchOrder:=xlByColumns, _ 
      SearchDirection:=xlNext, _ 
      MatchCase:=False).Column 
     'Find last column that foo shows up 
     lColumn = .Cells.Find(What:="foo", _ 
      After:=.Cells(1, 1), _ 
      LookIn:=xlValues, _ 
      LookAt:=xlWhole, _ 
      SearchOrder:=xlByColumns, _ 
      SearchDirection:=xlPrevious, _ 
      MatchCase:=False).Column 

     Debug.Print "First Column is " & fColumn; vbNewLine _ 
     ; "Last Column is " & lColumn 
    End With 
End Sub 
+0

yeah vergaß zu sagen, dass ich die Richtung Sache versuchte. Ganz ähnlich habe ich noch den ersten Eintrag bekommen. –

+0

@KamiKaze Haben Sie den obigen Code ausprobiert? Es hat für mich funktioniert, als ich es getestet habe. – BerticusMaximus

Verwandte Themen