2017-03-09 2 views
-2

Ich habe eine for-Schleife erstellt, um Werte in Zellen in Sheet1 zu finden und sie in Sheet2 zu kopieren/einzufügen. Problem ist, wenn der Wert nicht da ist, wird es nur zurück in die Loop-Liste gehen. Zum Beispiel, sobald ich zu "Anna" komme, weil sie in Sheet1 nicht existiert, geht es die ganze Liste zurück bis zu Jerry. Ich möchte, dass es von Jerry zu John geht. Wenn Anna, existiert nicht, dann überspringen sie.For Schleife Überspringen von Werten

Sheets("Sheet1").Select 

     For b = 1 To 35 

      If Cells(1, b) = "Jerry" Then 
          Columns(b).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("A:A").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 

Sheets("Sheet1").Select 

     For c = 1 To 35 

      If Cells(1, c) = "Bob" Then 
          Columns(c).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("B:B").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 

Sheets("Sheet1").Select 

     For d = 1 To 35 

      If Cells(1, d) = "Larry" Then 
          Columns(d).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("C:C").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 

Sheets("Sheet1").Select 

     For e = 1 To 35 

      If Cells(1, e) = "Steve" Then 
          Columns(e).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("E:E").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 


Sheets("Sheet1").Select 

     For f = 1 To 35 

      If Cells(1, f) = "Wilson" Then 
          Columns(f).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("I:I").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 


Sheets("Sheet1").Select 

     For g = 1 To 35 

      If Cells(1, g) = "Anna" Then 

          Columns(g).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("P:P").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 


Sheets("Sheet1").Select 

     For h = 1 To 35 

      If Cells(1, h) = "Kevin" Then 
          Columns(h).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("Q:Q").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 

Sheets("Sheet1").Select 

     For i = 1 To 35 

      If Cells(1, i) = "Gary" Then 
          Columns(i).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("X:X").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 


Sheets("Sheet1").Select 

     For j = 1 To 35 

      If Cells(1, j) = "John" Then 
          Columns(j).Select 
          Selection.Copy 
          Sheets("Sheet2").Select 
          Columns("R:R").Select 
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
          :=False, Transpose:=False 
          Application.CutCopyMode = False 

          Sheets("Sheet1").Select 

End If 
Next j 
End If 
Next i 
End If 
Next h 
End If 
Next g 
End If 
Next f 
End If 
Next e 
End If 
Next d 
End If 
Next c 
End If 
Next b 
+5

Wie Sie wissen, ob es Elemente Skipping ist? Mit den Loops von 35 ineinander verschachtelten 9 Levels sind das 78.815.638.671.875 Iterationen. Es ist wahrscheinlich nur nicht abgeschlossen (ich weiß, weil wir den Hitzetod des Universums noch nicht erfahren haben). – Comintern

+0

@Der Code ist ein Chaos, aber die verschachtelten Schleifen sind bedingt, daher ist es möglich, dass der gesamte Code in angemessener Zeit ausgeführt wird. Das heißt, es gibt natürlich sicherlich eine weniger komplizierte Art und Weise zu tun, was OP versucht zu tun (obwohl nur das, was das ist, nicht sehr klar ist). –

+0

Im angegebenen Code ist das _search_ für die _values_ auf den Bereich 'A1: AI1' beschränkt. Das ist deine Absicht? – EEM

Antwort

1

Unter der Annahme, dass (in Übereinstimmung mit dem Code versehen):

Ziel für eine Liste von Werten in Bereich zu suchen ist A1:AI1 von Sheet1(Zielbereich), wenn der Wert gefunden Kopieren Sie die gesamte Spalte, in der der Wert gefunden wurde, in die entsprechende Spalte in Sheet2. Keiner der Werte in der Liste sollte im Zielbereich dupliziert werden. Wenn dies der Fall ist, wird nur auf das erste Vorkommen reagiert.

Der folgende Code verwendet ein Array, um die Liste der zu findenden Werte und die Spalten, in denen die Kopie erstellt werden soll, in Sheet2 zu speichern. Es durchläuft die Werteliste, dann durchläuft der Zielbereich, wenn der Wert gefunden wird, die Kopie und verlässt die zweite Schleife, um ein Überschreiben der zuvor gefundenen Werte zu vermeiden.

Sub For_And_Copy() 
Dim aValCol As Variant 
aValCol = [{"Jerry","A:A";"Bob","B:B";"Larry","C:C";"Steve","E:E";"Wilson","I:I";"Anna","P:P";"Kevin","Q:Q";"Gary","X:X";"John","R:R"}] 
Dim Wsh1 As Worksheet, Wsh2 As Worksheet 
Dim b1 As Byte, b2 As Byte 
    With ThisWorkbook 
     Set Wsh1 = .Sheets("Sheet1") 
     Set Wsh2 = .Sheets("Sheet2") 
    End With 
    For b1 = 1 To UBound(aValCol) 
     For b2 = 1 To 35 
      If Wsh1.Cells(1, b2).Value2 = aValCol(b1, 1) Then 
       Wsh1.Columns(b2).Copy 
       Wsh2.Columns(aValCol(b1, 2)).PasteSpecial Paste:=xlPasteValues 
       Application.CutCopyMode = False 
       Exit For 'Exits the b2 For...Next so values found are copied only once 
    End If: Next: Next 
End Sub 

In Bezug auf Ihren Code, würde Ihnen nur sagen, dass es zu viele unnötige verschachtelte For..Next hat. Lesen Sie die vorgeschlagenen Seiten, vergleichen Sie den bereitgestellten Code. Lassen Sie mich wissen, wenn Sie Fragen zum Code haben.

Schlagen auf den folgenden Seiten zu lesen, um ein tieferes Verständnis der verwendeten Ressourcen zu gewinnen:

Excel Objects, Using Arrays, With Statement, For...Next Statement

Verwandte Themen