Anzeige
Archiv - Navigation
1940to1944
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

Bereich suchen und extrahieren

Bereich suchen und extrahieren
22.08.2023 17:09:13
Peter
HalliHallo zusammen,

ich habe eine Tabelle aus der ich regelmäßig Daten hereinkopiert bekomme. Die Daten kommen aus einem gesonderten Programm und wir können das so schnell nicht ändern.
Jetzt würde ich sie gerne in den Blöcken, in denen die Daten importiert werden in ein jeweils seperates Arbeitsblatt in die erste freie Zeile kopieren.

Das einzige was die Blöcke unterscheidet sind die Indexnamen in Spalte A. Die sind aufgebaut in Spalte A NAME#1 zu NAME#1 (Anfang1,Ende1 in der Tabelle).
Leider wird kein Wert in den eigendlichen Daten hinterlegt, mit denen man einfach Filtern könnte.
Ohne die Indexnamen kann man also von außen nicht nachvollziehen, ob zeile x aus Block NAME#1 kommt oder nicht

Die Blöcke sind variabel in der Zeilenanzahl, aber relativ statisch im der Spaltenanzahl. Deshalb sind die Spalten Fest B:Q.
So stelle ich mir das gerade vor:


Sub extrahieren()

Dim shtQuelle As Worksheet, shtZiel1 As Worksheet, shtZiel2 As Worksheet ' shtZiel3...shtZiel10 usw.

Dim Rng1 As Range
Dim Rng2 As Range
'auch hier Rng3...Rng10 usw.
Dim zlr1 As Long
Dim zlr2 As Long
'...

Set shtQuelle = Worksheets("2023")
Set shtZiel1 = Worksheets("Ziel1")
Set shtZiel2 = Worksheets("Ziel2")
'...

'firstrow suchen
fr1 = shtQuelle.Cells.Find("Anfang1", _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row + 1 '+1 weil die Daten erst eine Zeile darunter anfangen

'lastrow suchen
lr1 = shtQuelle.Cells.Find("Ende1", _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row - 1 '-1 weil die Daten schon eine Zeile darüber aufhören

'lastrow im Ziel1 suchen
zlrl = shtZiel1.Cells(Rows.Count, "B").End(xlUp).Row

'lastrow im Ziel2 suchen
zlr2 = shtZiel1.Cells(Rows.Count, "B").End(xlUp).Row


Set Rng1 = shtQuelle.Range(""B" & fr1" : ""Q" & lr1") ' weiß nicht wie ich das verknüpfen kann =/
Rng1.Copy shtZiel1.Cells(zlrl, 2)

fr2 = shtQuelle.Cells.Find("Anfang2", _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row + 1

lr2 = shtQuelle.Cells.Find("Ende2", _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row - 1

Set Rng2 = shtQuelle.Range(""B" & fr2" : ""Q" & lr2")
Rng2.Copy shtZiel2.Cells(zlr2, 2)

End Sub

Beispieldatei:
https://www.herber.de/bbs/user/162439.xlsm
Knallhart Zenziert... aber bis auf die Daten fast so blank wie im Original =)

Hoffentlich habe ich mich verständlich ausgedrückt.
Schon mal vielen Dank für eure Hilfe

Schöne Grüße
Peter

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bereich suchen und extrahieren
22.08.2023 18:39:51
Ulf
Hi Peter,
ändere


Set Rng1 = shtQuelle.Range(""B" & fr1" : ""Q" & lr1")

zu


Set Rng1 = shtQuelle.Range("B" & fr1 ":Q" & lr1)

dito Rng2
hth Ulf
AW: Bereich suchen und extrahieren
22.08.2023 20:06:05
daniel
HI
erster Schritt zur Vereinfachung:
deklariere dir fr1 und lr1 als range und weise diesen das .Find-Ergebnis zu:
darüber kannst du dann die rng1 definieren.
damit reicht dann als Code für das Kopieren eines Blocks das hier aus:
set fr1 = shtQuelle.Cells.Find(what:="Anfang 1", lookat:=xlwhole)

set lr2 = shtQuelle.Cells.Find(what:="Ende 1", lookat:=xlwhole)
set Rng1 = Range(fr1.Offset(1, 1), lr1.Offset(-1, 16))
Rng1.Copy Destination:=shtZiel1.Cells(Rows.count, 2).end(xlup).Offset(1, 0)


wie sind denn bei dir Anfangx, Endex, sowie die Zieltabellenblätter tatsächlich benannt?
spielt der Name überhaupt eine Rolle?
wenn man die Blöcke einfach der Reihe nach in die Tabellenblätter kopieren kann, könnte man auch eine Schleife drüber laufen lassen.

Gruß Daniel
Anzeige
AW: Bereich suchen und extrahieren
22.08.2023 21:24:40
GerdL
Moin Peter!
Sub Unit()


With Sheets("2023")
With .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp)).SpecialCells(xlCellTypeConstants)
Call .Areas(2).Resize(, 16).Copy( _
Destination:=Worksheets("Ziel1").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0))
Call .Areas(3).Resize(, 16).Copy( _
Destination:=Worksheets("Ziel2").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0))
End With
End With

End Sub

Gruß Gerd

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige