2017-05-02 1 views
0

Ich habe ein Dataset, das ein paar tausend Zeilen enthält und ich suche jede Zeile für bestimmten Text innerhalb der Strings: 7-16, 7-26, 7-36, 13414 , SHIPP, CONTAI ... usw. (mehr von ihnen unten gezeigt).InStr - nur in den ersten Teil der Zeichenfolge schauen

Das Problem ist, dass manchmal einige Teilenummern haben "# - ##" am Ende des Teils und nicht am Anfang und so das Makro es auch als "Container/PGSE Part/Trainer" wenn es klassifiziert wirklich nicht.

Also suche ich nach einer Syntax, die nur die ersten 4 Zeichen einer Zeichenkette in der Zelle betrachtet (nur für diejenigen, die die Teilenummern, nicht Wörter enthalten).

Zum Beispiel:

Wenn in einer Zelle mit „26.07 734372-102“ Ich würde suchen waren wollen sie es als „Container/PGSE Part/Trainer“ klassifizieren, in Spalte 51

Wenn in einer Zelle mit „MS3520 26.07 3“ ich nicht möge es klassifiziert sie als „Container/PGSE Teil/Trainer“ in Spalte 51 sehen waren, weil es am Ende der Zeichenfolge.

Sub PGSE_Container_Trainer() 

Dim rw As Integer 

Set sht = ActiveWorkbook.ActiveSheet 

rw = 2 

Do Until sht.Cells(rw, 1) = "" 

If InStr(1, Cells(rw, 8).Value, "7-16") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-26") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-36") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-46") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-56") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-66") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-76") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-86") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "7-96") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "13414") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 9).Value, "CONTAI") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 9).Value, "CNTNR") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 9).Value, "SHIPP") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
ElseIf InStr(1, Cells(rw, 8).Value, "REN") Then 
    sht.Cells(rw, 51) = "Container/PGSE Part/Trainers" 
    GoTo LoopSkip 
End If 

LoopSkip: 
rw = rw + 1 
Loop 

End Sub 
+2

die linke Funktion verwenden. –

+0

Verwenden Sie die Bedingung 'Wenn InStr (1, Zellen (rw, 8) .Wert," 7-16 ") = 1 Then'. Dies wird prüfen, ob '7-16' am Anfang steht. –

Antwort

0

Sie können einen etwas anderen Ansatz verwenden: ersetzen Sie mehrere If s und ElseIf s durch Select Case.

Ersetzen Sie Ihre Instr durch Like und fügen Sie den Platzhalter * am Ende, um nach den ersten 4 Buchstaben zu suchen. z.B. Cells(rw, 8).Value Like "7-16*".

Es gibt einen netten "Trick" zu verwenden Select Case, mit Like und der Wildcard *, siehe in meinem Code unten.

Hinweis: versuchen Sie es mit ActiveSheet zu vermeiden und stattdessen voll qualifed Objekte verwenden, wie Set Sht = Worksheets("Sheet1").

-Code

Option Explicit 

Sub PGSE_Container_Trainer() 

Dim rw As Long 
Dim Sht As Worksheet 
Dim CVal As Variant 

Set Sht = Worksheets("Sheet1") ' it's better to avoid using ActiveSheet 

rw = 2 
With Sht 
    Do Until .Cells(rw, 1) = "" 
     CVal = .Cells(rw, 8).Value 
     Select Case True '<-- the trick to have the `Like` inside the Case 
      Case CVal Like "7-16*", CVal Like "7-26*", CVal Like "7-36*", CVal Like "7-46*", CVal Like "7-56*", _ 
        CVal Like "7-66*", CVal Like "7-76*", CVal Like "7-86*", CVal Like "7-96*", CVal Like "13414*" 
       .Cells(rw, 51) = "Container/PGSE Part/Trainers" 

     End Select 

     ' add more select cases to fit your needs here... 

     rw = rw + 1 
    Loop 
End With 

End Sub 
+0

Perfekt! Vielen Dank! – Adije

0

Wenn das Format immer „# - ##‘ dann so etwas wie: If Instr(1, String, "-") = 2 then

Da Instr die Position Index zurückgibt, können Sie es durch die Anzahl klassifizieren

Sie können. kann auch Folgendes tun: if String like "#-########-##" then

Der gleiche Operator überprüft, ob eine Zeichenfolge ein Muster erfüllt, daher sollten Sie in der Lage sein, dies zu verwenden, um explizit ein Muster zu definieren, und s ee, wenn die Zeichenfolge das angegebene Muster erfüllt. Für weitere Informationen, check this out: https://msdn.microsoft.com/en-us/library/office/gg251796.aspx

Auch, wenn Sie die ersten drei Zeichen zu einem Teil explizit übereinstimmen wollten man so etwas tun könnte:

If Left(String, 3) = SubString then

Zum Beispiel:

Dim SearchString as String: SearchString = "1-2-3_IsThisThingOn" 
Dim SubString as String: SubString = "1-2-3" 

' Returns "1-2-3" 
Debug.Print Left(SearchString, 5) 

' Returns true 
Debug.Print Left(SearchString, 5) = "1-2-3" 

SubString = "4-5-6" 

'Returns false 
Debug.Print Left(SearchString, 5) = "1-2-3" 
Verwandte Themen