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

Werte in neues Sheet kopieren wenn Bedingung erfül

Werte in neues Sheet kopieren wenn Bedingung erfül
19.08.2017 09:52:34
Annemarie
Hallo zusammen,
ich scheitere gerade an einem Makro für folgendes Problem:
Ich habe eine Datei mit mehreren Sheets, die jeweils gleich aufgebaut sind. In Zeile O steht manchmal ein Wert (Preis), ansonsten DIV/0 oder nichts. Immer wenn in Spalte O ein Wert steht, möchte ich diesen sowie außerdem den Wert aus der gleichen Zeile und Spalte D und E in ein neues Sheet kopieren, sodass sie dort in der Reihenfolge D, E, O angeordnet sind (Teilenummer, Beschreibung, Preis).
Ich habe dafür ein Makro geschrieben, dass zuerst ein neues SHeet "Output" anlegt und danach die Sheets durchlaufen soll und eben das gewünschte kopieren ausführen soll.
Das Makro läuft auch, aber leider stehen in "Output" völlig falsche Werte... Und ich weiß nicht warum :-D
Ich hatte zuerst mit Copy und Paste gearbeitet, dann stand auch etwas in "Output", allerdings nur Formeln, nicht die Werte, die ich haben wollte. Wollte dann mit PasteSpecial eben die Werte einfügen, das ergab aber eine Kollision mit dem Worksheet-Objekt. Gerade versuche ich, das Ganze über Variablen zu lösen.
Leider weiß ich gerade überhaupt nicht mehr weiter, wo mein Fehlerliegt...
Hier der Code:

Sub Copy_Cond()
Dim ws As Worksheet
Dim I As Integer
Dim S As Integer
Dim WS_Count As Integer
Dim RowCount As Integer
Dim copy_o As Double
Dim copy_e As String
Dim copy_d As Long
WS_Count = ActiveWorkbook.Worksheets.Count
With ThisWorkbook
Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
ws.Name = "Output"
End With
For S = 1 To WS_Count
Worksheets(S).Activate
RowCount = Cells(Cells.Rows.Count, "O").End(xlUp).Row
For I = 1 To RowCount
Range("O" & I).Select
check_value = ActiveCell
If Not check_value = "#DIV/0!" Or IsEmpty(ActiveCell) Then
copy_o = ActiveCell.Range("O" & I)
Worksheets("Output").Activate
RowCount = Cells(Cells.Rows.Count, "c").End(xlUp).Row
Range("C" & RowCount + 1).Value = copy_o
Worksheets(S).Activate
Range("E" & I).Select
copy_e = ActiveCell.Range("E" & I)
Worksheets("Output").Activate
Range("B" & RowCount + 1).Value = copy_e
Worksheets(S).Activate
Range("D" & I).Select
copy_d = ActiveCell.Range("D" & I)
Worksheets("Output").Select
Range("A" & RowCount + 1).Value = copy_d
End If
Next
Next
End Sub

Die Tabelle selbst kann ich leider nicht beifügen, da sie sensible Inhalte meines Arbeitgebers enthält.
Vielen Dank für die Hilfe!
Annemarie

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ein Versuch
19.08.2017 11:20:08
Fennek
Hallo,
nach dem Motto "no risk, no fun" ein Vorschlag, der "herunter geschrieben" wurde. Es MUSS noch debugged werden.

sub iFen()
r = 2
for ws = 1 to sheets.count
if sheets(ws).name  "Output" then
with sheets(ws)
for i = 2 to .cells(rows.count, "A").end(xlup).row
if isnumeric(cells(i, "O")) then
sheets("Output").cells(r, "D") = .cells(i, "D")
sheets("Output").cells(r, "E") = .cells(i, "E")
sheets("Output").cells(r, "O") = .cells(i, "O")
r = r + 1
end if
next i
end with
end if
next ws
end sub
mfg
Anmerkung
19.08.2017 11:20:35
Werner
Hallo Annemarie,
Die Tabelle selbst kann ich leider nicht beifügen, da sie sensible Inhalte meines Arbeitgebers enthält.
...die man aber entfernen/anonymisieren könnte.
Gruß Werner
Anzeige
AW: Werte in neues Sheet kopieren wenn Bedingung erfül
19.08.2017 12:24:57
fcs
Hallo Annemarie,
dein Makro "krankt" an dem Aktivieren der Tabellenblätter und du hast mehrmals "ActiveCell" statt "ActiveSheet" verwendet.
Ähnlich wie Fennek hab ich das Ganze mal in eine eine Form gebracht, die ohne die Activate, Select und Selection auskommt. da werden die Zellinhalte nach Prüfung direkt nach "Output" geschrieben.
Gruß
Franz
Neue optimierte Makro-Version
Sub Copy_Cond()
Dim wkb As Workbook
Dim wsOutput As Worksheet, wsData As Worksheet
Dim SheetNo As Integer, WS_Count As Integer
Dim RowCount As Long, rowOut As Long, rowData As Long, StatusCalc As Long
Dim check_value As Variant
Set wkb = ActiveWorkbook
With wkb
Set wsOutput = .Sheets.Add(After:=.Sheets(.Sheets.Count))
With wsOutput
.Name = "Output"
rowOut = 1 'Zeile unterhalb der die Daten eingetragen werden sollen
End With
End With
'Makrobremsen lösen
With Application
.ScreenUpdating = False
StatusCalc = .Calculation
.Calculation = xlCalculationManual
End With
For Each wsData In wkb.Worksheets
With wsData
Select Case .Name
Case wsOutput.Name
'do nothing
Case Else
'letzte Datenzeile in Spalte O in Daten-Tabellenblatt
RowCount = .Cells(.Rows.Count, 15).End(xlUp).Row
For rowData = 1 To RowCount
check_value = .Cells(rowData, 15).Text 'Wert in Spalte O
If Not (check_value = "#DIV/0!" Or Trim(check_value) = "") Then
rowOut = rowOut + 1
wsOutput.Cells(rowOut, 1) = .Cells(rowData, 4) 'Wert aus Spalte "D"
wsOutput.Cells(rowOut, 2) = .Cells(rowData, 5) 'Wert aus Spalte "E"
wsOutput.Cells(rowOut, 3) = .Cells(rowData, 15) 'Wert aus Spalte "O"
End If
Next rowData
End Select
End With 'wsData
Next wsData
'Makrobremsen zurücksetzen
With Application
.ScreenUpdating = True
.Calculation = StatusCalc
End With
End Sub

Korrigierte Original-Version
Sub Copy_Cond_Annemarie()
Dim ws As Worksheet
Dim I As Integer
Dim S As Integer
Dim WS_Count As Integer
Dim RowCount As Integer
Dim copy_o As Double
Dim copy_e As String
Dim copy_d As Long
Dim check_value                                 'fcs-neu
WS_Count = ActiveWorkbook.Worksheets.Count
With ThisWorkbook
Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
ws.Name = "Output"
End With
For S = 1 To WS_Count
Worksheets(S).Activate
RowCount = Cells(Cells.Rows.Count, "O").End(xlUp).Row
For I = 1 To RowCount
Worksheets(S).Activate                                          'fcs-neu
Range("O" & I).Select
check_value = ActiveCell.Text                                   'fcs-geändert
If Not (check_value = "#DIV/0!" Or Trim(check_value) = "") Then 'fcs-geändert
copy_o = ActiveSheet.Range("O" & I)                         'fcs-geändert
Worksheets("Output").Activate
RowCount = Cells(Cells.Rows.Count, "c").End(xlUp).Row
Range("C" & RowCount + 1).Value = copy_o
Worksheets(S).Activate
Range("E" & I).Select
copy_e = ActiveSheet.Range("E" & I)                         'fcs-geändert
Worksheets("Output").Activate
Range("B" & RowCount + 1).Value = copy_e
Worksheets(S).Activate
Range("D" & I).Select
copy_d = ActiveSheet.Range("D" & I)                         'fcs-geändert
Worksheets("Output").Select
Range("A" & RowCount + 1).Value = copy_d
End If
Next
Next
End Sub

Anzeige
im VBA-Forum bereits gelöst....
19.08.2017 14:23:48
Werner
...aber seitens der Fragestellerin hält man es wohl wieder mal nicht für nötig hier darauf hinzuweisen.
Gruß Werner

314 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige