2016-07-01 18 views
2

enter image description hereenter image description hereenter image description hereFinding Index der Zeichenfolge in String-Array

Dieses Programm entfernt eine Zeichenfolge aus einem Array zu einem neuen Blatt. Ich finde die Zeichenfolge 'Hallo' oder 'Tschüss', aber ich möchte auch die Zeichenfolge im Index vor jeder dieser Zeichenfolgen. Die Zeichenfolge vor "Hallo" oder "Tschüss" wird nicht immer die gleiche sein, also wie kann ich die Index() Funktion verwenden?

Sub SplitWithFormat() 
 
    Dim R As Range, C As Range 
 
    Dim i As Long, V As Variant 
 
    Dim varHorizArray As Variant 
 
    Dim rge As Range 
 
    Dim intCol As Integer 
 
    
 
Set R = Range("d1", Cells(Rows.Count, "d").End(xlUp)) 
 
For Each C In R 
 
    With C 
 
     .TextToColumns Destination:=.Range("AD1"), DataType:=xlDelimited, _ 
 
     consecutivedelimiter:=True, Tab:=False, semicolon:=True, comma:=False, _ 
 
     Space:=True, other:=True, Otherchar:=vbLf 
 

 
     Set rge = Selection 
 
     varHorizArray = rge 
 
     .Copy 
 
     Range(.Range("AD1"), Cells(.Row, Columns.Count).End(xlToLeft)).PasteSpecial xlPasteFormats 
 
    End With 
 
Next C 
 

 
Application.CutCopyMode = False 
 

 
    For intCol = LBound(varHorizArray, 2) To UBound(varHorizArray, 2) 
 
     Debug.Print varHorizArray(1, intCol) 
 
    Next intCol 
 
    
 
     
 
    With Application 
 
     .ScreenUpdating = False 
 
     .EnableEvents = False 
 
    End With 
 
    varHorizArray = Array("bye","hello") 
 
    Set NewSh = Worksheets.Add 
 

 
    With Sheets("Sheet2").Range("AD1:AZ100") 
 

 
     Rcount = 0 
 

 
     For i = LBound(varHorizArray) To UBound(varHorizArray) 
 

 
      
 
      Set Rng = .find(What:=varHorizArray(i), _ 
 
          After:=.Cells(.Cells.Count), _ 
 
          LookIn:=xlFormulas, _ 
 
          LookAt:=xlPart, _ 
 
          SearchOrder:=xlByRows, _ 
 
          SearchDirection:=xlNext, _ 
 
          MatchCase:=False) 
 
      If Not Rng Is Nothing Then 
 
       FirstAddress = Rng.Address 
 
       Do 
 
        Rcount = Rcount + 1 
 

 
        Rng.Copy NewSh.Range("A" & Rcount) 
 

 
        
 
        NewSh.Range("A" & Rcount).Value = Rng.Value 
 

 
        Set Rng = .FindNext(Rng) 
 
       Loop While Not Rng Is Nothing And Rng.Address <> FirstAddress 
 
      End If 
 
     Next i 
 
    End With 
 

 
    With Application 
 
     .ScreenUpdating = True 
 
     .EnableEvents = True 
 
    End With 
 

 
End Sub

+1

Ich bin nicht sicher, ich verstehe. Können Sie sowohl die aktuellen als auch die erwarteten Ergebnisse einbeziehen? –

+0

'dim s als String: s = left (1, Bereich (" d1 "). Value,", hallo ", vbtextcompare))' sollte es tun. Siehe [InStr-Funktion] (https://msdn.microsoft.com/en-us/library/8460tsh1.aspx), um die Position eines Suchbegriffs innerhalb einer längeren Zeichenfolge zurückzugeben. – Jeeped

+0

Ich habe die Frage @ Zieldaten aktualisiert. Das erwartete Ergebnis wäre der Name, der vor der Zeichenfolge auf dem neuen Blatt steht. – johndoe253

Antwort

2

Während die InStr function typischerweise einen Teil lokalisieren verwendet wird, können besser in einem String, Ihre mehr Suchbegriffe mit den Split function behandelt.

Option Explicit 

Sub stripName() 
    Dim rw As Long 

    With ActiveSheet 
     For rw = 1 To .Cells(Rows.Count, "D").End(xlUp).Row 
      .Cells(rw, "A") = Split(Split(.Cells(rw, "D").Value2, ", hello")(0), ", bye")(0) 
     Next rw 
    End With 

End Sub 

Beachten Sie, dass die Suchbegriffe, die für den Split verwendet werden, die Groß- und Kleinschreibung beachten.

split_names

Nachtrag für überarbeitete Frage:

Option Explicit 

Sub stripName() 
    Dim rw As Long, s As String 

    With ActiveSheet 
     For rw = 1 To .Cells(Rows.Count, "D").End(xlUp).Row 
      s = Split(.Cells(rw, "D").Value2, ", bye")(0) 
      s = Split(s, ", hello")(0) 
      s = Split(Chr(32) & s, Chr(32))(UBound(Split(Chr(32) & s, Chr(32)))) 
      .Cells(rw, "A") = s 
     Next rw 
    End With 

End Sub 

split_names2

+0

Ich schätze die Hilfe. Das sind Beispieldaten, aber wenn ich mehr Strings in dieser Zelle hätte, wie würde ich das "Hallo" oder "Tschüss" zusammen mit dem Wort davor entfernen, wenn es gerade in der Mitte einer Zelle voller Strings wäre? – johndoe253

+1

Siehe mein Addendum oben. Bitte überarbeiten Sie Ihre ursprüngliche Frage oder schreiben Sie eine neue Frage. Vermeide es, dies zu einer [russischen Puppenfrage] zu machen (http://meta.stackexchange.com/questions/188625). – Jeeped

+0

Ich schätze die Hilfe. Ich werde später eine neue Frage stellen und Ihre Methode ausprobieren. – johndoe253

Verwandte Themen