Clever-Excel-Forum

Normale Version: Daten per Makro aus einer Tabelle in eine andere übernehmen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Ich habe eine große Tabelle, aus der ich einige Daten in eine andere übernehmen möchte.

Beispiel
Nr.   Name  Prüffeld (unsichtbar)
1     A         0
2     B         1
3     C         0
4     D         2
5     E         3
6     F         0

Je nachdem, was in einem anderen Feld eingegeben wird, ändert sich der Inhalt des Prüffelds. Ich möchte per Makro nun alle Einträge, bei denen eine 0 steht, in eine andere Tabelle kopieren, und zwar so, dass dort keine Lücken sind. Es sollte dort also so aussehen:

Nr.   Name
1     A
3     C
6     F
(alternativ würde mir auch nur Nr. oder Name reichen, den Rest kann ich dann mit INDEX rüberholen)

Wer kann mir dazu ein Makro erstellen?
(Nr. kann dabei A1 sein, Name A2 etc. Das kann ich dann anpassen.)
moin

eine Möglichkeit

Code:
Option Explicit

Sub irgendwas()
    Dim lngLetzte As Long, lngZiel As Long
    Dim i As Long
    lngLetzte = Cells(Rows.Count, 3).End(xlUp).Row
    With Sheets("Tabelle2")
        lngZiel = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        For i = 2 To lngLetzte
            If Cells(i, 3).Value = 0 Then
                .Cells(lngZiel, 1).Value = Cells(i, 1).Value
                .Cells(lngZiel, 2).Value = Cells(i, 2).Value
                lngZiel = lngZiel + 1
            End If
        Next
    End With
End Sub

zu starten aus deiner "großen Tabelle"
den Tabellenblattnamen deiner Zieltabelle ggf. anpassen

mfg Tom
@ Tom,

dafür nimm  Excelfunktionalitäten!


Code:
Sub x()

With Worksheets("Tabelle1").Range("A1").CurrentRegion
.AutoFilter field:=3, Criteria1:="0"
.Copy Worksheets("Tabelle2").Range("A1")
.AutoFilter
End With


End Sub

VG Juvee
@Juvee:

Wie baue ich deinen Teil in das Makro von Tom ein? Kannst du das als Gesamtwerk einmal posten?


@Tom:

Was muss ich ändern, wenn ich das Makro aus der Zieltabelle starten möchte?
moin

mein Code würde dann so aussehen

Code:
Sub irgendwas()
    Dim lngLetzte As Long, lngZiel As Long
    Dim i As Long
    lngZiel = Cells(Rows.Count, 1).End(xlUp).Row + 1
    With Sheets("Tabelle1") 'Tabellenblatt Quelle
        lngLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To lngLetzte
            If .Cells(i, 3).Value = 0 Then
                Cells(lngZiel, 1).Value = .Cells(i, 1).Value
                Cells(lngZiel, 2).Value = .Cells(i, 2).Value
                lngZiel = lngZiel + 1
            End If
        Next
    End With
End Sub

aber den Code von Juvee kannst du so übernehmen wie er ist
egal von welchem Tabellenblatt aus

mfg Tom
@Tom:

Ich denke, ich komme mit deiner Version besser zurecht, was Anpassung angeht, die andere Version ist mehr so Doktorarbeit statt Aufsatz, was das Verständnis meinerseits angeht  Huh ...

Ein paar kurze Fragen noch, um zu sehen, ob ich das richtig verstehe, damit ich es anpassen kann:

1. Cells(Rows.Count, 1) => rows.count zählt was? nichtleere Zellen? alle Zellen des Tabellenblatts? Eigentlich muss die Vergleich-und Kopier-Arie nur in den Zeilen 3 bis 56 laufen, macht es das einfacher?
Die "1" bezieht sich auf die Spalte, also zählt er in Spalte A, richtig? Für Spalte F müsste dort eine "6" sein?

2. If .Cells(i, 3).Value = 0 Then
                Cells(lngZiel, 1).Value = .Cells(i, 1).Value
                Cells(lngZiel, 2).Value = .Cells(i, 2).Value
                lngZiel = lngZiel + 1
     End If

     Hier schaut er nach, ob in Spalte C (die "3") eine 0 steht. Wenn ja, wird der Wert der Zelle (aktuelle Reihe, Spalte A) geändert... was hat das "i" zu bedeuten? Das gleiche dann mit Zelle (aktuelle Reihe, Spalte B). Dann geht er eine Reihe tiefer?

Wenn ich im Zielblatt also nicht Spalten A und B ändern möchte, sondern C und D, muss ich statt "1" und "2" eine "3" und "4" respektive einsetzen?


Sorry, wenn das so Noob-Fragen sind, aber ich habe nur ein rudimentäres Verständnis von VBA...
Hallöchen,

Rows.Count = Zeilen.Anzahl, also hier alle Zeilen des Blattes.

Schränkt man den Bereich ein, z.B. Range("A1:A3").Rows.Count, werden die Zeilen von A1 bis A3 gezählt...
--> auch mit
With Range("A1:A3")
Cells(.Rows.Count,1) ...
End With
--> um mal auf den Bezugspunkt hinzuweisen Smile
Moin,

hier ist aber Rows.Count wichtig, weil es in dem Code darum geht, von der alleruntersten Zeile einer Spalte zur nächsten gefüllten Zelle nach oben zu springen. Damit wird die Tastenkombination Strg+PfeilOben simuliert. Es ist daher nicht ratsam, die Codezeile anzupassen.

Viele Grüße
derHöpp
Ok, ich sehe schon, mein Optimismus, ein Makro anpassen zu können, wenn ich nur allgemeine Daten bzw Beispiele vorgebe, war unangebracht. Ich bin nach wie vor aufgeschmissen und weiß nicht weiter, weil ich leider die ganzen Befehle nicht verstehe und anwenden kann. Vielleicht versuche ich es nochmal mit den genauen Angaben in meiner Tabelle.

Das Makro (aufzurufen aus dem Tabellenblatt "NVZ") soll folgendes machen:

1. Lösche den Inhalt der Zellen C3 bis C46 in Tabellenblatt "NVZ"

2. Prüfe den Inhalt der Zelle Y3 in Tabellenblatt "Datenblatt"
3. Wenn dort eine Null steht, gehe zu Punkt 5.
4. Wenn dort etwas anderes als eine Null steht, kopiere den Inhalt der Zelle G3 in Tabellenblatt "Datenblatt" in Zelle C3 in Tabellenblatt "NVZ"
5. Springe eine Zeile weiter nach unten und wiederhole Punkt 2. bis 4. (also alles mit Y4, G4, C4 (oder C3, wenn in Y3 eine Null war) etc.)

6. Es sollen alle Zellen von Y3 bis Y56 durchgeprüft werden. Und letztlich soll in Tabellenblatt "NVZ" in der Spalte  C eine Liste ohne leere Zeilen sein.

Kann mir einer das Makro so schreiben, bitte?
Moin

Mein "Makro" würde so aussehen:
Code:
=FILTER(Tabelle1[Hamster];Tabelle1[Wurstfinger]<>0)
Seiten: 1 2