Anzeige
Archiv - Navigation
1152to1156
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

Zeilenwerte auslesen und ganze Zeilen kopieren

Zeilenwerte auslesen und ganze Zeilen kopieren
Kristopher
Hallo an alle,
leider bin ich ein absoluter VBA-Neuling und relativ schnell mit einem – für mich – großen „Programm“ betraut worden.
Es gibt zwei Dokumente, im ersten Dokument (A) soll jeweils der Wert der Spalte C geprüft werden. Wenn der Wert = 1 ist, dann soll er in der gleichen Zeile eine Spalte nach links wandern und den Wert der Zelle prüfen.
Mit diesem Wert / Inhalt der Zelle soll er ein neues, leeres Excel-Dokument öffnen und unter dem Namen des Wertes der Zelle abspeichern (Dokument C-1).
Ferner nimmt er den Wert der Zelle und prüft alle Zeilen der Spalte A im Dokument B auf diesen Wert. Hat die Zeile den entsprechenden Wert, so soll er die Zeile nehmen und in die erste leere Zeile des neuen Dokumentes (welches den Namen des Wertes der Zelle in Spalte B trägt, DokC-1) speichern.
Danach springt er wieder in Dokument A zurück und wandert eine Zeile abwärts. Nun wiederholt er die Prozedur indem er …
den Wert der Zelle und prüft alle Zeilen der Spalte A im Dokument B auf diesen Wert. Hat die Zeile den entsprechenden Wert, so soll er die Zeile nehmen und in die erste leere Zeile des neuen Dokumentes C-1 speichern. …
Ist er damit fertig, wiederholt er alle Schritte ab „Es gibt zwei Dokumente, im ersten Dokument (A)…“.
Wie gesagt, als blutjunger Anfänger fühle ich mich diesem Problem noch nicht so richtig gewachsen, habe mich aber mal daran versucht. Die Lösung ist ziemlich … kläglich.
Ich will niemand anderen dieses Programm schreiben lassen, allerdings habe ich doch arge Probleme mit einzelnen Teilen und für das Gesamtverständnis habe ich das Gesamtproblem geschildert. Bitte seht es nicht als Bitte / Aufforderung auf, mir meine gesamte Arbeit abzunehmen.
Besondere Probleme bereiten mir:
If Range("C:C").Value = 1 Then
Range("C:C").Offset(0, -1)
Range("C:C").Value = Comp
Er soll alle Zeilen der Spalte C auf den Wert 1 prüfen. Wenn ja, dann springt
er eine Spalte nach links und soll sich diesen Wert merken.
wo liegt das Problem?
If Range("A:A").Value = Comp Then
Comp.Select
Selection.Copy
Wenn der Wert einer Zeile in Spalte A dem Wert der variable Comp entspricht, dann soll er die gesamte Zeile markieren und dann kopieren... Glaube mein Befehl "Comp.Select" kann nicht funktioneren. gibts nen besseren Weg?
Vielen Dank schon jetzt für all eure Hilfen,
Grüße,
Oliver
PS: Bzgl. Der jeweils neuen Dokumente, die erstellt werden sollen, habe ich mich eines Tooles der Homepage von Herrn Stefan Kulpa, Dormagen, bedient. Vielen Dank hierfür!
Sub Test123()
If Range("C:C").Value = 1 Then
'Schritt 1
Range("C:C").Offset(0, -1)
Range("C:C").Value = Comp
'Schritt 2
Option Explicit

Public Function ExcelCreateWorkbook( _
sXLSFilePath As String) As Boolean
Dim objXLSheet As Object
On Error GoTo Err_ExcelCreateWorkbook
Set objXLSheet = CreateObject("Excel.Sheet")
objXLSheet.SaveAs sXLSFilePath
objXLSheet.Application.[Quit]
Set objXLSheet = Nothing
ExcelCreateWorkbook = True
Exit_ExcelCreateWorkbook:
Exit Function
Err_ExcelCreateWorkbook:
ExcelCreateWorkbook = False
Resume Exit_ExcelCreateWorkbook
End Function

End Function
'Schritt 3
Workbooks.Open ("...rlbk data oeffnen.xls")
'Schritt 4
If Range("A:A").Value = Comp Then
Comp.Select
Selection.Copy
Workbook("...11.xls").Activate
'Dokumentenname muss Comp entsprechen
Do Until IsEmpty(ActiveCell.Value)
ActiveCell.Select
Loop
ActiveSheet.Paste
End If
'Schritt 5
Workbooks.Activate ("...kernel.xls")
Range.Offset(1,0)
Range.Value = Comp
'Schritt 6
End If
'wiederhole Schritte 4 - 6
Workbooks.Open ("...rlbk data oeffnen.xls")
Do Until IsEmpty(ActiveCell.Value)
If Range("A:A").Value = Comp Then
Comp.Select
Selection.Copy
Workbook("...11.xls").Activate
'Dokumentenname muss Comp entsprechen
Do Until IsEmpty(ActiveCell.Value)
ActiveCell.Select
Loop
ActiveSheet.Paste
End If
Workbooks.Activate ("...kernel.xls")
Range.Offset(1,0)
Range.Value = Comp
Loop
'Schritt 7
'wiederhole Schritte 2 - 7
Do Until IsEmpty(ActiveCell.Value)
Range("C:C").Offset(0, -1)
Range("C:C").Value = Comp
'Schritt 2
Option Explicit

Public Function ExcelCreateWorkbook( _
sXLSFilePath As String) As Boolean
Dim objXLSheet As Object
On Error GoTo Err_ExcelCreateWorkbook
Set objXLSheet = CreateObject("Excel.Sheet")
objXLSheet.SaveAs sXLSFilePath
objXLSheet.Application.[Quit]
Set objXLSheet = Nothing
ExcelCreateWorkbook = True
Exit_ExcelCreateWorkbook:
Exit Function
Err_ExcelCreateWorkbook:
ExcelCreateWorkbook = False
Resume Exit_ExcelCreateWorkbook
End Function

End Function
'Schritt 3
Workbooks.Open ("...rlbk data oeffnen.xls")
'Schritt 4
If Range("A:A").Value = Comp Then
Comp.Select
Selection.Copy
Workbook("...11.xls").Activate
'Dokumentenname muss Comp entsprechen
Do Until IsEmpty(ActiveCell.Value)
ActiveCell.Select
Loop
ActiveSheet.Paste
End If
'Schritt 5
Workbooks.Activate ("...kernel.xls")
Range.Offset(1,0)
Range.Value = Comp
'Schritt 6
End If
'wiederhole Schritte 4 - 6
Workbooks.Open ("...rlbk data oeffnen.xls")
Do Until IsEmpty(ActiveCell.Value)
If Range("A:A").Value = Comp Then
Comp.Select
Selection.Copy
Workbook("...11.xls").Activate
'Dokumentenname muss Comp entsprechen
Do Until IsEmpty(ActiveCell.Value)
ActiveCell.Select
Loop
ActiveSheet.Paste
End If
Workbooks.Activate ("...kernel.xls")
Range.Offset(1,0)
Range.Value = Comp
Loop
'Schritt 7
Loop
End Sub

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Zeilenwerte auslesen und ganze Zeilen kopieren
21.04.2010 12:11:44
fcs
Hallo Oliver,
bei einem großen Projekt sind zwei Punkte wichtig.
1. Arbeiten mit Objektvariablen für alle beteiligten Elemente wie
-Arbeitsmappen
-Tabellenblätter
-ggf. auch Zellen
Durch verwenden von Objektvariablen kannst du praktisch komplett auf Activate und Select-Befehle verzichten und der Code wird übersichtlicher und auch schneller.
2. aussagekräftige Variablen für Informationen die verarbeitetet werden.
3. Aufteilung des Projektes in Hauptroutine und Subroutinen.
4. Arbeiten mit der Option Explicit, was du ja wohl schon machst
In deinem Fall bietet sich folgende Basis an.
Gruß
Franz
Option Explicit
'Deklaration der Variablen, die projektweit verwendet werden sollen
'Arbeitsmappem
Public wbListe As Workbook 'Arbeitsmappe A mit der Liste der Dateinamen
Public wbDaten As Workbook 'Arbeitsmappe B mit den Daten
Public wbNeu As Workbook   'neuangelegte Arbeitsmappen
'Tabellenblätter
Public wksListe As Worksheet 'Tabellenblatt in Arbeitsmappe A mit der Liste der Dateinamen
Public wksDaten As Workbook 'TabellenblattArbeitsmappe B mit den Daten
Public wksNeu As Workbook   'Tabellenblatt für kopierte Daten in neuene Arbeitsmappen
'Hauptroutine
Sub Hauptroutine()
Dim vWert As Variant
Dim lZeile As Long
Set wbListe = Workbooks("ArbeitsmappeA.xls") 'oder auch = ActiveWorkbook
Set wksListe = wbListe.Worksheets("ListeA")  'Tabellenblatt mit den Dateinamen
'Datei mit Daten schreibgeschütz öffnen
Set wbDaten = Workbooks.Open(Filename:="C:\Verzeichnis\ArbeitsmappeB.xls", _
ReadOnly:=True)
Set wksDaten = wbDaten.Worksheets(1) 'oder  = wbDaten.Worksheets("TabeleXYZ")
'Liste mit Dateinamen abarbeiten
With wksListe
'Zeilen in Spalte C prüfen
For lZeile = 2 To .Cells(.Rows.Count, 3).End(xlUp).Row
If .Cells(lZeile, 3) = 1 Then
vWert = .Cells(lZeile, 2).Value 'Wert aus Spalte B
'Neue Arbeitsmappe mit einem Tabellenblatt anlegen
Set wbNeu = Workbooks.Add(Template:=xlWBATWorksheet)
Set wksNeu = wbNeu.Worksheets(1)
Call WerteEinlesen(wksZiel:=wksNeu, vVergleich:=vWert)
If WerteEinlesen = 1 Then 'Keine Treffer in Daten gefunden
MsgBox "Keine Daten gefunden für: " & vWert
wbNeu.Close savechanges:=False
Else
'Datei mit kopierten Daten speichern
wbNeu.SaveAs Filename:=vWert
'Datei mit kopierten Daten schliessen
wbNeu.Close savechanges:=False
End If
End If
Next lZeile
End With
'datendatei wieder schliessen
wbDaten.Close savechanges:=False
Application.ScreenUpdating = True
MsgBox "Fertig"
'Objektvariablen zurücksetzen
Set wbListe = nothin: Set wbDaten = Nothing: Set wbNeu = Nothing
Set wksListe = Nothing: Set wksDaten = Nothing: Set wksNeu = Nothing
End Sub
Function WerteEinlesen(wkZiel As Worksheet, vVergleich As Variant) As Long
'Werte in Spalte A der Daten vergleichen und Treffer in Zieltabelle kopieren
Dim lZeile As Long, lZeileZiel As Long
lZeileZiel = 1 'Startzeile in Zieltabelle
With wksDaten
For lZeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If .Cells(lZeile, 1) = vVergleich Then
.Rows(lZeile).Copy
wksZiel.Rows(lZeileZiel).Paste
lZeileZiel = lZeileZiel + 1
End If
Next lZeile
End With
Application.CutCopyMode = False
WerteEinlesen = lZeileZiel
End Function

Anzeige
AW: Korrektur
21.04.2010 12:39:09
fcs
Hallo Oliver,
in der For-Next-Schleife der Hauptprozedur war noch ein Syntaxfehler drin.
Gruß
Franz
    For lZeile = 2 To .Cells(.Rows.Count, 3).End(xlUp).Row
If .Cells(lZeile, 3) = 1 Then
vWert = .Cells(lZeile, 2).Value 'Wert aus Spalte B
'Neue Arbeitsmappe mit einem Tabellenblatt anlegen
Set wbNeu = Workbooks.Add(Template:=xlWBATWorksheet)
Set wksNeu = wbNeu.Worksheets(1)
If WerteEinlesen(wksZiel:=wksNeu, vVergleich:=vWert) = 1 Then
'Keine Treffer in Daten gefunden
MsgBox "Keine Daten gefunden für: " & vWert
wbNeu.Close savechanges:=False
Else
'Datei mit kopierten Daten speichern
wbNeu.SaveAs Filename:=vWert
'Datei mit kopierten Daten schliessen
wbNeu.Close savechanges:=False
End If
End If
Next lZeile

Anzeige

320 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige