Clever-Excel-Forum

Normale Version: Bei bestimmter Bedingung Zeile kopieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo zusammen,

ich habe folgendes Problem.

Meine Datei ist aufgebaut wie das Beispiel anbei. Ziel ist folgendes:

Wenn in Tabelle2 in Spalte B ein "nein" steht möchte ich ein Makro haben, das die entsprechende Zeile (von Spalte E bis N) in Tabelle1 kopiert.

Ich habe meine bescheidenen VBA Skills angewendet, bin aber leider zu keinem Ergebnis gekommen.

Könnt ihr hier helfen?

Danke & Gruß,
Fabian
Arbeitsblatt mit dem Namen 'Tabelle1'
A
1Spalte 1
2A
3A

ZelleFormel
A2=WENNFEHLER(INDEX(Tabelle2!$B$2:$N$6;AGGREGAT(15;6;ZEILE(Tabelle2!$B$2:$N$6)/(Tabelle2!$B$2:$B$6="Nein")-1;ZEILE(A1));4+SPALTE(A1)-1);"")
A3=WENNFEHLER(INDEX(Tabelle2!$B$2:$N$6;AGGREGAT(15;6;ZEILE(Tabelle2!$B$2:$N$6)/(Tabelle2!$B$2:$B$6="Nein")-1;ZEILE(A2));4+SPALTE(A2)-1);"")
Verwendete Systemkomponenten: [Windows (32-bit) NT 10.00] MS Excel 2016
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Vll  mit  Formel statt Makro?
Falls eine Makrolösung gewünscht ist, dann so:

Code:
Sub uebertragen()
Dim i As Integer
Dim letzte As Integer
Dim erste As Integer

letzte = Sheets("Tabelle2").Cells(Rows.Count, 2).End(xlUp).Row
erste = Sheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row + 1

With Sheets("Tabelle2")
   For i = 2 To letzte
       If .Cells(i, 2).Value = "nein" Then
           Sheets("Tabelle1").Range("A" & erste & ":J" & erste).Value = .Range("E" & i & ":N" & i).Value
           erste = erste + 1
       End If
   Next i
End With

End Sub
Auch wenn Du eine funktionierende gute Formellösung hast:
Aggregat ist bei großen Bereichen recht träge und imo nicht zu empfehlen.
Warum nicht einfach Autofilter Spalte B = nein?
oder erweiterter Filter mit entsprechendem Kriterienbereich?

Wenn es VBA sein soll/muss:
Nutze ebenfalls den Autofilter und kopiere ab der ersten Werte-Zeile.
Den Turbo zündest Du, indem Du vorher Spalte B sortierst, so dass der Filterbereich nicht fragmentiert ist.

Gruß Ralf
Hallo Berni,

ich bekomme leider die Fehlermeldung "Index ist außerhalb des gültigen Bereichs".

Da meine Datei deutlich größer ist als das Beispiel, habe ich den Code wie folgt abgeändert:

Code:
Sub uebertragen()
Dim i As Integer
Dim letzte As Integer
Dim erste As Integer

letzte = Sheets("Tabelle2").Cells(Rows.Count, 2).End(xlUp).Row
erste = Sheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row + 1

With Sheets("Tabelle2")
   For i = 2 To letzte
       If .Cells(i, 2).Value = "nein" Then
           Sheets("Tabelle1").Range("A" & erste & ":Z" & erste).Value = .Range("E" & i & ":Z" & i).Value
           erste = erste + 1
       End If
   Next i
End With

End Sub
Da die ich mehr Spalten habe (bis "Z") habe ich das "N" jeweils durch das "Z" ersetzt.
BG Fabian
Berni A:J = E:N
Du A:Z = E:Z
Fällt Dir was auf?

Zur Fehlermeldung:
Du musst schon die korrekten Tabellennamen eingeben!

Ansonsten bleibe ich bei den Empfehlungen meiner letzten Antwort.

Gruß Ralf
(12.06.2018, 11:44)RPP63 schrieb: [ -> ]Auch wenn Du eine funktionierende gute Formellösung hast:
Aggregat ist bei großen Bereichen recht träge und imo nicht zu empfehlen.
...
Gruß Ralf

Hallo, dafür kann man ja eine Hilfsspalte einfügen (nach lupo1-Art) mit VERGLEICH() und dann superschnell mit INDEX()...
Theoretisch ja, Jörg!
Hier soll aber ja ein "gefiltertes" Ergebnis generiert werden.
Die Vergleich-Spalte könnte man nach diesem Schema aufbauen:
http://www.herber.de/excelformeln und bitte suchen .../formeln.html?welcher=224
Trotz Zählenwenn() dürfte (natürlich die dritte, also die Index-Formel) dies schneller als Aggregat sein.
Jetzt bin ich aber trotzdem zickig  :21: und bleibe bei meiner Filterlösung nebst vorherigem Sortieren.

Gruß Ralf
(12.06.2018, 12:20)RPP63 schrieb: [ -> ]Berni A:J = E:N
Du A:Z = E:Z
Fällt Dir was auf?

Zur Fehlermeldung:
Du musst schon die korrekten Tabellennamen eingeben!

Ansonsten bleibe ich bei den Empfehlungen meiner letzten Antwort.

Gruß Ralf

Ja, da habe ich einen Fehler eingebaut.

Aber A:V = E:Z müsste doch korrekt sein oder?

Und was meinst du mit den korrekten Tabellennamen?
Ausnahmsweise mal ein Textbaustein:
Ein Tabellenblatt kannst Du in plain Excel nur mit dem Namen, der auf dem "Tabellenreiter" steht ansprechen!
Bei VBA gibt es drei Möglichkeiten:
  1. Die .Name-Eigenschaft: Worksheets("Meine Tabelle").Range("A1") [steht in der Klammer]
  2. Den Code-Name: Tabelle4.Range("A1") [vor der Klammer]
  3. Den Index (lfd. Nr. des Sheets, von links mit 1 beginnend) Worksheets(4).Range("A1")
Gruß Ralf
Seiten: 1 2