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 |
1 | Spalte 1 |
2 | A |
3 | A |
Zelle | Formel |
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:
- Die .Name-Eigenschaft: Worksheets("Meine Tabelle").Range("A1") [steht in der Klammer]
- Den Code-Name: Tabelle4.Range("A1") [vor der Klammer]
- Den Index (lfd. Nr. des Sheets, von links mit 1 beginnend) Worksheets(4).Range("A1")
Gruß Ralf