Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1604to1608
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

Cells Count nicht hinbekommen

Cells Count nicht hinbekommen
09.02.2018 08:04:39
Burak
Guten Morgen,
scheitere grade an einer eigentlich sehr einfachen Aufgabe :(
Will dieses Mal aus den Zeilen

With Worksheets("Mikrostörungen")
Zeilenzahl = .Range("A1").CurrentRegion.Rows.Count
Range("A" & Zeilenzahl + 1).Value = xxx
es in einer Zeile schaffen!
Mein kläglicher Versuch:

For k = 1 To 5
With Worksheets("Mikrostörungen")
Range("A" & .Cells(.Rows.Count, 1).End(xlUp).Row + 1).Value = "R" & k
End With
Next k
Also dass letzten Endes auf dem Worksheet erstmal in A1 = "R1" in A2 = "R2" usw steht.
Der Code gibt zwar keine Fehlermeldung aus aber macht auch nicht das was es soll (falls er überhaupt etwas macht)
Freundliche Grüße und vielen Dank im Voraus

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Cells Count nicht hinbekommen
09.02.2018 08:19:18
hary
Moin
Meinst du es so?
Dim letzte As Long
With Worksheets("Mikrostörungen")
letzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.Range("A1") = "R1"
.Range("A1").AutoFill Destination:=.Range("A1:A" & letzte), Type:=xlFillDefault
End With

gruss hary
AW: Cells Count nicht hinbekommen
09.02.2018 08:38:53
Burak
Die Idee ist schonmal gut, aber
1. wenn ich den Code so ausführe kriege ich eine Fehlermeldung, wenn im Zielblatt Zelle A1 und A2 leer ist. (Die AutofillMethode des Range Objektes konnte nicht ausgeführt werden)
2. Wenn ich einen beliebigen Wert in Zelle A1 und A2 schreibe, dann kriege ich keine Fehlermeldung, aber es passiert nichts.
3. Wenn ich aus
.Range("A1").AutoFill Destination:=.Range("A1:A" & letzte), Type:=xlFillDefault

.Range("A1").AutoFill Destination:=.Range("A1:A" & letzte + 1), Type:=xlFillDefault
mache funktioniert der Code, aber beginnt mit dem Zählen immer nicht bei 1 sondern der Zahl zuvor, also wenn ich A1 R4 steht, beginnt er in A2 mit R5 udn geht bis A6 mit R9.
Wenn die Tabelle komplett leer ist, macht er beim veränderten Code gar nichts.
Anzeige
AW: Cells Count nicht hinbekommen
09.02.2018 08:22:16
Cryopara
For k = 1 To 5
With Worksheets("Tabelle1")
.Cells(k, 1).Value = "R" & k
End With
Next k
AW: Cells Count nicht hinbekommen
09.02.2018 08:28:24
Burak
nein so wird das nicht funktionieren, da er immer in die erste unbeschriftete Zelle den Wert schreiben soll.
AW: Cells Count nicht hinbekommen
09.02.2018 08:31:56
Cryopara
"Tabelle1" ersetzen

For k = 1 To 5
With Worksheets("Tabelle1")
If .Cells(k, 1).Value = "" Then
.Cells(k, 1).Value = "R" & k
End If
End With
Next k
End Sub

AW: Cells Count nicht hinbekommen
09.02.2018 08:44:45
Burak
Wird besser aber nicht das was ich will, also kurze genauere Erklärung zum Gesamtmakro:
Er hat 5 Sheets, wo er gewisse Daten raussucht und die Datensätze in das neue Sheet kopiert.
Für jedes Sheet soll er erst den Tabellenblattnamen (R1, R2...) in das neue Sheet schreiben, dann kopiert er die Datensätze, in der Zeile unter den kopierten Datensätzen dann R2 schreiben, dann wieder Datensätze kopieren, dann R3 usw.
Also so etwa:
Mikrostörungen

 ABCDE
1R1    
2abcde
3fghrrtjdsghrt
4wegdsfjhrkznh
5qertkztfgebmsgff
6asfgfdjhrtzuerwer
7gfasdsdfjjjghj
8R2    
9wegrwegevsdasd
10gfdasdfdfgghsdf
11R3    
12sdfdsferfgnd
13vasdbgwerezjhrbsd
14R4    
15gegfdgehgsadg
16R5    
17asdfgagfafgaasd
18adfdsfasdfgfgfsd
19sadfghtzjiio


Anzeige
AW: Cells Count nicht hinbekommen
09.02.2018 09:10:23
hary
Moin
Dann zeig mal das Kopier-Makro.
Ist das neue Blatt schon vorhanden?
gruss hary
AW: Cells Count nicht hinbekommen
09.02.2018 09:20:55
Burak

Dim ws As Worksheet, avrg As Long, i As Long, ii As Long, j As Long
Dim flag As String, rng As Range, c As Range
For k = 1 To 5
Set ws = ThisWorkbook.Sheets("R" & k)
With ws
.Cells.Interior.Color = xlNone
i = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
ii = 1
flag = .Cells(2, 1).Value
For j = 2 To i
If flag  .Cells(j, 1).Value Then
flag = .Cells(j, 1).Value
Set rng = .Range(.Cells(ii, 5), .Cells(j - 1, 5))
avrg = Application.WorksheetFunction.TrimMean(rng, 0.8)
For Each c In rng
If c >= avrg * 2 And c 
So ungefähr nur, dass er bisher die Zelle farbig markiert, anstatt die ganze Zeile in das neue Sheet "Mikrostörungen" zu schreiben, daran arbeite ich grade
Anzeige
AW: Cells Count nicht hinbekommen
09.02.2018 10:25:37
hary
Moin
Ungetestet Soll wirklich die ganze Zeile kopiert werden?
Dim ws As Worksheet, wksZ As Worksheet
Dim avrg As Long, ii As Long, j As Long
Dim flag As String, rng As Range, c As Range
Set wksZ = Worksheets("Mikrostörungen") '--Blatt muss vorhanden sein
For k = 1 To 5
Set ws = ThisWorkbook.Sheets("R" & k)
wksZ.Cells(wksZ.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) = ws.Name
With ws
ii = 1
flag = .Cells(2, 1).Value
For j = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If flag  .Cells(j, 1).Value Then
flag = .Cells(j, 1).Value
Set rng = .Range(.Cells(ii, 5), .Cells(j - 1, 5))
avrg = Application.WorksheetFunction.TrimMean(rng, 0.8)
For Each c In rng
If c >= avrg * 2 And c 

Anzeige
AW: Cells Count nicht hinbekommen
09.02.2018 11:25:59
Burak
Naja theoretisch reicht Spalten A bis G
AW: Zusatz
09.02.2018 11:52:20
Burak
also ich denke mal die Performance hat durch das Kopieren deshalb so stark nachgelassen weil er die GESAMTE Zeile kopiert? Weil von der Geschwindigkeit ist das Makro durch das Kopieren nicht mehr brauchbar, zu langsam.
AW: Zusatz
09.02.2018 12:12:23
Peter(silie)
Hallo,
das liegt unteranderem an der verwendung von Copy...
Bitte liefere uns diesmal eine Beispiel Mappe
AW: Zusatz
09.02.2018 12:31:26
Burak
Danke schonmal
https://www.herber.de/bbs/user/119675.xlsm
Hier sind natürlich weit weniger Daten, daher geht das im annehmbaren Tempo.
Im Original sind es bis zu etwa 15.000 Zeilen pro Seite (R1 bis R5)
Anzeige
AW: Zusatz
09.02.2018 14:48:18
Peter(silie)
Hallo,
unten Code und Mappe.
Habe einen Test gemacht mit 15000 Zeilen Pro Blatt.
Also 75000 Zeilen Insgesamt die geprüft und evtl. übertragen werden.
Dabei hat die Dauer 3,38 Sekunden betragen.
Wird je nach Rechenleistung und Auslastung der CPU variieren.
Hier deine Mappe nur mit den von mir benötigten Tabellen: https://www.herber.de/bbs/user/119680.xlsm
(Habe auf 400 Zeilen pro blatt gekürzt damit Upload klappt)
Bitte beachte, dass du den Namen der Klasse nicht abändern solltest.
Hier nur Code:
ExecuteAverage Modul:
Option Explicit
Public Sub PutAboveAverageIntoSheet()
Dim sa(1 To 5) As New SheetAverage
Dim i As Long, target_ As Worksheet
Dim lRow As Long
Set target_ = ThisWorkbook.Sheets("Mikrostörungen")
For i = 1 To 5
lRow = target_.Cells(target_.Rows.Count, 1).End(xlUp).Row + 1
target_.Cells(lRow, 1).Value = "R" & i
Set sa(i).DataSheet = ThisWorkbook.Sheets("R" & i)
sa(i).PutAverage
sa(i).CreateIndizes
sa(i).PutIndizedValues ThisWorkbook.Sheets("Mikrostörungen")
sa(i).RemoveAverages
Next i
End Sub

SheetAverage Klasse:
Option Explicit
Private indizes_() As Long
Private sh As Worksheet
Public Property Set DataSheet(ByRef this_ As Worksheet)
Set sh = this_
End Property
Public Sub PutAverage()
Dim lRow As Long, flag As String
Dim rng As Range, rng2 As Range
Dim i As Long, j As Long, avrg As Long
With sh
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rng = .Range(.Cells(2, 1), .Cells(lRow, 1))
flag = .Cells(2, 1).Value
j = 2
For i = 2 To lRow
If rng(i - 1, 1).Value  flag Then
Set rng2 = .Range(.Cells(j, 5), .Cells(i - 1, 5))
avrg = Application.WorksheetFunction.Average(rng2) * 1.2
Set rng2 = .Range(.Cells(j, 15), .Cells(i - 1, 15))
rng2.Value = avrg
flag = rng(i, 1)
j = i - 1
End If
Next i
End With
End Sub
Public Sub CreateIndizes()
Dim lRow As Long, n As Long
Dim values As Range, averages As Range
With sh
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set values = .Range(.Cells(1, 5), .Cells(lRow, 5))
Set averages = .Range(.Cells(1, 15), .Cells(lRow, 15))
For lRow = 2 To values.Rows.Count
If values(lRow, 1).Value >= averages(lRow, 1).Value Then
ReDim Preserve indizes_(n)
indizes_(n) = lRow
n = n + 1
End If
Next lRow
End With
End Sub
Public Sub PutIndizedValues(ByRef TargetSheet As Worksheet)
Dim lRow As Long, i As Long
Dim values As Variant
With sh
For i = LBound(indizes_) To UBound(indizes_)
values = .Range(.Cells(indizes_(i), 1), .Cells(indizes_(i), 7)).Value
lRow = TargetSheet.Cells(TargetSheet.Rows.Count, 1).End(xlUp).Row + 1
With TargetSheet
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Range(.Cells(lRow, 1), .Cells(lRow, 7)).Value = values
End With
Next i
End With
End Sub
Public Sub RemoveAverages()
sh.Cells(1, 15).EntireColumn.Delete
End Sub

Anzeige
AW: Zusatz
09.02.2018 15:01:29
Burak
Hoffe war korrekt, habe das ganze so in ein Modul eingefügt und per Button das Sub PutAboveAverageIntoSheet gestartet.
Da kriege ich für Zeile 2 eine Fehlermeldung:
Benutzerdefinierter Typ nicht definiert
AW: Zusatz
09.02.2018 15:06:41
Peter(silie)
Hallo,
die Klasse musst du auch importieren, also nein war nicht richtig.
Öffne meine Datei, Exportiere das Modul und die Klasse.
Ändere deren Namen nicht ab.
Importiere beides in deine Datei, ändere die Namen nicht ab
AW: Zusatz
09.02.2018 15:30:37
Burak
oha nice! von einer Ausführungszeit von über 30 Minuten runter auf etwa 20 Sekunden.
Du bist der Beste!!!
:******
Danke vielmals!!
Anzeige
Geschlossen und Freut mich zuhören...owT
09.02.2018 15:39:44
Peter(silie)

AW: Cells Count nicht hinbekommen
09.02.2018 09:16:12
Peter(silie)
Hallo,
der thread wird ja ganz schön lang.
Unten ein wenig Code mit Kommentaren, vielleicht hilft er dir ein wenig:
Option Explicit
Sub CopyData()
Dim src As Worksheet, trg As Worksheet
Dim lRow As Long, rng As Range
'Unser Target sheet
Set trg = ThisWorkbook.Sheets(1)
'Loop durch alle Tabellenblätter in dieser Arbeitsmappe
For Each src In trg.Parent.Sheets
'Sofern das Source sheet nicht das Target sheet ist
If src.Name  trg.Name Then
'src = Tabellenblatt wo letzte Zeile gefunden werden soll
'1 = Spalte die als referenz genommen wird.
'Alternativ die Funktion in: LastRow = .UsedRange.Rows.Count ändern
lRow = LastRow(src, 1)
'Sofern wir tatsächlich Daten haben
If lRow > 1 Then
'Definiere eine Range die wir später "kopieren"
Set rng = src.Range(src.Cells(1, 1), src.Cells(lRow, 5))
End If
'Letzte Zeile aus unserem Target sheet +1
lRow = LastRow(trg, 1) + 1
With trg
'Tabellenname einfügen
.Cells(lRow, 1).Value = src.Name
'Daten die wir "kopiert" haben wieder einfügen
'"kopieren" in Gänsefüßchen, da wir nichts kopieren sondern
'eine Referenz auf ein Objekt setzen, somit auch auf
'die Werte und Eigenschaften dieses Objektes (obj = rng)
.Range(.Cells(lRow + 1, 1), .Cells(lRow + 1, 1)).Resize( _
rng.Rows.Count, rng.Columns.Count).Value = rng.Value
'Bereich zurücksetzen
Set rng = Nothing
End With
End If
Next src
End Sub
Private Function LastRow(ByRef ofSheet, ByVal ofColumn As Long) As Long
With ofSheet
LastRow = .Cells(.Rows.Count, ofColumn).End(xlUp).Row
End With
End Function

Anzeige
AW: Cells Count nicht hinbekommen
09.02.2018 09:37:36
Burak
Scheint grundsätzlich schonmal gut zu funktionieren, der einzige Manko entsteht hier nur aufgrund von fehlenden Informationen. Durchgegangen und kopiert werden nur Worksheets 2 bis 6. Danke für die Kommentare, die helfen mir sehr weiter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige