2017-11-29 2 views
0

Ich schreibe ein Skript, das, wenn eine Zelle in Spalte M von Sheet2 zu "Special" geändert wird, die Zeilennummer dieser Zelle in Spalte B von Sheet12 kopiert wird. Wenn die Zeilennummer die größte in der Spalte ist, wird sie am Ende hinzugefügt. Wenn nicht, wird eine Zeile aus einer Vorlagenzeile kopiert und (zusammen mit der Zeilennummer) eingefügt, so dass alle Zahlen in Spalte B sequenziell sind.Suchen nach leeren Zellen in einer Schleife

Der Code zum Einfügen/Kopieren von Mid-Sequence-Nummern funktioniert gut, aber es funktioniert nicht, um die größte Zahl am Ende hinzuzufügen. Ich bekomme keinen Fehler; es funktioniert einfach nicht. Hier ist der Code (in Tabelle2):

If Target.column = 13 Then 

    Dim cell As Integer 
    Dim l As Long 

    cell = ActiveCell.Row 

    If ActiveCell.Value = "Special" Then 
     With Sheet12 
      For l = .Cells(rows.count, "B").End(xlUp).Row To 3 Step -1 
       If .Cells(l, 2).Value = vbNullString And .Cells(l - 1, 2).Value < cell Then 
        Sheet12.Cells(l, 2).Value = cell 
       ElseIf .Cells(l, 2).Value > cell And .Cells(l - 1, 2).Value < cell Then 
        Sheet12.Cells(l, 2).EntireRow.Insert shift:=xlDown 
        Sheet12.Range("A3").EntireRow.Copy Sheet12.Cells(l, 2).EntireRow 
        Sheet12.Cells(l, 2).Value = cell 
       End If 
      Next 
     End With 
    End If 
End If 

Der Teil des Codes, der geändert werden muss, ist If .Cells(l, 2).Value = vbNullString And .Cells(l - 1, 2).Value < cell Then. Ich habe verschiedene Möglichkeiten ausprobiert, nach einer leeren Zelle zu suchen (d. H. Isempty(), "" usw. zu verwenden) und die Zellen mit Blattnamen unterschiedlich zu referenzieren. Irgendwelche Ideen? Vielen Dank im Voraus für Ihre Hilfe!

+1

Warum Schleife für Zelle? 'GoTo> Spezielle Zellen' kann in VBA verwendet werden: http://www.ozgrid.com/VBA/special-cells.htm –

+0

Ich denke, ich muss Zelle für Zelle durchlaufen, weil es zuerst überprüft werden muss, um zu sehen, ob Die Nummer befindet sich zwischen vorhandenen Zahlen (um ein Skript zum Kopieren/Einfügen auszuführen) oder dem größten (am Ende einfach hinzuzufügen). – Kim

+1

Es ist nicht notwendig, alles auf einmal zu tun, Sie versuchen, den Platz zu finden, wo Sie den neuen Wert in Spalte B einfügen sollten, eine einfachere Methode ist, es am Ende der Spalte B hinzuzufügen und dann nach Wunsch zu sortieren – Ibo

Antwort

0

Das Problem besteht darin, dass die Schleife bei den ersten nicht leeren Zellen in Spalte B gestartet wurde. Daher konnte dieser Wert nicht als vbnullstring verwendet werden. Im Folgenden arbeitet Code:

If Target.column = 13 Then 

    Dim cell As Long 
    Dim l As Long 

    cell = ActiveCell.Row 

    If ActiveCell.Value = "Special" Then 
     If Sheet12.[B4].Value = vbNullString Then 
      Sheet12.[B4].Value = cell 
     Else 
      With Sheet12 
       For l = .Cells(rows.count, "B").End(xlUp).Row + 1 To 4 Step -1 
        If .Cells(l, 2).Value = vbNullString And .Cells(l - 1, 2).Value < cell Then 
         Sheet12.Cells(l, 2).Value = cell 
         Exit For 
        ElseIf .Cells(l - 1, 2).Value > cell And .Cells(l - 2, 2).Value < cell Then 
         Sheet12.Cells(l - 1, 2).EntireRow.Insert shift:=xlDown 
         Sheet12.Range("A3").EntireRow.Copy Sheet12.Cells(l - 1, 2).EntireRow 
         Sheet12.Cells(l - 1, 2).Value = cell 
         Exit For 
        End If 
       Next 
      End With 
     End If 
    ElseIf ActiveCell.Value = vbNullString Or ActiveCell.Value = "Normal" Then 
      With Sheet12 
       For l = .Cells(rows.count, "B").End(xlUp).Row To 4 Step -1 
        If .Cells(l, 2).Value = cell Then 
         .Cells(l, 2).EntireRow.Delete 
        End If 
       Next 
      End With 
    End If 
End If 

Hinweis: Dies ist nicht die effizienteste Art und Weise auszuführen, wie sie in den Kommentaren erwähnt; Wenn jedoch jemand ein ähnliches Problem hat, wollte ich den Fix erklären.

Verwandte Themen