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

Zellen anhand Inhalt auswählen und kopieren

Zellen anhand Inhalt auswählen und kopieren
Matthias
Hallo zusammen,
ich habe folgendes Problem: Aus einer Datei mit ca. 30.000 Zeilen und 38 Spalten sollen einige Bereiche ausgewählt werden und in unterschiedliche Blätter einer zweiten Arbeitsmappe einsortiert werden.
Konkret: Per Makro soll in Spalte C der Bereich gesucht werden der z.B. Werte zwischen 400 und 800 enthält, während z.B. Spalte E = 2 ist.
Dieser Bereich (also alle 38 Spalten und alle Zeilen, die den Anforderungen entsprechen) soll in die Zwischenablage kopiert werden und dann in der zweiten Arbeitsmappe auf einem bestimmten Blatt eingefügt werden. Das Blatt ist aber evtl nicht leer, es muss also die erste freie Zeile gesucht werden.
Danach soll dann der nächste Bereich, der Werte von 800 bis 1200 enthält gesucht werden, usw.
Ich selbst habe kaum VBA Erfahrung und habe es mit Suchschleifen, die Zeilenweise kopieren versucht, das ganze ist aber äußerst langsam. Da insgesamt an die 100 solcher Dateien zu bearbeiten sind würde ich mich freuen, wenn jemand eine schnelllere Lösung weiß!
Vielen Dank!
AW: Zellen anhand Inhalt auswählen und kopieren
08.11.2009 21:04:13
Jörg
Hallo Matthias,
ich würde das wie folgt machen.
Mit Autofilter die gewünschten Zeilen filtern, dann alles von ganz oben bis ganz unten über short cut markieren und anschließend mittel button nur die sichtbaren Zellen auswählen.
Die kann man dann kopieren und weiterverarbeiten wie man will.
Wenn es viele Daten zu durchsuchen gilt kann man das Verfahren auch als Makro auszeichnen und in den anderen Tabellen ablaufen lassen.
geht natürlich nur, wenn der Aufbau der anderen Tabellen passend zur ersten mit der Aufzeichnung ist.
Grüsse, Jörg
AW: Zellen anhand Inhalt auswählen und kopieren
08.11.2009 21:16:49
Matthias
Hallo Jörg,
erstmal danke für deine Antwort!
Leider sind meine Datensätze alle leicht unterschiedlich (Fahrsimulatoraufzeichnung, die abhängig von der Geschwindigkeit den jeweiligen Streckenmeter an eine andere Stelle schreibt).
Da ich ca. 40 verschiedene Bereiche auswählen muss, ist das ganze "von Hand" kaum machbar, deshalb suche ich nach einer VBA Lösung.
Grüße, Matthias
Anzeige
AW: Zellen anhand Inhalt auswählen und kopieren
08.11.2009 21:11:05
Daniel
Hi
Zeilenweises kopieren ist sehr langsam.
um bei deinen Datenmengen eine aktzeptable Geschwindigkeit zu bekommen musst du die Daten so sortieren, daß die zu kopierenden Zeilen möglichst einen geschlossenen Zellblock bilden und nicht einzelne Zeilen sind.
wenn du das gemacht hast, kannst du den Autofilter auf die Daten anwenden, so daß nur die zu kopierenden Zeilen sichtbar bleiben.
Wenn du die Daten dann sortiert und gefiltert hast, kannst du die sichtbaren Zeilen ohne Überschrift mit diesem Code in ein anderes Tabellenblatt kopieren.
Dabei werden die Daten nach der letzten beschriebenen Zeile in Spalte A eingefügt:
Intersect(ActiveSheet.Userange, ActiveSheet.Usedrange.Offset(1,0).SpecialCells( _
xlCelltypeVisible).Copy
Workbooks("DeineDatei.xls").Sheets("DeinSheet").Cells(Rows.count,1).end(xlup).Offset(1,0).PasteSpecial xlPasteAll

Gruß, Daniel
ps sortieren und filtern kannst du gut mit dem Recorder aufzeichnen.
Anzeige
AW: Zellen anhand Inhalt auswählen und kopieren
08.11.2009 21:14:03
Josef
Hallo Matthias,
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub kopiereDaten()
  Dim rngCopy As Range
  Dim lngRow As Long, lngLast As Long, lngIndex As Long
  Dim varParam(1) As Variant
  
  On Error GoTo ErrExit
  GMS
  
  varParam(0) = Array(400, 800, 2, "Tabelle2") 'min-Wert, max-Wert, Bedingung, Zieltabelle
  varParam(1) = Array(800, 1200, 1, "Tabelle3")
  
  With Sheets("Tabelle1") 'Quelltabelle
    lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
    For lngIndex = 0 To UBound(varParam)
      .Range(.Cells(1, 39), .Cells(lngLast, 39)).FormulaR1C1 = "=IF(AND(RC[-36]>=" & varParam(lngIndex)(0) & ",RC[-36]<" & varParam(lngIndex)(1) & ",RC[-34]=" & varParam(lngIndex)(2) & "),NA(),"""")"
      On Error Resume Next
      Set rngCopy = .Columns(39).SpecialCells(xlCellTypeFormulas, xlErrors)
      On Error GoTo ErrExit
      If Not rngCopy Is Nothing Then
        lngRow = Sheets(varParam(lngIndex)(3)).Cells(Rows.Count, 1).End(xlUp).Row + 1
        rngCopy.EntireRow.Copy Sheets(varParam(lngIndex)(3)).Cells(lngRow, 1)
        Sheets(varParam(lngIndex)(3)).Columns(39) = ""
      End If
      Set rngCopy = Nothing
      .Columns(39) = ""
    Next
  End With
  
  
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (kopiereDaten) in Modul Modul2", _
      vbExclamation, "Fehler in Modul2 / kopiereDaten"
  End With
  
  GMS True
  
End Sub

Public Sub GMS(Optional ByVal Modus As Boolean = False)
  
  Static lngCalc As Long
  
  With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    If Not Modus Then lngCalc = .Calculation
    If Modus And lngCalc = 0 Then lngCalc = -4105
    .Calculation = IIf(Modus, lngCalc, -4135)
    .Cursor = IIf(Modus, -4143, 2)
    
  End With
  
End Sub

Gruß Sepp

Anzeige
AW: Zellen anhand Inhalt auswählen und kopieren
09.11.2009 00:27:48
Matthias
Hallo Sepp,
ganz herzlichen Dank für deine Arbeit, das ist viel mehr als ich erwartet habe!
Das ganze funktioniert perfekt.
Ich trau` mich ja kaum fragen, aber lässt sich das Einfügen so abändern, dass Tabelle1, also die Quelltabelle, in einer anderen Arbeitsmappe liegt als die Zieltabellen? Muss dazu zuerst mit .Activate die Mappe aufgerufen werden, oder kann direkt vor dem Aufruf des Worksheets das Workbook angegeben werden?
Nochmals vielen Dank und viele Grüße,
Matthias
AW: Zellen anhand Inhalt auswählen und kopieren
09.11.2009 00:20:22
fcs
Hallo Mathias,
hier auch noch mein Vorschlag, er enthält sowohl eine Autofilter als auch die Zeilenweiselösung.
Eine Dateiauswahl mit mehrfachselektion ist eingebaut, so dass du auch mehrere Dateien in einem Durchauf einsortieren kannst.
https://www.herber.de/bbs/user/65672.xls
Langsam ist natürlich relativ.
Bei 2 Dateien und ca. 10 Prozent der Datensätze werden kopiert brauch die Zeilen-Lösung ca. 8 bis 10 Sekunden und die Autofilterlösung ist etwa 4 bis 5 mal schneller auf meinem Notebook ( Packard Bell Pentium Dual Core T4200 @ 2.0 GHz, Windows Vista, Excel 2007).
Gruß
Franz
Anzeige
AW: Zellen anhand Inhalt auswählen und kopieren
09.11.2009 12:10:56
Matthias
Hallo Franz,
auch dir vielen Dank, besonders auch für das kommentieren!
Dadurch ist mir jetzt klar geworden wo der Fehler in meinem Ansatz lag. Du hast dann auch völlig recht, wenn mans richtig macht, ist auch Zeilenweises kopiern gar nicht so langsam.
Danke!
Grüße, Matthias
AW: Zellen anhand Inhalt auswählen und kopieren
09.11.2009 13:45:34
Matthias
Hallo Franz,
jetzt habe ich doch noch ein Problem bekommen, und zwar folgendes:
Ich habe deine Tabelle bzw. modFilter auf mein Gesamtproblem angepasst, das sind dann 14 Arbeitsblätter. wksZiel habe ich entsprechend angepasst (1 To 14) und auch intBlatt.
Beim Ausfühen läuft das ganze bis zum Wechsel von modFilter zu modFunctions, bricht dort aber in der Zeile
For Spalte = 1 To wks.Cells.SpecialCells(xlCellTypeLastCell).Column
mit der Fehlermeldung
Laufzeitfehler91 Objektvariable oder With-Blockvariable nicht zugewiesen ab.
Muss ich noch an anderer Stelle Änderungen vornehmen?
Stimmt die Größe von ReDim ZeileZ(1 To 2) ?
Gruß, Matthias
Anzeige
AW: Zellen anhand Inhalt auswählen und kopieren
09.11.2009 15:17:59
fcs
Hallo Mathias,
"ZeileZ" muss den gleichen Zälbereich haben "wksZiel" - also: Redim ZeileZ (1 to 14).
Die Fehlermeldung kommt eigentlich nur dann wenn du die Set-Anweisungen nicht für alle 14 Blätter gemacht hast.
Set wksZiel(1)=Worksheets("ABCD01")
...
...
Set wksZiel(14)=Worksheets("ABCD14")
Gruß
Franz
AW: Zellen anhand Inhalt auswählen und kopieren
09.11.2009 17:02:25
Matthias
Danke, so passts!
Leider wird jetzt wenn in ein Tabellenblatt zum zweiten Mal Daten eingetragen werden, der erste Datensatz teilweise überschrieben.
Momentan habe ich ca. 40 Prüfblöcke, die so aussehen:
'Prüfbedingungen 600m links für Kopieren der Daten
With .Range(.Cells(1, 1), .Cells(ZeileQ, 38))
'Filter Spalte E
.AutoFilter Field:=5, Criteria1:=3
'Filter Spalte C
.AutoFilter Field:=3, Criteria1:=">=2300", Operator:=xlAnd, Criteria2:="<2650"
End With
If .Cells(.Rows.Count, 3).End(xlUp).Row > 1 Then
intBlatt = 8
.Range(.Cells(2, 1), .Cells(ZeileQ, 38)).Copy _
Destination:=wksZiel(intBlatt).Cells(ZeileZ(intBlatt) + 1, 1)
End If
.ShowAllData
'Prüfbedingungen 600m links für Kopieren der Daten
With .Range(.Cells(1, 1), .Cells(ZeileQ, 38))
'Filter Spalte E
.AutoFilter Field:=5, Criteria1:=3
'Filter Spalte C
.AutoFilter Field:=3, Criteria1:=">=4350", Operator:=xlAnd, Criteria2:="<4650"
End With
If .Cells(.Rows.Count, 3).End(xlUp).Row > 1 Then
intBlatt = 8
.Range(.Cells(2, 1), .Cells(ZeileQ, 38)).Copy _
Destination:=wksZiel(intBlatt).Cells(ZeileZ(intBlatt) + 1, 1)
End If
.ShowAllData
Kann die Zuweisung auf ein Blatt (hier Nummer 8) auch innerhalb eines einzigen Blocks erledigt werden?
Die Autofilterfkt. unterstützt ja aber nur 2 Kriterien?!
Wäre super wenn Du dich dem Problem nochmals annehemn könntest!
Viele Grüße, Matthias
Anzeige
AW: Zellen anhand Inhalt auswählen und kopieren
10.11.2009 08:35:04
fcs
Hallo Mathias,
zu deinem 1. Problem:
Wenn du in einem Durchlauf mehrere gefilterte Datenblöcke in das gleiche Blatt kopieren willst, dann muss die Zielzeile in jedem Block neu berechnet werden. Siehe nachfolgendes Beispiel mit markierten ("'### 2009-11-10" anzupassenden/einzufügenden Zeilen.
Zu Problem Nr. 2:
Um die Daten, die in ein Blatt kopiert werden sollen, in einem Blöck zu übertragen, mussen die von den einzelnen Filtern selektierten Zeilen in einer Hilfsspalte markiert werden. Nach dem Setzen der Markierung wird dann der Filter auf die Markierungen gesetzt. Man kann dann auch die Blattnamen direkt verwenden, statt des etwas anonymen Arrays.
Hier die Textdatei des Codes, den du am besten in ein eigenes Modul der Datei einfügst oder als Ersatz für den Code im Modul "modFilter".
https://www.herber.de/bbs/user/65706.txt
Beim Setzen des Autofilters ist es nicht unbedingt erforderlich nach jedem Filter ".ShowAllData" zu setzen. Es ist ausreichend den Wert eines bereits gesetzten Filters zu ändern, wenn die anderen Filterwerte gleich bleiben. Das beschleunigt die Makroarbeit nochmals ein wenig.
Gruß
Franz
Sub DatenEinsortierenFilter()
'Daten werden in den Quelldateien per Autofilter selektiert und kopiert
'dabei werden keine Formeln kopiert
Dim wbZiel As Workbook, wbQuelle As Workbook
Dim wksQuelle As Worksheet, wksZiel() As Worksheet
Dim ZeileZ() As Long, ZeileQ As Long, arrDateien As Variant
Dim intI As Long, intBlatt As Long
Dim StatusCalc As Long, bolAbbruch As Boolean
'Makrobremsen lösen
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
'Zielobjekte setzen
Set wbZiel = ActiveWorkbook
ReDim wksZiel(1 To 2)
ReDim ZeileZ(1 To 2)
Set wksZiel(1) = wbZiel.Worksheets("400_800")
Set wksZiel(2) = wbZiel.Worksheets("801_1200")
'Quelldatei(en) auswählen
arrDateien = Application.GetOpenFilename(Filefilter:="Excel (*.xl*),*.xl*", _
Title:="Bitte Datendateien auswählen - Mehrfachauswahl ist möglich", _
MultiSelect:=True)
If Not IsArray(arrDateien) Then GoTo Beenden
'gewählte Datei(en) abarbeiten
For intI = LBound(arrDateien) To UBound(arrDateien)
'Letzte Datenzeile in den Ziel-Blättern ermitteln
For intBlatt = LBound(wksZiel) To UBound(wksZiel)
'        ZeileZ(intBlatt) = LastRow(wksZiel(intBlatt))          '###  2009-11-10
If wksZiel(intBlatt).Rows.Count - ZeileZ(intBlatt) =400", Operator:=xlAnd, Criteria2:=" 1 Then
intBlatt = 1
ZeileZ(intBlatt) = LastRow(wksZiel(intBlatt))           '###  2009-11-10
.Range(.Cells(2, 1), .Cells(ZeileQ, 38)).Copy _
Destination:=wksZiel(intBlatt).Cells(ZeileZ(intBlatt) + 1, 1)
End If
.ShowAllData
'Prüfbedingungen 2 für Kopieren der Daten
With .Range(.Cells(1, 1), .Cells(ZeileQ, 38))
'Filter Spalte E
.AutoFilter Field:=5, Criteria1:=2
'Filter SPalte C
.AutoFilter Field:=3, Criteria1:=">800", Operator:=xlAnd, Criteria2:=" 1 Then
intBlatt = 2
ZeileZ(intBlatt) = LastRow(wksZiel(intBlatt))           '###  2009-11-10
.Range(.Cells(2, 1), .Cells(ZeileQ, 38)).Copy _
Destination:=wksZiel(intBlatt).Cells(ZeileZ(intBlatt) + 1, 1)
End If
.ShowAllData
End With
'Quell-Datei ohne speichern wieder schliessen
wbQuelle.Close savechanges:=False
Next intI
Beenden:
'Makrobremsen zurücksetzen
With Application
.EnableEvents = True
.Calculation = StatusCalc
.ScreenUpdating = True
End With
MsgBox "Fertig"
End Sub

Anzeige
AW: Zellen anhand Inhalt auswählen und kopieren
10.11.2009 16:12:29
Matthias
Vielen Dank! Jetzt läufts super!

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige