Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
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

Bestimmte Zeilen in eine andere Tabelle

Bestimmte Zeilen in eine andere Tabelle
15.06.2021 10:59:13
Ingo
Hallo
Ich möchte per VBA bestimmte Zeilen aus einer Tabelle in eine andere Tabelle kopieren. Es sollen nur die Zeilen kopiert werden, in dessen Zellen der Spalte Q der Wert ungleich "" ist.
Dafür habe ich mir von der dieser Website ein Makro genommen
https://www.denisreis.com/excel-vba-bestimmte-zeilen-in-eine-andere-tabelle-kopieren/

Sub BedingteKopieZeilen()
Dim Zeile As Long
Dim ZeileMax As Long
Dim n As Long
With Angebot
ZeileMax = .UsedRange.Rows.Count
n = 1
For Zeile = 2 To ZeileMax
If .Cells(Zeile, 17).Value  "" Then
.Rows(Zeile).Copy Destination:=Test.Rows(n)
n = n + 1
End If
Next Zeile
End With
End Sub
Leider bekomme ich beim Start des Makros die folgende Fehlermeldung:
Fehler beim Kompillieren:
With-Objekt muss einen benutzerdefinierten Typ oder den Typ Objekt oder Variant haben.
Da ich leider von VBA nicht so richtig gut viel verstehe, weis ich nicht, was in dem Makro falsch ist.
Könnte Ihr mir da evtl. helfen?
Gruß
Info

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bestimmte Zeilen in eine andere Tabelle
15.06.2021 11:16:59
peterk
Hallo
Folgende Vermutung: Angebot und Test sind Tabellenblätter, dann

With Worksheets("Angebot")
bzw.
Destination:= Worksheets("Test").Rows(n)

Spalte mit Namen statt Zahl ansprechen
15.06.2021 11:54:08
Ingo
Hallo peterk
Oh ja super. Alles klar. Jetzt funktioniert es.
Ich habe noch eine Frage. In der folgenden CodeZeile wird die Spalte Q ja mit der Ziffer 17 "angesprochen".
If .Cells(Zeile, 17).Value "" Then
Wenn ich an meiner Tabelle später mal was umbaue, kann es ja evtl. zur Folge haben, dass die Spalte an eine andere Stelle wandert. Und damit ich dann nicht den VBA-Code anpasse muss, würde ich die Spalte gerne mit ihrem Spaltennamen ansprechen. Der lautet bei mir "Lager". Ich meine nicht die Spaltenüberschrift, sondern den Spaltennamen, den man in Excel ja jeder Spalte geben kann.
Ist das machbar?
Gruß
Ingo
Anzeige
AW: Spalte mit Namen statt Zahl ansprechen
15.06.2021 12:04:52
Werner
Hallo,
so:

If .Cells(Zeile, .Range("Lager").Column).Value  "" Then
Gruß Werner
AW: Spalte mit Namen statt Zahl ansprechen
15.06.2021 12:38:35
Ingo
Hallo Werner
Super. Danke Dir sehr!
In der folgenden Codezeile wird ja jetzt immer die ganze Zeile kopiert.
.Rows(Zeile).Copy Worksheets("Test").Rows(n)
Wie mache ich es denn, dass hier nicht die komplette Zeile kopiert wird, sondern nun der Bereich von Spalte "id" bis Spalte "shipping"?
Gruß
Ingo
AW: Spalte mit Namen statt Zahl ansprechen
15.06.2021 13:50:34
Daniel
Hi
beispielsweilse so

.Range(.Cells(Zeile, Range("id").Column), .cells(Zeile, Range("shipping").Column)).Copy
oder

Intersect(.Rows(Zeile), Range(Range("id"), Range("shipping")).entirecolumn).copy
mit Variablen:

.Range(Cells(Zeile, spID), .Cells(Zeile, spShipping)).Copy
oder so, was immer dann sinnvoll ist wenn du die WITH klammer für was anderes brauchst als das betroffene Tabellenblatt, denn hier musst du das Tabellenblatt nur 1x angeben

Sheets(...).Cells(Zeile, spID).Resize(1, spShipping - spID + 1).Copy
Gruß Daniel
Anzeige
Geht das auch nur mit Werten?
15.06.2021 17:07:29
Ingo
Hallo Daniel
Wenn ich folgenden Code von Dir anwende, klappt das schon mal soweit:
.Range(.Cells(Zeile, Range("id").Column), .cells(Zeile, Range("shipping").Column)).Copy
Die Sache hat allerdings noch einen Haken.
Und zwar sind die Zelleninhalte in der Ursprungstabelle teilweise mit Formeln belegt. Und wenn Dein Code die Zeilen dann in das neue Tabellenblatt kopiert, gehen die Bezüge verloren. Könnte man die Zeilen auch so kopieren, dass nur die Werte kopiert werden?
Gruß
Ingo
was hälst du davon...
15.06.2021 19:55:33
Werner
Hallo,
...mal die Foren-Suche zu verwenden.
VBA - kopieren - einfügen - nur Werte
Gruß Werner
Anzeige
AW: was hälst du davon...
15.06.2021 20:02:51
Ingo
Hallo Werner
Das hatte ich mir auch schon gedacht. Wenn ich oben rechts hier die Suchfunktion nutze, bekomme ich allerdings keine Suchergebnisse. Das liegt ja vermutlich daran, dass damit nur die aktuelleren Beträge durchsucht werden. Wie ich hier auch in den älteren beträgen suchen kann, habe ich bisher noch nicht begriffen.
Gruß
Ingo
AW: was hälst du davon...
15.06.2021 20:16:05
Ingo
Hallo nochmal
Ich habe danach auch schon eine ganze zeit lang gegooglet. Aber ich habe die Lösung noch nicht verstanden.
Dann habe ich auch mal versucht, so einen Nur-Werte-Kopiervorgang per Makrorekorder aufzuzeichnen, um daraus schlau zu werden. Da kommt dan das hier heraus:
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Wenn ich das richtig verstehe, wird dort der selektierte Teil aus der Zwischenablage in das Ziel so eingefügt, dass eben nur die Werte Verwendung finden. Stimmt das soweit erstmal?
In meinem Code
.Range(.Cells(Zeile, Range("id").Column), .cells(Zeile, Range("shipping").Column)).Copy Worksheets("Google").Rows(n)
weis ich aber nicht, wie ich das dann verwenden muss.
Weil da ja nicht mit der Zwischenablage gearbeitet wird.
Oder?
Gruß
Ingo
Anzeige
AW: was hälst du davon...
15.06.2021 22:59:45
ralf_b
Könnte so gehen. Die Selection aus dem Recodercode ist hier der Einfügebereich Rows(n). Wobei eine ganze Zeile als Einfügepunkt gut ist, mußt du probieren.
evtl. Rows(n).Cells(1,1)

with .Range(.Cells(Zeile, Range("id").Column), .cells(Zeile, Range("shipping").Column))
.Copy
Worksheets("Google").Rows(n).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False, Transpose:=False
end with

AW: was hälst du davon...
16.06.2021 11:11:38
Ingo
Hallo Ralf
Oh ja super. Ich danke Dir.
Gruß
Ingo
AW: Spalte mit Namen statt Zahl ansprechen
15.06.2021 12:15:25
Daniel
Hi
wenn deine Spalte einen Namen hat, dann so wie von Werner beschrieben.
alternativ kannst du auch weiterhin die Spaltennummer verwenden, allerdings dann besser nicht als feste Zahl, sondern analog zur Zeile als Variable.
diese Variable weist du dann einmal im Code zu und verwendest danach nur noch die Variable.
Wenn sich jetzt die Spalte ändert und eine automatische Berechnung nicht möglich ist, dann musst du nur an einer Stelle in den Code eingreifen und nicht in vielen:

dim spLager als Long
spLager = 17
if .cells(Zeile, spLager).value  "" then
natürlich kannst du das auch mit der Methode von Werner kombinieren, wenn du einen Namen für die Spalte hast:

spLager = Range("Lager").Column
oder du kannst hier nach einer Überschrift suchen, falls diese das Merkmal ist.

spLager  = Rows(1).Find(what:="Lager").Column
durch den Einsatz der Variablen wird der Code dann kürzer und auch besser Lesbar (sofern du dir einen "schönen" Variablennamen ausdenkst)
wenn du die Spalte nur 1-2x im Code brauchst, dann würde ich die Variante von Werner direkt in den Code einbauen, falls du das öfters benötigst, ist der Weg über die Variable sinnvoller.
Gruß Daniel
Anzeige
AW: Spalte mit Namen statt Zahl ansprechen
15.06.2021 12:31:15
Ingo
Hallo Daniel
Ich danke Dir sehr für Deinen Vorschlag.
Da ich den Spaltennamen im Code allerdings tatsächlich nur einmal brauche, mache ich es lieber mit dem Spaltennamen. Das ist für mich als Laie dann später auch einfacher verständlich.
Gruß
Ingo
AW: Spalte mit Namen statt Zahl ansprechen
15.06.2021 13:43:50
Daniel
wenns so is, isses so.
sowas ändert sich halt schnell beim nächsten größeren Projekt oder mit der nächsten Projekterweiterung.
spalteLager ist halt kürzer als Range("Lager").Column
außerdem musst du bei Range("Lager") immer auswendig wissen, wie der Zellbereich korrekt heißt, wenn du den Code schreibst.
hast du das mal als Variable definiert, hilft dir die Intellisense (STRG+ALT)
Gruß Daniel
Anzeige
AW: Spalte mit Namen statt Zahl ansprechen
15.06.2021 13:44:01
Daniel
wenns so is, isses so.
sowas ändert sich halt schnell beim nächsten größeren Projekt oder mit der nächsten Projekterweiterung.
spalteLager ist halt kürzer als Range("Lager").Column
außerdem musst du bei Range("Lager") immer auswendig wissen, wie der Zellbereich korrekt heißt, wenn du den Code schreibst.
hast du das mal als Variable definiert, hilft dir die Intellisense (STRG+ALT)
Gruß Daniel
Spalte mit Namen statt Zahl ansprechen
15.06.2021 12:08:50
Ingo
Hallo peterk
Oh ja super. Alles klar. Jetzt funktioniert es.
Ich habe noch eine Frage. In der folgenden CodeZeile wird die Spalte Q ja mit der Ziffer 17 "angesprochen".
If .Cells(Zeile, 17).Value "" Then
Wenn ich an meiner Tabelle später mal was umbaue, kann es ja evtl. zur Folge haben, dass die Spalte an eine andere Stelle wandert. Und damit ich dann nicht den VBA-Code anpasse muss, würde ich die Spalte gerne mit ihrem Spaltennamen ansprechen. Der lautet bei mir "Lager". Ich meine nicht die Spaltenüberschrift, sondern den Spaltennamen, den man in Excel ja jeder Spalte geben kann.
Ist das machbar?
Gruß
Ingo
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige