Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: List.Objects best. Spalten löschen

List.Objects best. Spalten löschen
13.08.2013 09:33:27
Nette13
Hallo zusammen,
am liebsten arbeite ich mit listobjects in meinen VBA's. Allerdings komme ich nun an einer Stelle nicht weiter. Mein listobject heißt "OrderLines". Nun möchte ich alle Spalten in diesem Object löschen, die den Namen "Column" enthalten.
Sub SpaltenLoeschen()
Dim vLetzteSpalte%, i%
vLetzteSpalte = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
Application.ScreenUpdating = False
For i = vLetzteSpalte To 1 Step -1
If Not Cells(1, i)  "Column*" Then
Cells(1, i).EntireColumn.Delete
End If
Next i
Application.ScreenUpdating = True
End Sub
Allerdings funktioniert das ganze irgendwie nicht, weil ich sicher noch irgendwie das Listobject bezeichnen muss.
Hat irgendjemand von Euch eine Idee, wie ich das einbauen muss.
Vielen Dank
Annette

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: List.Objects best. Spalten löschen
13.08.2013 10:53:10
Beverly
Hi Anette,
versuche es mal so:
Sub SpaltenLoeschen()
Dim vLetzteSpalte%, i%
Dim objListObj As ListObject
Dim objListCols As ListColumns
vLetzteSpalte = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
Application.ScreenUpdating = False
Set objListObj = ActiveSheet.ListObjects("OrderLines")
Set objListCols = objListObj.ListColumns
For i = vLetzteSpalte To 1 Step -1
If Not Left(objListCols(i).Name, 6)  "Column" Then
objListCols(i).Delete
End If
Next i
Application.ScreenUpdating = True
End Sub


Anzeige
AW: List.Objects best. Spalten löschen
13.08.2013 11:07:20
Nette13
Karin, vielen Dank. Yippieeeee. Es hat funktioniert. Kannst Du mir erklären was If Not Left(objListCols(i).Name, 6) macht? Ich meine, was bedeutet die 6?
Danke
Annette

AW: List.Objects best. Spalten löschen
13.08.2013 11:21:44
Beverly
Hi Anette,
die linken 6 Zeichen der Spaltenüberschrift der laufenden ListObject-Spalte sind verschieden von "Column" - also nicht löschen wenn dfie linken 6 Zeichen verschieden von "Column" sind. Natürlich kann man das auch etwas unkomplizierter schreiben, ohne doppelte Verneinung:
If Left(objListCols(i).Name, 6) = "Column" Then


Anzeige
AW: List.Objects best. Spalten löschen
13.08.2013 11:38:41
Nette13
Vielen Dank. Ah, ja klar. Ist auch auch bei "normalen" Formeln so.
Nochmals danke. Auch dir Luschi.
Gruß
Annette

AW: List.Objects best. Spalten löschen
13.08.2013 12:51:48
Luschi
Hallo nette Annette,
Karins Code ist noch sehr altlastig aus Zeiten von Excel 2002 (XP)und vorher.
Wenn das ListObject nicht in Spalte 'A' beginnt oder in eine andere Tabelle verschoben wird, beginnen schon die Probleme und der Vba-Code muß angepaßt werden.
Mit den neuen Möglichkeiten, die ich in meinem Code verwende, ist das Programm
resistent gegen solche manuellen Veränderungen: Denn es interessiert nicht, in welcher Tabelle das Objekt liegt und wo die Spaltenüberschriften zu finden sind.
Schau dazu mal in der Vba-Hilfe unter folgendem Stichpunkt nach: 'Elemente des ListObject-Objekts'.
So kann man mit DataBodyRange.Cells(1,1) auf die 1. Zelle im Datenbereich zugreifen, ohne daß man konkret die Zelladresse kennen muß.
Viel Spaß beim Stöbern wünscht Luschi
aus klein-Paris

Anzeige
AW: List.Objects best. Spalten löschen
13.08.2013 13:19:45
Beverly
Hi Anette,
bei der Spaltenermittlung war ich nur von deinem Ursprungscode ausgegangen.
Es geht auch bei meinem Code zu berücksichtigen, dass das ListObjekt nicht in A1 beginnt und nichts muss angepasst werden - der Basiscode für die Spalten des ListObjects entstammt der VBA-Hilfe von Excel2010 (zu finden unter: ListObject.ListColumns-Eigenschaft) und nicht der von Excel2002.
Sub SpaltenLoeschen()
Dim i%
Dim objListObj As ListObject
Dim objListCols As ListColumns
Application.ScreenUpdating = False
Set objListObj = ActiveSheet.ListObjects("OrderLines")
Set objListCols = objListObj.ListColumns
For i = objListCols.Count To 1 Step -1
If Left(objListCols(i).Name, 6) = "Column" Then
objListCols(i).Delete
End If
Next i
Application.ScreenUpdating = True
End Sub


Anzeige
AW: List.Objects best. Spalten löschen
13.08.2013 21:42:00
Luschi
Hallo Karin,
wer das Objekt 'ListObject' verwendet, sollte sich auch die neuen Methoden diese Objektes anschauen, um seinen Vba-Code effektiver zu gestalten. Dazu gehören eben auch 'HeaderRowRange' & 'DataBodyRange'.
Schon diese Befehlszeile:
Set objListObj = ActiveSheet.ListObjects("OrderLines")
führt zu einem Fehler, wenn das aktuell angezeigte Worksheet dieses Listobjekt nicht enthält sondern per Hand/Maus in eine andere Tabelle portiert wurde.
Mein Befehl:
Set liO = ListObjects(s1)
greift garantiert auf das richtige Objekt zu, wenn der Name korrekt angegeben wurde, ohne daß man wissen muß, in welcher Tabelle sich dieses Objekt gerade befindet.
Deshalb bin ich erstaunt, daß auch Du die alten Methoden (Technologie von vorgestern!) krampfhaft verteidigst (Anzahl der Spalten im Objekt ermitteln), ohne auf die neuen Möglichkeiten einzugehen:
objListCols(i).Name
ist doppelt gemoppelt, wenn man weiß, daß man mit der Methode 'HeaderRowRange' direkt die Überschriftenzeilen des ListObjektes ableiten und durchlaufen kann.
Auf Fragen wie, letzte Zeile eines Bereiches antworte ich schon gar nicht mehr, solange der Bereich nicht als 'ListObject' nicht definiert wurde.
Gruß von Luschi
aus klein-Paris
PS: Wer die neuen Möglichkeiten von Excel nicht nutzt, wird ewig sich fühlen wie im Trabbi, obwohl er gerade einen Ferrari fährt!

Anzeige
AW: List.Objects best. Spalten löschen
14.08.2013 07:18:36
Beverly
Hi Luschi,
mag schon sein, dass dein Code allumfassend ist, aber weshalb muss man gleich mit Kanonen auf Spatzen schießen, wenn es das Schrotgewehr genau so tut? Ich fahre lieber mit dem guten alten Trabbi (weshalb ist er wohl in manchen westlichen Ländern wohl so begehrt?!) über die kaputten Straßen als mit dem Ferrari, da ich beim Trabbi selbst Hand anlegen kann, wenn er an der nächsten Ecke wegen einer Panne liegen bleiben sollte.


Anzeige
AW: List.Objects best. Spalten löschen
13.08.2013 11:02:10
Luschi
Hallo nette Annette,
versuch es mal so:

Sub macheMal()
Dim liO As ListObject, _
rg1 As Range, rg2 As Range, rg3 As Range
Dim s1 As String, s2 As String
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
s1 = "OrderLines"
s2 = "Column*"
Set liO = ListObjects(s1)
Set rg1 = liO.HeaderRowRange
Debug.Print rg1.Address
For Each rg2 In rg1
If rg2 Like s2 Then
If rg3 Is Nothing Then
rg2.EntireColumn.Delete xlShiftToLeft
'Set rg3 = rg2
Else
'Set rg3 = Application.Union(rg2, rg3)
End If
End If
Next rg2
'dies klappt komischer weise nicht
'also erst sammeln und dann auf einmal löschen
If Not rg3 Is Nothing Then
rg3.EntireColumn.Delete xlShiftToLeft
End If
Set rg1 = Nothing
Set rg2 = Nothing
Set rg3 = Nothing
Set liO = Nothing
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
End Sub
Gruß von Luschi
aus klein-Paris

Anzeige
AW: List.Objects best. Spalten löschen
13.08.2013 11:07:40
Luschi
ganz kleine Korrektur,
natürlich muß an Ende alles wieder aktiviert werden:
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Gruß von Luschi
aus klein-Paris
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Spalten in Excel-ListObjects mit VBA löschen


Schritt-für-Schritt-Anleitung

Um Spalten in einem ListObject in Excel zu löschen, die einen bestimmten Namen enthalten, kannst du den folgenden VBA-Code verwenden. Dabei wird angenommen, dass dein ListObject "OrderLines" heißt.

  1. Öffne den VBA-Editor (ALT + F11).

  2. Füge ein neues Modul hinzu (Rechtsklick auf „VBAProject“ > „Einfügen“ > „Modul“).

  3. Kopiere den folgenden Code in das Modul:

    Sub SpaltenLoeschen()
       Dim objListObj As ListObject
       Dim objListCols As ListColumns
       Dim i As Integer
       Application.ScreenUpdating = False
    
       ' Zuweisung des ListObjects
       Set objListObj = ActiveSheet.ListObjects("OrderLines")
       Set objListCols = objListObj.ListColumns
    
       ' Spalten von hinten nach vorne durchlaufen und löschen
       For i = objListCols.Count To 1 Step -1
           If Left(objListCols(i).Name, 6) = "Column" Then
               objListCols(i).Delete
           End If
       Next i
    
       Application.ScreenUpdating = True
    End Sub
  4. Schließe den VBA-Editor und führe das Makro aus, um die Spalten zu löschen, die mit "Column" beginnen.


Häufige Fehler und Lösungen

  • Fehler: „Objekt nicht gefunden“
    Lösung: Stelle sicher, dass der Name des ListObjects korrekt ist. Der Name ist case-sensitive und muss exakt übereinstimmen.

  • Fehler: Die Spalten werden nicht gelöscht.
    Lösung: Überprüfe, ob die Spaltenüberschriften tatsächlich mit "Column" anfangen. Du kannst die Bedingung im Code anpassen, um eine genauere Übereinstimmung zu erreichen.


Alternative Methoden

Eine weitere Möglichkeit, Spalten zu löschen, besteht darin, die Methode HeaderRowRange zu verwenden, um gezielt auf die Überschriften zuzugreifen. Hier ist ein Beispiel:

Sub AlternativeSpaltenLoeschen()
    Dim liO As ListObject
    Dim rg As Range
    Dim rgToDelete As Range
    Dim sPattern As String
    sPattern = "Column*"

    Set liO = ActiveSheet.ListObjects("OrderLines")
    For Each rg In liO.HeaderRowRange
        If rg.Value Like sPattern Then
            If rgToDelete Is Nothing Then
                Set rgToDelete = rg
            Else
                Set rgToDelete = Union(rgToDelete, rg)
            End If
        End If
    Next rg

    If Not rgToDelete Is Nothing Then
        rgToDelete.EntireColumn.Delete
    End If
End Sub

Praktische Beispiele

Hier sind einige Beispiele für die Anwendung des Codes:

  • Beispiel 1: Lösche alle Spalten, deren Namen mit "Sales" beginnen.
  • Beispiel 2: Lösche alle Spalten mit "Report" in der Überschrift.

Passe einfach die Bedingung im If-Statement an, um die gewünschte Spaltenüberschrift zu definieren.


Tipps für Profis

  • Verwende Application.ScreenUpdating = False, um die Bildschirmaktualisierung während der Ausführung des Makros zu unterdrücken. Dies beschleunigt die Ausführung und verhindert Flackern auf dem Bildschirm.
  • Teste deinen Code zuerst in einer Kopie deiner Datei, um unerwünschte Datenverluste zu vermeiden.
  • Nutze die Debug.Print-Anweisung, um den aktuellen Status deiner Variablen während der Ausführung zu überprüfen, besonders wenn du mit mehreren ListObjects arbeitest.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass ich das richtige ListObject bearbeite?
Verwende den Code Set objListObj = ActiveSheet.ListObjects("OrderLines"). Achte darauf, dass der Name exakt stimmt.

2. Was ist der Unterschied zwischen ListObject und Range in VBA?
ListObject ist eine strukturierte Tabelle innerhalb von Excel, die spezielle Eigenschaften und Methoden für die Datenmanipulation bietet, während Range einen allgemeinen Zellbereich beschreibt.

3. Wie kann ich den Code für andere Spaltennamen anpassen?
Ändere die Bedingung im If-Statement, um nach dem gewünschten Spaltennamen zu suchen. Beispiel: If Left(objListCols(i).Name, 5) = "Sales" Then.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige