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

Zeilen per Makro kopieren

Zeilen per Makro kopieren
23.03.2016 20:13:30
Manfred
Hallo Forum-Freunde,
ich bin neu im Forum und habe nur sehr wenig Erfahrung mit VBA.
Ich suche schon eine ganze Weile nach einer Lösung für mein Problem, bin jedoch hier im Forum oder bei Google nicht fündig geworden.
Ich habe eine Tabelle mit jeweils ca. 2000 Temperatur- und Zeitwerten in 12 Spalten (E-Q). Nun möcht ich den gesamten Spaltenbereich (E-Q) wo die Temperatur zum ersten mal den 520 °C Bereich überschreitet bis zum letzen mal, wo der Temperaturbereich von 620°C überschritten (Daten in Beispieldatei rot markiert) wird in eine neue Tabelle kopieren. Übrigens ich benutze Office 2016.
Der Spaltenbereich ist immer konstant, jedoch die Zeilenanzahl variiert bei jeder Messung.
Folgenden Code habe ich mir zusammengestellt, jedoch funktioniert er nur, wenn ich die Spalten-und Zeilennummer fest vergebe. Ich möchte aber den Zeilenbereich, den ich in Zelle E2 und E3 berechne, variabel vorgeben.
Private Sub CommandButton1_Click()
Worksheets("tabelle1").UsedRange.ClearContents
Dim firstrow As Long
Dim firstcol As Long
Dim lastrow As Long
Dim lastcol As Long
firstrow = 2
firstcol = 5
lastrow = 3
lastcol = 5
Sheets("Daten_gefiltert").Activate
'Folgende Zeile liefert die falschen Werte!
'Range(Cells(firstrow, firstcol), Cells(lastrow, lastcol)).Select
Range(Cells(419, 5), Cells(497, 16)).Select
Selection.copy
Selection.PasteSpecial Paste:=xlPasteValues
Sheets("Tabelle1").Activate
ActiveSheet.Rows("2:2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub
Hier kann man sich auch die Datei holen.
https://www.herber.de/bbs/user/104580.xlsm
Ich hoffe, ich habe mich verständlich ausgedrückt
und bedanke mich im voraus
Manfred

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen per Makro kopieren
23.03.2016 21:59:20
Fennek
Hallo Manfred,
zuerst, ich habe deine Datei nicht geöffnet, deshalb prüfe bitte genau, ob der Code deinen Erwartungen entspricht.

Sub Manfred()
Dim rng as range
With sheets(1).columns("E:Q")
For Tmin 520 to 550
Set rng = .find(Tmin)
In not rng is nothing then exit for
Next Tmin
Debug.print rng.address
For Tmax = 620 to 650
Set rng = .find(Tmax)
If not Tmax is nothing then exit for
Debug.print rng.address
End with
End sub
Das 'Direktfenster' kann st du im vba-Fenster mit 'strg-g' öffnen.
Mfg

AW: Zeilen per Makro kopieren
24.03.2016 19:01:37
Manfred
Hallo Fennek,
zunächst einmal viel Dank für deinen Einsatz.
Leider bekomme ich eine Fehlermeldung "End With ohne With".
Ich habe schon Google gefragt komme aber nicht weiter.
Außerdem habe ich folgende Zeilen geändert da sie rot markiert waren.
"For Tmin 520 to 550" in
"For Tmin = 520 to 550"
und
"In not rng is nothing then exit for" in
"If not rng is nothing then exit for"
Ich weiß aber nicht ob das richtig ist.
Gruß
Manfred

Anzeige
AW: Zeilen per Makro kopieren
24.03.2016 20:43:06
Fennek
Hallo Manfred,
ich tippe die codes vom pc in ein Tablet, da kann schon mal was daneben gehen.
Für die Fehlermeldung 'with: vor dem 'end with, fehlt ein 'next Tmax'.
Nachdem ich den code gesendet habe, fragte ich mich, ob Tmax wirklich das letzte Mal einer Temp über 620 ist, und nicht wie bei Tmin das erste Mal. Du solltest das prüfen, eventuell braucht der find-Befehl einen Zusatz.
Mfg

AW: Zeilen per Makro kopieren
24.03.2016 21:03:58
Manfred
Hallo Fennek,
im Einzelschrittmodus bekomme ich bei Zeile
"If Not Tmin Is Nothing Then Exit For"
eine Fehlermeldung.
Laufzeitfehler 424. Objekt erforderlich
Gruß
Manfred
Sub Manfred()
Dim rng As Range
With Sheets(1).Columns("E:Q")
For Tmin = 520 To 550
Set rng = .Find(Tmin)
If Not Tmin Is Nothing Then Exit For
Next Tmin
Debug.Print rng.Address
For Tmax = 620 To 650
Set rng = .Find(Tmax)
If Not Tmax Is Nothing Then Exit For
Debug.Print rng.Address
Next Tmax
End With
End Sub

Anzeige
AW: Zeilen per Makro kopieren
24.03.2016 23:54:39
Fennek
Hallo Manfred,
versuche
If not rng is nothing then exit for
Bei ersten Treffer soll die Schleife beendet werden. Das selbe weiter unten bei Tmax.
Mfg

AW: Zeilen per Makro kopieren
25.03.2016 09:59:40
Fennek
Hallo Manfred,
teste mal diesen Code, er ist etwas einfacher und effizienter.

Sub Manfred2()
ur = activesheet.usedrange.address
Sx = split(ur, "$")
lr = Sx(4)
With sheets(1).columns("E:Q")
.interior.colorindex = xlnone
'Tmin
For i = 2 to lr
If not iserror(application.match(530, .rows(i), -1)) then
.rows(i).interior.color = vbyellow
Exit for
Endif
Next i
'Tmax
For i = lr to 2 step -1
If not iserror(application.match(620, .rows(i), -1)) then
.rows(i).interior.color = vbred
Exit for
End if
Next i
End with
End sub
Mfg

Anzeige
AW: Zeilen per Makro kopieren
25.03.2016 12:07:40
Manfred
Hallo Fennek,
sorry das ich mich nicht immer sofort auf deine Antwort melde, aber ich versuche das, was Du schreibst, auch zu verstehen und das ist bei mir leider immer mit umfangreichen Google-recherchen verbunden.
Dein letzter Code läuft, jedoch, wenn ich es richtig verstehe, sollen bei einer Übereinstimmung die Zeilen gelb bzw. rot gefärbt werden. Liege ich da richtig? Es ändert sich jedoch nichts an der Tabelle.
Vielleicht habe ich mich in meiner ersten Anfrage auch unverständlich ausgedrückt.
Ich bekomme von einem Datenlogger eine CSV-Datei mit 30000 bis 45000 Zeilen immer beginnend ab Zeile 9. Die Spalten sind immer Fest (E:Q). In Spalte E wird der Meßzeitpunkt gespeichert, in den restlichen Spalten steht der Temperaturverlauf der Aufheizung und Abkühlung. Folglich ist in jeder Spalte der von mir gesucht Bereich zweimal vorhanden, mich interessiern jedoch nur die Daten der Aufheizung, Bereich 520°C bis 620°C da ich diese für ein Diagramm brauche. Vielleicht kennst Du ja eine wesentlich einfachere Lösung.
Gruß
Manfred

Anzeige
AW: Zeilen per Makro kopieren
25.03.2016 13:47:46
Fennek
Hallo Manfred,
Du verstehts, dass bei einer Kommunikation in diesen Forum viele Missverständnisse möglich sind. Es ist mir jetz klar geworden, dass eine Markierung der ersten und letzten Zeile mit der gesuchten Temperatur wenig Sinn macht.
Um die Temperaturentwicklung in einem ausgewählten Bereich zu plotten, wie wäre es, in einer Hilfsspalte Anfang und Ende zu markieren (mit dem Makro, vor 'exit for''noch ein cells(i, leereSpalte) einzugeben, mit 'autofill' diesen Bereich z.b.mit 1 zu füllen und dann mit Filter diesen Bereich auszuwählen.
(Ich stochere etwas im Nebel)
Mfg

Anzeige
AW: Zeilen per Makro kopieren
25.03.2016 14:14:25
Fennek
Hallo Manfred,
Zum kopieren aller relevater Zeilen, füge jeweils vor 'exit for' ein:
Tmin = i
Tmax = i
Vor 'end with'
.rows(Tmin & ":" & Tmax).copy destination:=sheets(2).cells(2,1)
Dann stehen alle Messwerte zwischen 530 und 620 in einen Blatt.
Mfg

AW: Zeilen per Makro kopieren
25.03.2016 15:16:24
Manfred
Hallo Fennek,
habe folgendes probiert und erhalte als Fehlermeldung:
Laufzeitfehler 13
Typen unverträglich
Gruß
Manfred
Sub Manfred2()
ur = ActiveSheet.UsedRange.Address
Sx = Split(ur, "$")
lr = Sx(4)
With Sheets(1).Columns("e:q")
.Interior.ColorIndex = xlNone
For i = 2 To lr
If Not IsError(Application.Match(520, .Rows(i), -1)) Then
.Rows(i).Interior.Color = vbYellow
Tmin = i
Tmax = i
Exit For
End If
Next i
For i = lr To 2 Step -1
If Not IsError(Application.Match(620, .Rows(i), -1)) Then
.Rows(i).Interior.Color = vbRed
Tmin = i
Tmax = i
Exit For
End If
Next i
.Rows(Tmin & ":" & Tmax).copy Destination:=Sheets(2).Cells(2, 1)
End With
End Sub

Anzeige
AW: Zeilen per Makro kopieren
25.03.2016 15:32:39
Fennek
Hallo, Manfred,
meistens mache ich es mir einfach und hoffe, dass der Fragende es umsetzen kann.
In der ersten Schleife wird Tmin bestimmt, deshalb darf dort nur Tmin gespeichert werden, und nicht Tmax, umgekehrt in der zweiten Schleife, dort muss Tmin gelöscht werden.
In welcher Zeile gab es den Abbruch? Wie gross war der Wert von lr und i? Im Zweifelsfall muss am Anfang
Dim lr as long
Dim i as long
gesetzt werden. Falls diese'Variablen implizit als interger gesetzt werden, gibt es Fehler jeseits der 32.000.
Mfg

AW: Zeilen per Makro kopieren
25.03.2016 21:11:05
Manfred
Hallo Fennek,
es wird, während der Code läuft, keine Fehlermeldung ausgegeben.
Ich habe mir mit debug.print lr und debug.print i der Werte im Direktfenster ausgeben lassen.
Lr gibt die Zeilennummer der letzten Datenreihe wieder und in i wird beginnend bei 2 inkementiert bis lr.
Danach erscheint die Fehlermeldung:
Laufzeitfehler 13, Typen unverträglich.
Gruß
Manfred
Sub Manfred2()
Dim lr As Long
Dim i As Long
ur = ActiveSheet.UsedRange.Address
sx = Split(ur, "$")
lr = sx(4)
'Debug.Print lr
With Sheets(1).Columns("e:q")
.Interior.ColorIndex = xlNone
For i = 2 To lr
If Not IsError(Application.Match(520, .Rows(i), -1)) Then
.Rows(i).Interior.Color = vbYellow
tmin = i
Exit For
End If
'Debug.Print i
Next i
For i = lr To 2 Step -1
If Not IsError(Application.Match(620, .Rows(i), -1)) Then
.Rows(i).Interior.Color = vbRed
Tmax = i
Exit For
End If
'Debug.Print i
Next i
.Rows(tmin & ":" & Tmax).copy Destination:=Sheets(2).Cells(2, 1)
End With
End Sub

Anzeige
AW: Zeilen per Makro kopieren
25.03.2016 21:29:29
Fennek
Hallo Manfred,
wenn der Code ohne Fehker durchläuft, ist das schon einmal gut. Aus deiner Beschreibung konnte ich nicht erkannen, welche Zeile fehlerhaft sein könnte.
Wird am Ende kopiert?
Mfg

AW: Zeilen per Makro kopieren
25.03.2016 21:54:32
Manfred
Hallo Fennek,
nach Abarbeitung des Codes ist keine Programmzeile gelb makiert, ein debuggen, wie bei einem fehlerhaften Code, ist nicht möglich.
Auch im Einzelschrittmodus wird bis zum Ende keine Fehlermeldung generiert und nein es wird leider nicht kopiert.
Die Quelle wird, so wie ich das sehe, durch ActiveSheet.UsedRange.Address festgelegt.
Ist das Kopierziel sheets(2) der Dateiname der Zieldatei oder muß man die Zieldatei noch deklarieren?
Gruß
Manfred

Anzeige
AW: Zeilen per Makro kopieren
25.03.2016 23:20:51
Fennek
Hallo Manfred,
Der Makro kopiert in ein zweites Blatt der selben Datei, diese sheets(2) muss existiren und leer sein.
Mfg

AW: Zeilen per Makro kopieren
26.03.2016 09:01:23
Fennek
Hallo Manfred,
zum Thema Performance
Mit
sub Manfred()
Start = timer
'Befehle
Msgbox timer - start
End sub
Kannst du die Laufzeit des Makros bestimmen.
Da mein Demo 20 Zeilen und 5 Spalten hat, ist Zeit für meine
Tests kein Thema, aber es ist mögli h,'den Ablauf zu beschleunigen.
Für Tmax dürfte es schneller gehen, wenn man spaltenweise sucht, anstelle zeilenweise. Der "Vergleich" bzw matcg-Befehl funktioniert nur zeilen- oder spaltenweise, aber immer von re hts bzw unten.
Diser ode sollte Tmax schneller bestimmen:

'Tmax
Tmax = 0
With columns("E:Q")
For i = 1 to 13
SZ = application.match(640, .columns(i), -1)
If not iserror(sZ) then
Tmax = iif(sZ > Tmax, sZ, Tmax)
End if
End with
Debug.print Tmax
Für das erste Auftreten der Mimdesttemperatur gibt es auch eine schnellere Variante, aber den fü _
r den Aggregat-Befehl, ab xl2010, brauche ich meinen andefen Rechner.
Mfg

Anzeige
AW: Zeilen per Makro kopieren
26.03.2016 12:09:07
Fennek
Hallo Manfred,
um die erste Zeile mit einer Temperatur über 530 zu finden, gib in eine leere Zelle, z.b. aa1 ein:

=aggregat(15;6;(zeile(a1:a20000)/(e1:q20000>530);1)

In dieser Zelle sollte dann die entsprechende Zeilennummer stehen.
Im Makro kannst du das übernehmen
Tmin = cells(1, "aa")
Falls es nicht klappen sollte, lade bitte den gesamten code hoch.
Mfg

AW: Zeilen per Makro kopieren
27.03.2016 01:16:32
Manfred
Hallo Fennek,
die Codezeile =aggregat(15;6;zeile(a1:a20000)/(e1:q20000>530);1) liefert das gewünschte Ergebnis.
Der Wert füt tmax wird ähnlich berechnet, und liefert auch das korrekte Ergebnis. In Zelle E2 steht die erste Zeilennummer des zu kopierenden Bereich, in Zelle E3 die Zeilennummer mit dem Bereichende. Es spielt keine Rolle ob ich tmin/max = i oder tmin/max =cells benutze, der Abbruch erfolgt immer an der gleichen Stelle.
Ich habe den kompletten Code an einer kleinen Testtabelle ausprobiert, der Abbruch erfolgt in Zeile
.Rows(tmin & ":" & tmax).copy Destination:=Sheets(2).Cells(2, 1) mit Laufzeitfehler 13 Typen unverträglich.
Gruß
Manfred
Private Sub CommandButton1_Click()
Dim lr As Long
Dim i As Long
ur = ActiveSheet.UsedRange.Address
sx = Split(ur, "$")
lr = sx(4)
'Debug.Print lr
With Sheets(1).Columns("e:p")
.Interior.ColorIndex = xlNone
For i = 9 To lr
If Not IsError(Application.Match(520, .Rows(i), -1)) Then
.Rows(i).Interior.Color = vbYellow
'tmin = i
tmin = Cells(2, 5)
Exit For
End If
Debug.Print i
Next i
For i = lr To 9 Step -1
If Not IsError(Application.Match(620, .Rows(i), -1)) Then
.Rows(i).Interior.Color = vbRed
'tmax = i
tmax = Cells(3, 5)
Exit For
End If
Debug.Print i
Next i
.Rows(tmin & ":" & tmax).copy Destination:=Sheets(2).Cells(2, 1)
End With
End Sub

AW: Zeilen per Makro kopieren
27.03.2016 10:41:31
Fennek
Hallo Manfred,
die Nutzung von aggregat macht den Code wesentlich einfacher. Getestet:

Sub Manfred4()
Dim WS as worksheet
Dim WBZ as workbook
Set ws = activesheet
Tmin = cells(2, "E")
Tmax = cells(3, "E")
Set wbz = workbooks.add
Range(ws.cells(Tmin, "E", ws.cells(Tmax, "Q")).copy
Wbz.sheets(1).range("a1").pastespecial
'Optional
'Wbz.saveas ("c:\tmp\manfred4.xlsx")
'Wbz.close 0
'Set wbz = nothing
End sub
Mfg

AW: Zeilen per Makro kopieren
27.03.2016 14:07:54
Manfred
Hallo Fennek,
wenn ich deinen Code kopiere wird die Zeile
Range(ws.cells(Tmin, "E", ws.cells(Tmax, "Q")).copy
rot markiert und "Fehler beim kompilieren, Syntaxfehler" wird ausgegeben.
Was mache ich falsch?
Gruß
Manfred

AW: Zeilen per Makro kopieren
27.03.2016 14:40:28
Fennek
Hallo,
beim Abschreiben habe ich nach dem ersten cell eine ")" vergessen.
Mfg

AW: Zeilen per Makro kopieren
27.03.2016 19:02:00
Manfred
Hallo Fennek,
wow das ist genau das was ich gesucht/gebraucht habe.
Ich habe noch eine Kleinigkeit geändert, da ich die kopierten Daten in einem neuen Tabellenblatt innerhalb der Quelldatei gespeichert haben muss.
Nochmals vielen Dank für deinen Einsatz.
Gruß
Manfred
Anbei der Code
Private Sub CommandButton1_Click()
Application.DisplayAlerts = False
Worksheets("Daten Quarzsprung").Delete
Application.DisplayAlerts = True
Dim WS As Worksheet
Dim NWS As Worksheet
Set WS = ActiveSheet
Tmin = Cells(2, "E")
Tmax = Cells(3, "E")
Set NWS = Worksheets.Add
range(WS.Cells(Tmin, "E"), WS.Cells(Tmax, "Q")).copy
NWS.Name = "Daten Quarzsprung"
Sheets(1).range("e4").PasteSpecial
'Optional
'Wbz.saveas ("c:\tmp\manfred4.xlsx")
'Wbz.close 0
'Set wbz = nothing
End Sub

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige