Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1920to1924
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Spalten selktiv nach Liste löschen (VBA)

Spalten selktiv nach Liste löschen (VBA)
14.02.2023 14:12:38
Frank
Ich habe eine Frage an die Könner.
Wie bekomme ich es hin, nur Spalten einer Tabelle übrig zu lassen, deren Name in eine Hilfstabelle (gleiche Datei) aufgelistet sind?
Hintergrund ist, ich bekomme im Monat zwei mal Quelltabellen in denen ich nur ca.10 Spalten benötige. Alle anderen sollen gelöscht werden.
Leider und das ist das Problem verändert sich die Spaltenanzahl und die Lage (an welcher Stelle) die Spalten liegen. Das kann ich jedoch NICHT beeinflussen.
Heißt, so wie ich die Spalten in der Hilfstabelle aufliste soll das Ergebnis aussehen.
Bisher habe ich das völlig statisch gemacht. Allerdings hat sich die Änderung in der Tabelle massiv verschärft.
Könnte man Teile des hier gefundenen Codes vielleicht nutzen? In der Anwendung wird bedingt formatiert, aber vielleicht könnte man nicht formatieren, sonder herauslöschen. Allerdings gibt es hier keine Referenztabelle in der das Muster steht.
https://www.herber.de/forum/archiv/1912to1916/1914001_Bedingtform_ListObjects_Spaltenname.html

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
14.02.2023 14:33:50
Yal
Hallo Frank,
der Algo lautet:
Für ein Spaltenzahl i der vom letzte Überschriftspaltenummer bis erste Spalte (i absteigend)
    Wenn Zelle (Zeile der Überschrift, Spalte i) nicht in der Liste der Spalte zu behalten dann
        gesamte Spalte i löschen
    Ende Wenn
Nächster i
In VBA ist es dann sehr ähnlich:
Sub reinschreiben()
Dim i As Long
Const cKopfzeile = 1
    For i = Cells(cKopfzeile, Columns.Count).End(xlToLeft).Column To 1 Step -1
        If Worksheets("Spaltenliste").Range("A1:A10").Find(Cells(cKopfzeile, i)) Is Nothing Then
            Columns(i).Delete
        End If
    Next Z
End Sub
VG
Yal
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
16.02.2023 22:18:05
Frank
1. möchte ich mich für die schnelle Hilfe bedanke.
2. sie funktioniert auch zum Teil.
3. es werden "so weit" alle überflüssigen Spalten gelöscht.
ABER...
es bleiben auch Spalten erhalten deren Bezeichnung Worte, oder Wortgruppen enthalten die ähnlich sind.
Beispiel1: es soll die Spalte "Anlagenklasse" erhalten bleiben...
macht er auch, aber es bleibt auch die Spalte "Klasse" erhalten, da das Wort "Klasse" darin vorkommt.
Beispiel2: es soll die Spalte "SLS Seconds Blau" erhalten bleiben...
macht er auch, aber es bleibt auch die Spalte "Seconds Blau" erhalten, da das Wort "Seconds Blau " darin vorkommt.
Ansonsten werden die anderen überflüssigen Spalten die keine Ähnlichkeiten enthalten gelöscht.
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
17.02.2023 11:07:12
Yal
Hallo Frank,
sorry, ein bischen zu kurz gedacht. Das "Find" muss auf das Gesamte Zelleinhalt (xlWhole) stattfinden:
Sub reinschreiben()
Dim i As Long
Const cKopfzeile = 1
    For i = Cells(cKopfzeile, Columns.Count).End(xlToLeft).Column To 1 Step -1
        If Worksheets("Spaltenliste").Range("A1:A10").Find(Cells(cKopfzeile, i), LookAt:=xlWhole) Is Nothing Then
            Columns(i).Delete
        End If
    Next Z
End Sub
VG
Yal
AW: Spalten selktiv nach Liste löschen (VBA)
17.02.2023 11:30:15
Frank
Hallo, Du brauchst Dich überhaupt nicht entschuldigen !
Ich finde es sogar "gut" das dieser Fall eingetreten ist, denn so lässt sich gut sehen was sich wie auswirkt.
Bitte mal noch eine kleine Erweiterung.
Im Moment läuft das Makro in der Tabelle die "man" gerade betrachtet, das kann auch die "Spaltenliste" sein :-)
Wie bekommt man das hin, das es nur die Tabelle "Import_Tabelle" ist.
Ansonsten TOP, Du hast mir super geholfen !!!
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
17.02.2023 14:22:52
Yal
Hallo Frank,
ja, sehr wichtige Frage.
Mit dem with wird ein Präfix definiert. Alles was mit einem Punkt anfängt (es sind 3), bezieht sich auf diesem Präfix.
Sub reinschreiben()
Dim i As Long
Const cKopfzeile = 1
    With Worksheets("Import_Tabelle")
        For i = .Cells(cKopfzeile, Columns.Count).End(xlToLeft).Column To 1 Step -1
            If Worksheets("Spaltenliste").Range("A1:A10").Find(.Cells(cKopfzeile, i), LookAt:=xlWhole) Is Nothing Then
                .Columns(i).Delete
            End If
        Next Z
    End With
End Sub

Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
17.02.2023 21:11:47
Frank
Danke, super gelaufen.
Ich fürchte jetzt bekomme ich eins auf die Mütze, mir ist das aber eben erst aufgefallen.
Der Ablauf der ist folgender:
Ich habe zwei Exceltabellen/Dateien, die eine beinhaltet das Makro und nun auch die Spaltenliste.
Die öffnet die Import-Datei und führt alles aus
Die andere ist die Importdatei. Die wird durch die Makro-Datei bearbeitet.
Ich hatte nicht gewusst, das die Makro-Datei die Spaltenliste nun in der von ihr geöffneten Importdatei und nicht bei sich selber sucht..
Bringe ich nun die Spaltenliste in die Exceldatei funktioniert alles bestens, auch mit Deiner eben genannten Änderung.
Ich müsste also, entweder jedes mal in die Importdatei das Blatt Spaltenliste hinein kopieren,
oder
ich finde einen Weg, dass das Makro die Spaltenliste in der Makro-Datei verwendet.
Die Pfade sind:
D:\Test_Spaltenloeschung\Import_Datei.xlsx
und
D:\Test_Spaltenloeschung\Spaltenloeschung.xlsm
Kannst Du mir dabei bitte noch mal helfen, dann klappt es alles super.
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
17.02.2023 23:54:08
Yal
Hallo Frank,
wenn die Daten aus einer anderen Datei kommen, dann ist es sinnvoller Power Query zu verwenden.
Schau dir ein paar Einleitungsvideos. Alles echt easy. In deinem Fall ist es eh minimalistisch. Klicke die Spalten weg. Fertig.
Ein paar Berechnungen oder Transformationen kannst Du auch reinbringen, falls du sie brauchst. Dann hättest Du keine Makros.
VG
Yal
AW: Spalten selktiv nach Liste löschen (VBA)
18.02.2023 10:09:11
Frank
Hallo Yal, danke für Deine Hilfe.
Die Import-Datei soll auch in ihrer Größe SEHR schrumpfen, was sie ja auch mit der bisherigen Vorgehensweise tut.
Muss ich halt sehen das ich eine kleine Routine rein bringe die im Vorfeld das Blatt "Spaltenliste" immer erst in die Import-Datei hinein kopiert und zum Schluss dann wieder löscht.
Dachte es ist leichter den Verweis wo die Spaltenliste liegt um zuweisen.
Muss ich mal schauen, denn ansonsten passt so weit alles super, dafür möchte ich mich noch mal bedanken.
Habe so auch ein wenig dazu gelernt. Deswegen, hatte ich ja schon geschrieben, war es gar nicht schlecht das wir uns Stück für Stück heran gearbeitet haben.
Sicher, ein echter Könner bekommt gerade einen Lachanfall, für war's echt Hilfreich.
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
18.02.2023 15:02:42
Yal
Hallo Frank,
hier wird niemand ausgelacht. Na ja, vielleicht manchmal schon, aber nicht auf Grund von Unwissen.
Dass es sich um eine separaten Datei handelt, ist spät erwähnt worden, sonst hätte ich früher Power Query erwähnt. Damit wird tatsächlich nur die gewünschte Daten in Excel geladen, und nicht zuerst in Excel und dann gelöscht.
VG
Yal
AW: Spalten selktiv nach Liste löschen (VBA)
19.02.2023 00:44:57
Frank
Na gut, dann beende ich das ganze hier und übe mal weiter.
Mal sehen vielleicht finde ich ja noch ne Lösung.
Vielen Dank, dann mal zu einem anderen Thema.
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 09:39:00
Frank
Ich möchte das Thema noch mal aufgreifen. Ich war zu voreilig es zu beenden.
Sicher mag es mit BI u.U. auch gut umsetzen lassen.
Die "Zwei-Dateien-Lösung" hat sich bei mir aber absolut bewährt und ich möchte sie auch gern weiter verwenden.
Ich müsste die Abläufe für alle MA die das verwenden umschreiben.
Das will ich aber gern umgehen und die Vorteile die Yal mit seiner Hilfe nutzen.
Die Datei (die aufbereitete Datei) wird in anderen Datenbanken importiert und zum Teil weiter verarbeitet.
Ich denke da ist es einfacher den Bezug der "Spaltenliste" auf die Makro-Datei um zuweisen.
Die Pfade sind:
D:\Test_Spaltenloeschung\Import_Datei.xlsx
und
D:\Test_Spaltenloeschung\Spaltenloeschung.xlsm
Yal, wenn Du da doch noch einmal helfen könntest, wäre schön.
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 10:11:58
Yal
Hallo Frank,
die Automatisierung übernimmt 3 Aufgaben:
_ Datei laden
_ Spalten entfernen
_ verschlankerte Datei speichern
Datei öffnen und zu speichern ist mit Makrorekorder leicht zu haben. So leicht, dass ich selber nicht weiss, wie das geht, weil ich immer dafür den MR aufs neu einsetzt.
Für den Spalten entfernen kann man die Spalten, falls die Bezeichnung sich selten ändern, direkt im Code reinbringen:
Sub Spalten_entfernen()
Dim i As Long
Dim Elt
Const cKopfzeile = 1
    With Worksheets("Import_Tabelle")
        For i = .Cells(cKopfzeile, Columns.Count).End(xlToLeft).Column To 1 Step -1
            For Each Elt In Array("Überschrift 1", "Überschrift 2", "Überschrift 3")
                If LCase(.Cells(cKopfzeile, i)) = LCase(Elt) Then
                    .Columns(i).Delete
                    Exit For 'exit For Elt, also nächste i.
                End If
            Next Elt
        Next Z
    End With
End Sub
VG
Yal
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 11:23:18
Frank
Hallo Yal, erst mal vielen Dank das Du dich noch mal zu meinem Problem geäußert hast.
Die Variante die Du mir vorher gezeigt hast:
Sub reinschreiben()
       Dim i As Long
       Const cKopfzeile = 1
       
           With Worksheets("Import_Tabelle")
               For i = .Cells(cKopfzeile, Columns.Count).End(xlToLeft).Column To 1 Step -1
                   If Worksheets("Spaltenliste").Range("A1:A10").Find(.Cells(cKopfzeile, i), LookAt:=xlWhole) Is Nothing Then
                       .Columns(i).Delete
                   End If
               Next Z
           End With
       End Sub
Ist aus meiner Sicht die weit bessere Lösung. Denn sobald sich was an den Spalten ändert muss nur in der Spaltenliste etwas geändert werden, nicht im Code.
Derzeit habe ich folgendes am laufen:
Damit öffne ich die zu bearbeitende Import-Datei und springe dann in Deinen Code um die Spalten anzupassen. Das funkt. sehr gut.
Allerdings benötigt er die Spaltenliste in der Import-Datei.
Sub Loeschen_XLSX_das_Ausfuehren()		'rufe via Taster das Makro auf
    On Error GoTo ErrorHandler
    Abfrage = MsgBox("Sollen die Spalten angepasst werden?", vbYesNo + vbQuestion, "Sicherheitsabfrage")
        If Abfrage = vbYes Then
For Each Datei In Array("Import_Datei.xlsx")
    Workbooks.Open "D:\Test_Spaltenloeschung\" & Datei
    
    'hier muss aus meiner Sicht die Kopierfunktion der "Spaltenliste" Makro_Datei zur Import_Datei rein
    
    Call Spaltenloeschung_XLSX		'hier springt er in die Spaltenlöschung
    ActiveWorkbook.Save
    ActiveWorkbook.Close
    
        MsgBox "Die Spalten wurden angepasst", , MyCaption
        GoTo Ende
Next
End If
ErrorHandler:
                MsgBox "Die Spalten wurden nicht angepasst", , MyCaption
Ende:
End Sub
Oder wir bekommen es hin, das er das kopieren nicht benötigt, und die Spaltenliste direkt aus der Makro_Datei in der Import_Datei nutzt.
Das wäre aus meiner Sicht die beste Lösung.
Ich habe auch schon mal hiermit versucht das Blatt "Spaltenliste" aus der Makro_Datei in die Importdatei zu bekommen, will aber irg. wie nicht klappen.
Sheets("Tabelle1").Copy Before:=Workbooks("Beispiel.xlsm").Sheets(1) 'Mit diesem Code wird ein Arbeitsblatt als erstes Arbeitsblatt in eine anderen Arbeitsmappe kopiert
Oder,
Sheets("Tabelle1").Copy After:=Workbooks("Beispiel.xlsm").Sheets(Workbooks("Beispiel.xlsm").Sheets.Count) 'So wird das Arbeitsblatt an das Ende der anderen Arbeitsmappe kopiert
Anzeige
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 12:56:00
Frank
Also ich habe das ganze soeben noch mal getestet.
Das mit With funktioniert nur, wenn ich die Spaltenliste in der Import_Datei hinten anhänge,
er ändert die "Import_Tabelle" nicht wie gewollt.
Ich benenne auch Spalten in der Import_Tabelle um und verschiebe einige.
Wie gesagt, steht die "Spaltenliste" als letztes Blatt klappt alles.
Heißt, wenn ich das mit der Kopierfunktion nutzen muss (Spaltenliste von Makro_Datei nach Import_Datei), dann muss die "Spaltenliste" am Ende stehen.
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 15:01:06
Yal
Hallo Frank,
wichtig ist vor allem, dass der Code weisst, worauf er aggieren muss. Du musst daher diese Information verwalten und stets "in der Hand" haben.
Sub Loeschen_XLSX_das_Ausfuehren()     'rufe via Taster das Makro auf
Dim WB As Workbook
Dim i As Long
Const cKopfzeile = 1
    On Error GoTo Catch
    If MsgBox("Sollen die Spalten angepasst werden?", vbYesNo + vbQuestion, "Sicherheitsabfrage") = vbYes Then
Try:
        Set WB = Workbooks.Open("D:\Test_Spaltenloeschung\Import_Datei.xlsx") 'Datei öffnen
        With WB.Worksheets(1)
        'Spalten entfernen
            For i = .Cells(cKopfzeile, Columns.Count).End(xlToLeft).Column To 1 Step -1
                If ThisWorkbook.Worksheets("Spaltenliste").Range("A1:A50").Find(.Cells(cKopfzeile, i), LookAt:=xlWhole) Is Nothing Then
                    .Columns(i).Delete
                End If
            Next Z
        End With
        WB.Save
        WB.Close
        MsgBox "Die Spalten wurden angepasst", , MyCaption
    End If
    GoTo Finally
Catch:
    MsgBox "Die Spalten wurden nicht angepasst", , MyCaption
Finally:
'hier kommt, was auf alle Fälle (auch nach Fehler) gemachte werden muss
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub
Wenn man eine Datei öffnet, fängt man diese mit einer "Workbook"-Variable ("wb"). Das Abfangen der Datei in einer Objekt-Variable ist wichtig, um anschliessend genau diese Datei zu speichern und schliessen.
Dann wird auf das erste Blatt der geöffnete Datei bewirkt. Diese wird mit
With wb.Worksheets(1)
adressiert.
Die Liste der Spalte wiederum ist in dieselbe Datei, wie das Makro, also "ThisWorkbook".
Sonst ist es, ob Du vor einer Apothekerschrank stehst und jemand sagt: dritte Schublade.
(Der Fehlerbehandlungspattern heisst übrigens Try-Catch-Finally, daher die Springmarken. Es ist aber unwichtig, wie diese heissen. Genau gesehen sollte man bei solche Behandlungen nur eine einzige "Aktion" innerhalb des Try machen. )
Schalte unter "Extras", "Optionen", "Variabledeklaration erforderlich" an. Wirkt lästig, ist aber nicht. Im Gegenteil, sehr hilfreich.
VG
Yal
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 20:01:27
Frank
Mensch Yal,.... ich bin sprachlos.
habe nun alles auf meine Bedürfnisse / Gegebenheiten angepasst.
ALTER, das funktioniert, Hammer !
Ich hätte nie gedacht, das Du das in so wenig Code unter bringst.
Mag wirklich so sein wie Du sagtest, Power-BI...
In meinem Fall wäre das aber enorm viel Mehraufwand gewesen da ich es nicht alleine nutze, sondern eben auch andere.
Und nicht alle sind so Blickig wie ich. :-)))
Du hast mir SEHR geholfen. Vielen Dank
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 20:36:10
Yal
Nicht Power-BI, sondern Power Query.
Um die "erlaubte Spalten" zu selektieren müsste man in die Tiefe gehen. Aber einst die Abfrage erzeugt ist, müssten die Enduser nur noch auf deren Ergebnistabelle rechtsklicken und "Aktualisieren" (die Fortgeschrittenen würden natürlich Strg+Alt+F5 drücken ;-)
Magst Du es noch kürzer? (reine Spielerei, null Vorteil):
Sub Loeschen_XLSX_das_Ausfuehren()     'rufe via Taster das Makro auf
Dim i As Long
    If MsgBox("Sollen die Spalten angepasst werden?", vbYesNo + vbQuestion, "Sicherheitsabfrage") = vbYes Then
        With Workbooks.Open("D:\Test_Spaltenloeschung\Import_Datei.xlsx").Worksheets(1)
            For i = .Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
                If ThisWorkbook.Worksheets("Spaltenliste").Range("A1:A50").Find(.Cells(1, i), LookAt:=xlWhole) Is Nothing Then .Columns(i).Delete
            Next z
            .Close SaveChanges:=True
        End With
    End If
End Sub
VG
Yal
AW: Spalten selktiv nach Liste löschen (VBA)
20.02.2023 23:15:00
Frank
Hallo Yal, Du willst es aber wirklich wissen....
Ich werde das morgen auch mal ausprobieren, denke das klappt ;-)
Vielleicht werde ich es mir, erst mal bei der vorangegangenen Version, dann bei der hier noch kommentieren (für mich).
Habe mir auch die anderen Vor-Versionen mal abgespeichert um sie vielleicht mal für was anderes zu nutzen.
War sehr aufschlussreich für mich. auch wenn ich den Code erst mal noch sehr holprig lesen kann.
Also, bis dahin, Gruß Frank

315 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige