web-dev-qa-db-de.com

Löschen Sie den Inhalt von Zellen in VBA mithilfe der Spaltenreferenz

Ich versuche, einen Code zu erhalten, um die Daten in einigen Zellen mithilfe der Spaltenverweise zu löschen. Ich verwende den folgenden Code:

Worksheets(sheetname).Range(.Cells(2, LastColData), .Cells(LastRowData, LastColData)).ClearContents

Dafür bekomme ich jedoch beim ersten Abschnitt .Cells einen Fehler. Warum ist das so?

10
dojogeorge

Sie können auf die gesamte Spalte als Bereich mit dem Worksheet.Columns-Objekt zugreifen

So etwas wie: 

Worksheets(sheetname).Columns(1).ClearContents 

sollte den Inhalt einer A-Spalte löschen

Es gibt auch das Worksheet.Rows-Objekt, wenn Sie für Zeilen etwas Ähnliches tun müssen


Der Fehler, den Sie erhalten, ist wahrscheinlich auf einen fehlenden Block zurückzuführen.

Sie können hier über Blöcke lesen: Microsoft-Hilfe

23
Sam

Wie Garys Student erwähnt hat, müssten Sie den Punkt vor Cells entfernen, damit der Code so funktioniert, wie Sie ihn ursprünglich geschrieben haben. Ich kann nicht sicher sein, da Sie nur eine einzige Codezeile enthalten haben, aber der Fehler, den Sie beim Löschen der Punkte erhalten haben, hat möglicherweise etwas mit der Definition Ihrer Variablen zu tun. 

Ich habe Ihre Codezeile mit den als Ganzzahlen definierten Variablen ausgeführt und es hat funktioniert:

Sub TestClearLastColumn()

    Dim LastColData As Long
        Set LastColData = Range("A1").End(xlToRight).Column

    Dim LastRowData As Long
        Set LastRowData = Range("A1").End(xlDown).Row

    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents

End Sub

Ich glaube nicht, dass eine With-Anweisung für die Codezeile geeignet ist, die Sie freigegeben haben. Wenn Sie jedoch eine solche verwenden würden, würde die With am Anfang der Zeile stehen, die das zu manipulierende Objekt definiert. Hier wird Ihr Code mit einer unnötigen With-Anweisung umgeschrieben:

With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData))
    .ClearContents
End With

With-Anweisungen sollen Sie vor dem erneuten Eingeben von Code schützen und das Lesen der Codierung erleichtern. Es ist sinnvoll und sinnvoll, wenn Sie mit einem Objekt mehr als eine Sache tun. Wenn Sie beispielsweise auch die Spalte rot machen und einen dicken schwarzen Rand hinzufügen möchten, können Sie eine With-Anweisung wie folgt verwenden:

With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData))
    .ClearContents
    .Interior.Color = vbRed
    .BorderAround Color:=vbBlack, Weight:=xlThick
End With

Andernfalls müssten Sie den Bereich für jede Aktion oder Eigenschaft wie folgt angeben:

    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents
    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).Interior.Color = vbRed
    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).BorderAround Color:=vbBlack, Weight:=xlThick

Ich hoffe, das gibt Ihnen ein Gefühl dafür, warum Garys Student der Meinung war, dass der Compiler eine With erwartet (obwohl dies unangemessen war) und wie und wann eine With in Ihrem Code nützlich sein kann.

1

Ich habe gerade diese sehr einfache Methode entwickelt, ein ganzes Blatt zu löschen.

Sub ClearThisSheet()

ActiveSheet.UsedRange.ClearContents

End Sub
1
Don Leverton

Um alle Zeilen mit Daten zu löschen, verwende ich zwei Variablen wie diese. Ich mag das, weil Sie es an einen bestimmten Bereich von Spalten anpassen können, wenn Sie ..__ brauchen. Dim CRow As Integer Dim LastRow As Integer

CRow = 1
LastRow = Cells(Rows.Count, 3).End(xlUp).Row

Do Until CRow = LastRow + 1
    Cells(CRow, 1).Value = Empty
    Cells(CRow, 2).Value = Empty
    Cells(CRow, 3).Value = Empty
    Cells(CRow, 4).Value = Empty
    CRow = CRow + 1
Loop
0
Kitten

Für jeden wie mich, der auf dieses Problem gestoßen ist und eine Lösung braucht, die keine Überschriften enthält, ist hier der eine Liner, der für mich funktioniert:

ActiveSheet.Range("A3:A" & Range("A3").End(xlDown).Row).ClearContents

Beginnt in der dritten Reihe - ändern Sie nach Ihren Wünschen.

0
Eric Sloan

Sie benötigen vorher eine With -Anweisung. Oder machen Sie die .Cells in Cells

0
Gary's Student

Das Problem betrifft nicht die with-Anweisung, sondern die Range-Funktion. Es akzeptiert nicht den absoluten Zellenwert. Es sollte sich wie Range ("A4: B100") befinden. . 

der folgende Code sollte funktionieren .. Konvertiert Zellen (1,1) in "A1" und umgekehrt

LastColData = Sheets(WSNAME).Range("A4").End(xlToRight).Column
            LastRowData = Sheets(WSNAME).Range("A4").End(xlDown).Row
            Rng = "A4:" & Sheets(WSNAME).Cells(LastRowData, LastColData).Address(RowAbsolute:=False, ColumnAbsolute:=False)

 Worksheets(WSNAME).Range(Rng).ClearContents
0
Rav

Ich fand dies eine einfache Art der Reinigung in einer Form zwischen der gewünschten Reihe und Spalte. Ich bin mir nicht sicher, ob Sie das suchen. Ich hoffe es hilft.

Sub sbClearCellsOnlyData()
Range("A1:C10").ClearContents
End Sub
0
Zapata