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

Forumthread: via VBA Zeile einfügen wenn Wert gefunden

via VBA Zeile einfügen wenn Wert gefunden
15.02.2020 10:36:30
Michael
Hallo zusammen,
ich bin noch recht frisch im Umgang mit VBA und habe mit folgender Aufgabenstellung noch Probleme:
Eine Excel Arbeitsmappe dient dem Controlling zur Darstellung interner Prozesse. Die Arbeitsmappe arbeitet mit verschiedenen Pivottabellen, die alle ein Basistabelle als Datenquelle haben. In dieser Basistabelle müssen nun neue Zeilen mit Inhalt eingefügt werden. Einfügen solle immer erfolgen, wenn in Spalte H der Begriff "Übrige Sachkosten" steht. Eingefügt werden soll immer die Zeile, in der der zu suchende Begriff in Spalte H gefunden wurde. Dann soll in der neu eingefügten Zeile in Spalte H der Begriff "Übrige Sachkosten" durch den Begriff "davon periodenfr. Aufwand" ersetzt werden. Ich habe bereits ein Makro erstellt das diese Anforderungen erfüllt. Problem ist nur die Performance. Die Basistabelle hat 100.000 Zeilen und mein Makro hängt hier Excel komplett auf, nichts geht mehr - habe es auch mal über Nacht laufen lassen - ohne Erfolg. Ich vermute mal es liegt an der von mir angewandten Vorgehensweise im Makro. Ich selektiere die gefundene Zeile, kopiere sie und füge sie ein mit Verschiebung der restlichen Zellen nach unten. Hier mein Makro Code:

Sub ZeileEinfuegen()
Dim i As Long
Application.ScreenUpdating = False
' Suchen nach "Sonstige Sachkosten in Spalte H
For i = Cells(Rows.Count, "H").End(xlUp).Row To 1 Step -1
If Cells(i, "H") = "Übrige Sachkosten" Then
' wenn gefunden ganze Zeile markieren
Rows(i).Select
' Selektion kopieren
Selection.Copy
' und einfügen - übrige Zellen werden nach unten verschoben
Selection.Insert Shift:=xlDown
' in Spalte H der eingefügten Zeile Text ändern
Cells(i, 8).Value = "davon periodenfr. Aufwand"
End If
Next
Application.ScreenUpdating = True
End Sub

Beispieldatei mit anonymisierten Daten:
https://www.herber.de/bbs/user/135210.xlsm
Bitte um Vorschläge wie ich das performanter umsetzen kann.
Danke und Gruß
Michael
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array
15.02.2020 11:25:52
Fennek
Hallo,
kritsch ist der "Insert"-Befehl.
Hier eine Variante mit Arrays, die aber noch nachbearbeitet werden muss.

Sub Main
dim Neu()
einf = worksheetfunction.countif(columns(8), "Übrige Sachkosten")
Ar = cells(1,1).currentregion
redim Neu(ubound(Ar)+einf, ubound(Ar,2))
for i = 1 to ubound(Ar)
if Ar(i, 8) = "Übrige Sachkosten" then e = e + 1
for j = 1 to ubound(Ar,2)
Neu(i+e, j) = Ar(i,j)
next j
next i
sheets("Neu").cells(1,1).resize(ubound(Neu), ubound(Neu,2)) = Neu
End Sub
mfg
Anzeige
AW: Array
15.02.2020 12:47:25
Michael
Hallo Fennek,
aufgrund nur vorhandener Anfängerkenntnisse komme ich allein damit nicht weiter. Fehlende Variablen kann ich noch definieren - aber das reicht nicht um den Code zum laufen zu bekommen.
Dennoch Danke für den Hinweis.
Gruß
Michael
AW: Erklärung
15.02.2020 13:42:27
Fennek
Hallo,
es müssen nur 2 Dinge beachtet werden:
- zuerst ein neues Sheets("Neu") anlegen
- beim Start des Makros muss das Blatt mit den Daten aktiv sein
Der Code erzeugt innerhalb von ca 10 Sekunden eine Kopie der Daten mit Leerzeilen an den gewünschten Stellen. Diese können in einem zweiten Schritt mit "Range.Specialcells(xlCellTypeBlank)" (oder so ähnlich) angesprochen werden.
Teste es zuerst in der gezeigten Beispieldatei.
mfg
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
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

Zeilen in Excel mit VBA einfügen, wenn ein Wert gefunden wird


Schritt-für-Schritt-Anleitung

Um in Excel mittels VBA eine Zeile einzufügen, wenn ein bestimmter Wert in einer Spalte gefunden wird, kannst du folgendermaßen vorgehen:

  1. Öffne den VBA-Editor: Drücke Alt + F11 in Excel.

  2. Füge ein neues Modul hinzu: Klicke im Projekt-Explorer mit der rechten Maustaste auf deine Arbeitsmappe und wähle Einfügen > Modul.

  3. Kopiere den folgenden VBA-Code in das Modul:

    Sub ZeileEinfuegen()
       Dim i As Long
       Application.ScreenUpdating = False
       ' Nach "Übrige Sachkosten" in Spalte H suchen
       For i = Cells(Rows.Count, "H").End(xlUp).Row To 1 Step -1
           If Cells(i, "H") = "Übrige Sachkosten" Then
               ' Zeile einfügen
               Rows(i).Insert Shift:=xlDown
               ' Text in Spalte H ändern
               Cells(i, 8).Value = "davon periodenfr. Aufwand"
           End If
       Next
       Application.ScreenUpdating = True
    End Sub
  4. Führe das Makro aus: Drücke F5 oder gehe zu Run > Run Sub/UserForm.

Der Code sucht von unten nach oben in Spalte H nach dem Begriff "Übrige Sachkosten" und fügt eine neue Zeile ein, wenn er diesen Wert findet.


Häufige Fehler und Lösungen

  • Excel hängt sich auf: Wenn dein Makro bei einer großen Datenmenge (z.B. 100.000 Zeilen) langsam oder gar nicht reagiert, probiere die Verwendung von Arrays, um die Performance zu verbessern. Vermeide das ständige Einfügen von Zeilen und speichere die Daten stattdessen in einem Array.

  • Fehlermeldungen bei der Ausführung: Stelle sicher, dass du das richtige Arbeitsblatt aktiv hast, bevor du das Makro ausführst. Der VBA-Code muss sich auf das Blatt beziehen, das die Daten enthält.


Alternative Methoden

Eine alternative Methode, um Zeilen in Excel über VBA einzufügen, besteht darin, mit Arrays zu arbeiten. Dies kann die Ausführungsgeschwindigkeit deiner Makros erheblich verbessern. Hier ist ein Beispiel:

Sub ZeilenEinfügenMitArray()
    Dim Ar As Variant
    Dim Neu() As Variant
    Dim i As Long, e As Long
    Dim Einf As Long

    Ar = Cells(1, 1).CurrentRegion.Value
    Einf = Application.WorksheetFunction.CountIf(Columns(8), "Übrige Sachkosten")
    ReDim Neu(1 To UBound(Ar, 1) + Einf, 1 To UBound(Ar, 2))

    For i = 1 To UBound(Ar, 1)
        If Ar(i, 8) = "Übrige Sachkosten" Then e = e + 1
        For j = 1 To UBound(Ar, 2)
            Neu(i + e, j) = Ar(i, j)
        Next j
    Next i

    Sheets("Neu").Cells(1, 1).Resize(UBound(Neu, 1), UBound(Neu, 2)) = Neu
End Sub

Praktische Beispiele

Hier sind einige praktische Anwendungsbeispiele für das Einfügen von Zeilen mit VBA:

  • Bericht erstellen: Wenn du regelmäßig Berichte erstellst, die bestimmte Zeilen basierend auf einem Kriterium (z.B. "Übrige Sachkosten") benötigen, kannst du ein Makro erstellen, das dies automatisiert.

  • Datenaufbereitung: Wenn du Daten aus verschiedenen Quellen zusammenführst und sicherstellen möchtest, dass bestimmte Zeilen immer an bestimmten Stellen eingefügt werden, kann dieses VBA-Skript nützlich sein.


Tipps für Profis

  • Verwendung von Application.ScreenUpdating: Setze Application.ScreenUpdating auf False, um die Bildschirmaktualisierung während der Ausführung deines Makros zu deaktivieren. Das beschleunigt die Ausführung erheblich.

  • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen in deinem Code, um unerwartete Probleme elegant zu lösen und die Benutzerfreundlichkeit deiner Makros zu verbessern.

  • Modularer Code: Teile deinen Code in verschiedene Subroutinen auf, um ihn wartungsfreundlicher und übersichtlicher zu gestalten.


FAQ: Häufige Fragen

1. Wie kann ich das Makro anpassen, um mehrere Begriffe zu suchen?
Du kannst die Bedingung in der If-Anweisung anpassen und mehrere Begriffe mit Or kombinieren.

2. Funktioniert dieser Code in jeder Excel-Version?
Ja, der Code sollte in den meisten modernen Excel-Versionen funktionieren, die VBA unterstützen (z.B. Excel 2010 und neuer).

3. Was tun, wenn ich die Zeilen nicht in das aktuelle Blatt einfügen möchte?
Du kannst den Zielbereich im Code anpassen, indem du den entsprechenden Arbeitsblattnamen angibst (z.B. Sheets("DeinBlatt").Rows(i).Insert).

4. Kann ich auch mehrere Zeilen gleichzeitig einfügen?
Ja, du kannst den Code so anpassen, dass mehrere Zeilen eingefügt werden, indem du die Schleife entsprechend anpasst.

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