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

ereich mittels .find auswählen und kopieren

ereich mittels .find auswählen und kopieren
09.03.2013 18:28:13
AcJoker
Hallo,
ich bin auf der Suche nach einem Makro das mir meine Tabelle in bestimmte Bereich aufteilt indem es nach wiederkehrenden Werten sucht und dann den Bereich kopiert.
So sieht meine Tabelle aus, etwas verkürzt.
In Spalte N soll nach 1:1 gesucht werden und der Bereich darüber bis hin zur 1. Funstelle inkl. Spalte K und L sollen kopiert werden.
Tabelle1

 JKLM
1ABCXYZ 1,1:1
2ABCXYZ 1,1:2
3ABCXYZ 1,1:3
4ABCXYZ 1,1:20
5ABCXYZ 1,2:1
6ABCXYZ 1,2:20
7ABCXYZ 1,3:1
8ABCXYZ 1,3:19
9ABCXYZ 1,3:20
10ABCXYZ 1,4:1
11ABCXYZ 1,4:20
12ABCXYZ 2,1:1
13ABCXYZ 2,1:2
14ABCXYZ 2,1:20
15ABCXYZ 2,2:1
16ABCXYZ 2,2:20
17ABCXYZ 2,3:1
18ABCXYZ 2,3:20
19ABCXYZ 2,4:1
20ABCXYZ 2,4:18
21ABCXYZ 1,1:1
22ABCXYZ 1,1:20
23ABCXYZ 1,2:1
24ABCXYZ 1,2:20
25ABCXYZ 1,3:1
26ABCXYZ 1,3:20
27ABCXYZ 1,4:1
28ABCXYZ 1,4:20
29ABCXYZ 2,1:1
30ABCXYZ 2,1:20
31ABCXYZ 2,2:1
32ABCXYZ 2,2:20
33ABCXYZ 2,3:1
34ABCXYZ 2,3:19
35ABCXYZ 2,3:20
36ABCXYZ 2,4:1
37ABCXYZ 2,4:13


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Es sollte danach also so aussehen.
Tabelle2

 ABCDEFGHIJKLMNO
1ABCXYZ1,1:1 ABCXYZ2,1:1 ABCXYZ1,1:1 ABCXYZ2,1:1
2ABCXYZ1,1:2 ABCXYZ2,1:2 ABCXYZ1,1:20 ABCXYZ2,1:20
3ABCXYZ1,1:3 ABCXYZ2,1:20 ABCXYZ1,2:1 ABCXYZ2,2:1
4ABCXYZ1,1:20 ABCXYZ2,2:1 ABCXYZ1,2:20 ABCXYZ2,2:20
5ABCXYZ1,2:1 ABCXYZ2,2:20 ABCXYZ1,3:1 ABCXYZ2,3:1
6ABCXYZ1,2:20 ABCXYZ2,3:1 ABCXYZ1,3:20 ABCXYZ2,3:19
7ABCXYZ1,3:1 ABCXYZ2,3:20 ABCXYZ1,4:1 ABCXYZ2,3:20
8ABCXYZ1,3:19 ABCXYZ2,4:1 ABCXYZ1,4:20 ABCXYZ2,4:1
9ABCXYZ1,3:20 ABCXYZ2,4:18     ABCXYZ2,4:13
10ABCXYZ1,4:1            
11ABCXYZ1,4:20            


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Ideal wäre wenn es in ein neues Tabellenblatt eingefügt würde.
Wie kann ich so etwas realisieren?
Für den Startpunkt kann eine fixe Position (N1) angegeben werden.
Wenn ich wüsste wie, würde ich wie folgt versuchen vorzugehen.
Beginn Bereich 1 = feste Position
Beginn Bereich 2 = erstes auffinden von *,1:1 (Die Suche danach darf erst eine Zeile unterhalb der festen Position aus beginn Bereich 1 anfangen)
Daraus ergibt sich das Ende von Bereich 1 eine Zeile über dem beginn von Bereich 2 ist.
Somit ist Bereich 1 vollständig erfasst und kann kopiert werden.
Danach müsste der Beginn von Bereich 3 bestimmt werden und daraus dann wieder das Ende von Bereich 2.
Wenn nichts mehr gefunden wird ist die letzte Position in der Spalte auch das Ende vom letzten Bereich.
Die Anzahl an Bereich ist nicht limitiert.
Soviel zur Theorie, nur leider habe ich keinen Plan wie ich so etwas in die Praxis umsetze.
Einfache Makro funktionen kann, auch das Umschreiben von bekannten klappt recht gut, aber solch eine Abfrage zu erstellen ist mir noch etwas zu schwer. Sad
Danke für Eure Hilfe.
Gruß
Joker

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Immer komplizierter Deine Beschreibungen ...
09.03.2013 18:44:17
Matthias
Hallo
Zitat

So sieht meine Tabelle aus, etwas verkürzt.
In Spalte N soll nach 1:1 gesucht werden und der Bereich darüber bis hin zur 1. Funstelle inkl. Spalte K und L sollen kopiert werden.

Ende Zitat
Irgendwie drückst Du Dich immer wieder unglücklich aus.
In Tabelle1 Spalte(N) sieht man nichts!
In Tabelle2 Spalte(N) steht überall XYZ
In Spalte N soll nach 1:1 gesucht werden ? Ich versteh schon die ganze Zeit nicht was Du willst.
Vielleicht hat aber Erich die Glaskugel noch nicht weggeräumt.
Ich lass mal "offen"
Gruß Matthias

Anzeige
AW: Immer komplizierter Deine Beschreibungen ...
09.03.2013 18:59:52
AcJoker
Ups, wohl echt nicht mein Tag, auch den Titel habe ich verhauen. :-(
Aber es sollte natürlich Spalte M in Tabelle 1 lauten, N wird ja auch nicht angezeigt und wo anders stehen ja auch keine Zahlen.
Demnach soll natürlich auch nicht Spalte K & L sondern J & K mit kopiert werden.
Ich bin also einfach eine Spalte zu weit nach rechts gerutscht bei meiner Beschreibung.
Es soll also in Spalte M soll nach 1:1 gesucht werden. Die entsprechenden Einträge sind extra rot markiert.
D.h. der Bereich vom Tabellanfang bis eine Zeile vor dem ersten auftreten von 1:1 in Zeile M machen den ersten zu kopierenden Bereich aus.
Der nächste zu kopierden Bereich geht dann vom schon gefundene 1:1 bis eine Zeile vor dem nächsten 1:1.
So das es dann später so aussieht wie in Tabelle 2.

Anzeige
Ich hatte den Beitrag extra offen gelassen ...
09.03.2013 19:22:57
Matthias
Hallo
... damit man erkennt, das Du noch keine Lösung hast!
Durch Deine Antwort wurde Dein Beitrag aus den "offenen Beiträgen" elimieniert!
Ich stell ihn jetzt wieder auf "offen", da ich mich in Dein Projekt nicht reindenken kann.
Gruß Matthias

OK, nun sollten es passen, weiter im anderen Zweig
09.03.2013 19:47:43
AcJoker
Sorry, ich habe diese Forenfunktion noch in keinem anderen Forum bisher in dieser Art gesehen.
Ich hoffe das war´s nun mit Fehlern für heute.
Ich habe einen neuen Zweig eröffnet damit dort alles sauber weiter laufen kann.
Danke für deine Hilfestellung.

Bereich mittels .find auswählen und kopieren
09.03.2013 19:45:17
AcJoker
So, damit wir hier einen sauberen Zweig haben und die Fehler in der Frage diekt geklärt werden. In Spalte N soll nach 1:1 gesucht werden und der Bereich darüber bis hin zur 1. Funstelle inkl. Spalte K und L sollen kopiert werden. Hier sollte es eigentlich heißen.

In Spalte M soll nach 1:1 gesucht werden und der Bereich darüber
bis hin zur 1. Funstelle inkl. Spalte J und K sollen kopiert werden.

Ich war beim Schreiben in der Spalte verrutscht. Sorry.
Auch hier ...
Für den Startpunkt kann eine fixe Position (N1) angegeben werden

Soll es natürlich M1 heißen.
Sorry für die blöden Fehler.

Anzeige
Neue Lösungsidee
09.03.2013 20:14:33
AcJoker
Mir ist leider ein mögliches Problem aufgefallen.
Und zwar kann es auch Werte in Spalte M geben die wie folgt aussehen.
1,1:10
1,1:11
1,1:12
1,1:13
usw.
Sie alle enthalten natürlich auch den Wert 1:1.
Evtl. kann man ja bei .Find dies irgenwie parametrieren oder durch eine Routine die überprüft das die Zelle 5 Zeichen und nicht 6 Zeichen enthält abfangen.
In meinem Beispiel ist dies nicht ersichtlicht da ich genau in diesem Bereich das Beispiel verkürzt habe wegen der Übersichtlichkeit.
Eine andere mögliche Lösung wäre aus meiner sicht das man Spalte J, K und M zeilenweise in ein neues Tabellenblatt in den Bereich A:C kopiert und dabei prüft ob in Spalte M 1:1 steht (unter Beachtung der oben beschrieben Problems). Steht dort 1:1 muss die Zeile und alle folgenden in einen neuen Bereich (also z.B. E:F) kopiert werden.

Anzeige
VBA-Spaltenteiler
09.03.2013 20:56:40
Erich
Hi Markus,
schau dir das mal an:

Option Explicit
Sub SpaltenTeiler()
Dim sKey As Long, sWvon As Long, sWbis As Long, sAb As Long, sZw As Long
Dim strK As String, lngZ As Long, arrK, arrW, qz As Long, qc As Long
Dim arrE(), zz As Long, zc As Long, kk As Long
sKey = 5       ' Schlüssel in Spalte 5 = E
strK = ",1:1"  ' Trennung vor diesem Text
sWvon = 1      ' kopiere Werte von Spalte 1 = A
sWbis = 2      '               bis Spalte 2 = B
sAb = 17       ' Ausgabe ab Spalte 17 = Q
sZw = 1        ' dazwischen jeweils 1 Spalte leer
lngZ = Cells(Rows.Count, sKey).End(xlUp).Row
arrK = Application.Transpose(Cells(1, sKey).Resize(lngZ))
arrW = Cells(1, sWvon).Resize(lngZ, sWbis + 1 - sWvon)
qc = Application.CountIf(Range("E1:E" & lngZ), "*" & strK)
ReDim arrE(1 To lngZ, 1 To qc * (sWbis + 2 + sZw - sWvon) - sZw)
For zc = 1 To UBound(arrW, 2)
arrE(1, zc) = arrW(1, zc)
Next zc
arrE(1, zc) = arrK(1)
zz = 1
zc = 1
For qz = 2 To lngZ
If arrK(qz) Like "*" & strK Then
zz = 0
zc = zc + sWbis + sZw - sWvon + 2
End If
zz = zz + 1
For kk = 1 To UBound(arrW, 2)
arrE(zz, zc + kk - 1) = arrW(qz, kk)
Next kk
arrE(zz, zc + kk - 1) = arrK(qz)
Next qz
Cells(1, sAb).Resize(UBound(arrE), UBound(arrE, 2)) = arrE
End Sub
Gelaufen ist das in dieser Mappe: https://www.herber.de/bbs/user/84270.xls
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: VBA-Spaltenteiler
10.03.2013 00:38:25
AcJoker
Herzlichen Dank für deine ganze Mühe heute.
Ich habe inzwischen eine andere Lösung dafür gefunden.
Nun passt alles vorne und hinten.

AW: ereich mittels .find auswählen und kopieren
09.03.2013 21:36:37
Peter
Hallo Joker,
warum Crossposting mit www.office-loesung.de?
Ich hatte Dir da ja bereits eine optimierte Variante meiner ersten Antwort geschickt, die auc Dein neues Problem erledigt.
Option Explicit
Public Sub Find_Methode()
Dim WkSh_Q        As Worksheet  ' das Quell-Tabellenblatt - die Herkunft
Dim WkSh_Z        As Worksheet  ' das  Ziel-Tabellenblatt - die Ausgabe
Dim rZelle        As Range      ' die Zelle mit dem gefundenen Suchbegriff
Dim sFundst       As String     ' die erste Fundstelle des Suchbegriffs
Dim sSuchbegriff  As String     ' der Suchbegriff
Dim lStart        As Long       ' die Start-Zeile des zu kopierenden Bereichs
Dim iSpalte       As Integer    ' die Ausgabe-Spalte
Dim lLetzte       As Long       ' die letzte belegte Zeile im Quell-Tabellenblatt
Set WkSh_Q = ThisWorkbook.Worksheets("Tabelle1") ' den Tabellenblattnamen ggf. anpassen!
Set WkSh_Z = ThisWorkbook.Worksheets("Tabelle2") ' den Tabellenblattnamen ggf. anpassen!
sSuchbegriff = "1:1"
lStart = 1 ' der erste zu kopierende Bereich beginnt in Zeile 1
iSpalte = 1 ' die Beginn des ersten zu kopierenden Bereichs
Application.ScreenUpdating = False ' kein Bildschirm-Update = kein flackern
With WkSh_Q.Columns(14) ' im Quell-Tabellenblatt in der Spalte 14 = N suchen
Set rZelle = .Find(What:=sSuchbegriff, LookAt:=xlPart, LookIn:=xlValues, After:=.Cells(. _
Cells.Count))
If Not rZelle Is Nothing Then ' der Suchbegriff wurde gefunden
sFundst = rZelle.Address   ' die erste Fundstelle merken/speichern
Do
If Right(rZelle.Value, 3) = sSuchbegriff Then
If rZelle.Row  1 Then
WkSh_Q.Range(WkSh_Q.Cells(lStart, 11), WkSh_Q.Cells(rZelle.Row - 1, 14)).Copy  _
Destination:= _
WkSh_Z.Cells(1, iSpalte)
lStart = rZelle.Row
iSpalte = iSpalte + 4
End If
End If
Set rZelle = .FindNext(rZelle) ' den evtl. nächsten Begriff suchen
Loop While Not rZelle Is Nothing And rZelle.Address  sFundst
Else
MsgBox "Der Begriff  """ & sSuchbegriff & """  wurde nicht gefunden.", _
48, "   Hinweis für " & Application.UserName
End If
End With
lLetzte = WkSh_Q.Cells(WkSh_Q.Rows.Count, 11).End(xlUp).Row
WkSh_Q.Range(WkSh_Q.Cells(lStart, 11), WkSh_Q.Cells(lLetzte, 14)).Copy Destination:= _
WkSh_Z.Cells(1, iSpalte)
End Sub

Gruß Peter

Anzeige
sorry - CROSS
10.03.2013 00:00:08
Erich
Hi Markus,
ich finde es wenig erheiternd, wenn man (jetzt leider zu spät) sieht, dass man - ohne voneinander zu wissen -
parallel an denselben Aufgaben gearbeitet hat.
und tschüss... - Grüße aus Kamp-Lintfort von Erich :-(
@Peter: Danke für den Cross-Hinweis! :-)

Sorry
10.03.2013 01:02:06
AcJoker
Sorry, ich wollte niemanden verärgern.
Es stimmt das ich inzwischen auch im anderen Forum meine Fragen gestellt habe.
Aber beide Fragen standen zu anfang einige Zeit lang nicht in beiden Foren sondern je eine Frage pro Forum.
Hier hatte ich schon öfters mal hilfe erhalten, das andere Forum kannte ich noch nicht und wollte es mal testen.
Nach einiger Zeit habe ich mich dann entschlossen die jeweils fehlende Frage auch zu stellen.
Je mehr User umso mehr Ideen.
Ich kenne die Verwirrungen der beiden Foren nicht. In manchen Foren ist es absolut nicht gewünscht z.B. links zum anderen Forum einzustellen.
Was den vorwurf der doppelten Arbeit angeht so sehe ich dies nicht ganz so.
Egal ob eine Frage in einem oder zwei Foren gestellt ist, es können immer mehrere Personen an einer Lösung arbeiten ohne voneinander zu wissen.
Nachdem ich deine Lösung zum Thema Position erfolgreich umgesetzt hatte und daraufhin die Lösung des Splitens aus dem anderen Forum auch erfolgreich eingebaut habt, habe ich dort sofort gepostet das alles klar ist und ich keine weitere hilfe mehr benötige.
Selbes hatte ich nun auch hier vor.
Leider war aber dann hier schon das Kind in den Brunnen gefallen was mir sehr leid tut.
Mir lag es fern irgend jemanden vor den Kopf zu stoßen.
Ich bin froh das es Foren wie diese gibt bei denen Leute in Ihrer Freizeit anderen bei Ihren Problemen helfen.
Hiermit noch mal in aller Förmlichkeit eine Entschuldigung von mir falls ich jemanden verärgert haben sollte.

Anzeige
OT: Crossp
11.03.2013 09:43:18
Klaus
Hi Joker,
Was den vorwurf der doppelten Arbeit angeht so sehe ich dies nicht ganz so.
Egal ob eine Frage in einem oder zwei Foren gestellt ist, es können immer mehrere Personen an einer
Lösung arbeiten ohne voneinander zu wissen.

Es ist aber relativ irrelevant, wie du das siehst, denn im FAQ unter "Rundumschlag" (=Crosspost) wird explizit darauf hingewiesen, wie dieses Forum es sieht.
https://www.herber.de/forum/faq.htm
Ich zB sehe es auch nicht als schlimm an, wenn jemand den Kopierschutz einer Musik-CD knackt und dann mp3s an eine handvoll Freunde verteilt. Ist aber irrelevant wie ich das sehe, sind trotzdem 5 Jahre Knast drauf! ;-)
Grüße,
Klaus M.vdT:
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige