2016-11-08 11 views
0

Ich versuche, ein Arbeitsblatt, das wir täglich verwenden, neu zu erstellen und dabei schneller zu machen. Ich habe jetzt mit Bereichen gearbeitet und versucht, diese zu integrieren, aber lief ein Problem, wenn ich versuche, UsedRange zu verwenden, um die letzte Zeile für den Bereich zu erhalten, als es zu finden.Typenkonflikt im Bereich für Schleife

Mein Code:

Sub RebuildAllFormat() 

Dim SheetRNG As Range, RowDelete As Range, SOSheet As Worksheet 

Set SOSheet = ThisWorkbook.Worksheets(Sheet1.Name) 

Set SheetRNG = SOSheet.UsedRange.Columns(1) 

For Each cell In SheetRNG 
    If cell.Value = "" Then 
     Cells(cell.Row, "P").Cut Cells(cell.Row - 1, "P") 
       If Not RowDelete Is Nothing Then 
        Set RowDelete = Union(RowDelete, cell) 
       Else 
        Set RowDelete = cell 
       End If 
    End If 
Next cell 

RowDelete.EntireRow.Delete 

End Sub 

Der obige Code gibt mir die „Type Mismatch“ Fehler auf If cell.Value = "" Then und es scheint, dass die For-Schleife nicht mehr jede Zelle durchläuft, obwohl ich den Erwartungswert von Debug.Print SheetRNG.Address erhalten die ist $ A $ 1: $ A $ 1736.

Wenn ich Set SheetRNG = SOSheet.UsedRange.Columns(1) mit

lastrow = SOSheet.Cells(Rows.Count, "B").End(xlUp).Row 

Set SheetRNG = SOSheet.Range(SOSheet.Range("A1"), SOSheet.Cells(lastrow, "A")) 

ersetzen dann arbeitet die Schleife wie erwartet und ich bin in der Lage Werte zu überprüfen. Running Debug.Print SheetRNG.Address nach der Verwendung der oben genannten gibt auch $ A $ 1: $ A $ 1736.

Fehle ich etwas in der UsedRange-Code oder ist es nicht möglich, es so zu verwenden?

+1

Ihr Kommentar „Der obige Code gibt mir die‚Type Mismatch‘Fehler auf Wenn cell.Value =‚‘Then und es scheint, dass die For-Schleife nicht mehr jede Zelle durchläuft“ verwirrt mich - Woher weißt du, dass es nicht mehr durch jede Zelle läuft, wenn die erste Zeile einen Fehler gibt? Oder ist es ein Fall der Linie gibt nur manchmal einen Fehler (z. B. wenn eine der Zellen in Spalte A hat einen Fehlerwert von irgendeiner Art)? Was ist der Wert von 'cell.Row' wenn es abstürzt? – YowE3K

+0

Ohne etwas in der For-Schleife, es läuft nur einmal statt der erwarteten 1736-mal. Wenn ich 'cell.row' in die Schleife setze, erhalte ich die erwartete Zeile, wenn sie ausgeführt wird. Ich habe vergessen, 'Debug.Print' das erste Mal damit den Fehler zu platzieren. – tjb1

+0

Wenn ich 'cell.address' drucke, dann bekomme ich $ A $ 1: $ A $ 1736 statt 1 Zelle. – tjb1

Antwort

1

Wie andere gesagt haben, und Sie selbst identifiziert, ist das Problem, dass For Each cell In SheetRNG kehrt die ganze ranhe zu cell.

Verwenden Sie For Each cell In SheetRNG.Cells, um jede Zelle einzeln zu erhalten.

Es gibt weitere Probleme im Code. Siehe unten Kommentare zu reccomendations

Sub RebuildAllFormat() 
    Dim SheetRNG As Range, RowDelete As Range, SOSheet As Worksheet 
    Dim cell as Range '<~~ Dim all variables 

    Set SOSheet = Sheet1 '<~~ Sheet1 is already a Worksheet reference 

    Set SheetRNG = SOSheet.UsedRange.Columns(1) '<~~ May overstate the required range, but will work OK 

    For Each cell In SheetRNG.Cells 
     If cell.Value = "" Then 
      '~~ Qualify the Sheet reference, otherwise it refers to the active sheet 
      With SOSheet 
       .Cells(cell.Row - 1, "P") = .Cells(cell.Row, "P") '<~~ faster than Cut/Paste 
       If Not RowDelete Is Nothing Then 
        Set RowDelete = Union(RowDelete, cell) 
       Else 
        Set RowDelete = cell 
       End If 
      End With 
     End If 
    Next cell 

    '~~ Avoid error if no blanks found 
    If Not RowDelete Is Nothing Then 
     RowDelete.EntireRow.Delete 
    End If 
End Sub 
0

Die .Columns(1) Anweisung funktioniert nicht so, wie Sie sie verwendet haben. Zum Beispiel:

Set SheetRNG = Range("A1:B19").Columns(1) 

ist nicht das gleiche wie:

Set SheetRNG = Range("A1:A19") 

Sie können .Resize() diese .UsedRange.

Set SheetRNG = SOSheet.UsedRange.Resize(SOSheet.UsedRange.Rows.Count, 1) 
+1

Eigentlich 'Bereich (" A1: B19 "). Spalten (1)' und 'Bereich (" A1: A19 ")' _are_ äquivalent. Eigenschaften wie 'Spalte' sind _relative_ zum angegebenen Bereichsobjekt. –

+0

@chris neilsen, geben Sie 'Set rng1 = Range (" A1: B19 ") ein. Spalten (1)' und 'Set rng2 = Range (" A1: A19 ")', vergleichen Sie beide im Locals Window. Sie sind ähnlich, unterscheiden sich aber in einigen Parametern. – Limak

Verwandte Themen