Anzeige
Archiv - Navigation
1508to1512
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

Bereich ermitteln

Bereich ermitteln
25.08.2016 09:54:55
Daniel
Hallo :)
ich komm gerade nicht zum erwünschten Ergebnis.
ich möchte gerne folgendes erreichen.
https://www.herber.de/bbs/user/107824.xlsx
Hier soll in Spalte B ermittelt werden wann nach einem Eintrag + freie Zeilen wieder ein Eintrag kommt.
Also ich brauche ein Makro was mir Beispielsweise bis Zeile 25 folgendes ausgibt. Das soll natürlich bis zur letzten Zeile durchgeführt werden. Sprich Die Zeile wo ein Eintrag steht und danach freie Zellen sind.
I = 2 Ergebnis 4 Nächstes i=6
I = 6 Ergebnis 7 Nächstes i=10
I = 10 Ergebnis 12 Nächstes i=15
I = 15 Ergebnis 17 Nächstes i=18
I = 18 Ergebnis 22 Nächstes i=24
I = 24 Ergebnis 25 Nächstes i=26
Mit diesem Code hat es bis jetzt leider noch nicht geklappt:
Sub bereinigen()
Dim letztezeile As Integer
letztezeile = Range("A1048576").End(xlUp).Row
For i = 2 To letztezeile - 1
If Abs(Cells(i + 1, 2) - Cells(i, 3)) < 0.0007 Then
Range("I" & i) = 1
Cells(i + 1, 2) = ""
Cells(i, 3) = Cells(i + 1, 3)
If Abs(Cells(i + 2, 2) - Cells(i, 3)) < 0.0007 Then
Range("I" & i + 1) = 2
End If
End If

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bereich ermitteln
25.08.2016 09:57:08
Daniel
Sorry das war der falsche code.
Den hier hatte ich probiert:
Sub test()
Dim letztezeile As Integer
Dim frei As Long
letztezeile = Range("A1048576").End(xlUp).Row
For i = 2 To letztezeile
MsgBox (i)
If Cells(i, 2)  0 Then
frei = Range("B" & i & ":" & "B" & letztezeile).End(xlDown).Row
i = frei
End If
Next i
End Sub

AW: Bereich ermitteln
25.08.2016 10:14:33
Fennek
Hallo,
vorweg: so ganz verstanden, was die Aufgabe ist, habe ich nicht.
Aber an eine Datenstruktur wie in Spalte B ist in Ansatz mit
for each c in columns("B").specialcells(2).areas
oft richtig. mit "c.address" und "c.count" sollte alles Gewünsche ausgelesen werden können.
mfg
Anzeige
AW: Bereich ermitteln
25.08.2016 10:25:26
Daniel
Hallo,
Danke für die Antwort.
Deine Antwort macht mich leider nicht wirklich schlauer.
Ich versuch es nochmal:
In Spalte B ist "Time Start" von Störungen. Die leeren Zellen dienen dazu um zu zeigen, dass diese Zeilen zur angefangenen Störung gehören.
Jetzt Brauch ich diese Bereiche. Sprich Störung + zugehörige Störungen. Damit ich später durch ein Makro die Endzeit der letzten Folgestörung zur Anfangszeit kopieren kann.
AW: Bereich ermitteln
25.08.2016 10:38:19
Daniel
Hoffe das vereinfacht das ganze nochmal.
Schleifenstart bei Zeile B2
dann folgendes ermitteln in Spalte B ermitteln
1.Erste leere Zeile ermitteln -1 (Ergibt den ersten Eintrag der Folgestörungen hat)
2.von dort an ermitteln bis wann die Nächste beschriebene Zeile kommt -1 ergibt die letzte leere Zeile
3.aus der letzten leeren Zeile ermitteln wann die nächste leere Zeile -1 ergibt das neue i
schleife von vorne mit dem neuem i
Anzeige
halbe Frage?
25.08.2016 12:01:59
Michael
Hi Daniel,
Du möchtest ein Makro, das irgendwas rechnet, um die Ergebnisse dann "später" weiterzuverarbeiten.
Der Aufwand, ein "halbes" Makro zu schreiben ist der gleiche wie für ein "ganzes". Also skizziere bitte mal, was Du insgesamt als Ergebnis haben möchtest.
Wenn Du das rechts neben Deine vorhandenen Spalten schreibst, für die ersten paar Werte, können wir das coden.
Schöne Grüße,
Michael
AW: halbe Frage?
25.08.2016 13:34:14
Daniel
Hallo Michael,
danke für den Hinweis.
Anbei die Datei und nochmals die Erklärung.
https://www.herber.de/bbs/user/107834.xlsx
Vielen Dank. Bei Fragen gerne nochmals fragen :)
Anzeige
AW: halbe Frage?
25.08.2016 13:34:17
Daniel
Hallo Michael,
danke für den Hinweis.
Anbei die Datei und nochmals die Erklärung.
https://www.herber.de/bbs/user/107834.xlsx
Vielen Dank. Bei Fragen gerne nochmals fragen :)
AW: halbe Frage?
25.08.2016 16:57:02
Michael
Hi Daniel,
so ganz ist mir das immer noch nicht klar; ich hatte Deinen vorhergehenden Thread mal überflogen, mich aber nicht dazu geäußert, weil mir das da schon komisch vorkam.
Du schreibst (107834.xlsx Blatt "Nach Bereinigung"): Ist die Differenz maximal 1 Minute handelt es sich um eine Folgestörung.
In den Daten ist dann z.B. B13:B14 leer, obwohl C12: 6:10:50, C13: 6:12:42 und C14: 6:15:19, also beträgt der Unterschied jeweils MEHR als 1 Minute. Warum scheint es dann eine "Folgestörung" zu sein?
Im Blatt "noch offen" erschließt sich mir auch nicht recht, warum der "rote Wert" an die "oberste, grüne" Position soll und nicht gleich in die dazugehörige gelbe Zeile, wo ja schon der Anfang steht.
Zu guter Letzt ist unklar (das haste nicht beispielhaft ausgefüllt), ob Du nun pro Vorfall ALLE Zeilen oder nur die jeweils erste oder kurz: welche Zeilen Du kopiert haben willst (in ein jeweils anderes Blatt). Hier aber: willst Du kopieren oder verschieben? Existieren die Blätter definitiv oder sollen bei Bedarf neue angelegt werden?
Schöne Grüße,
Michael
Anzeige
AW: halbe Frage?
26.08.2016 07:43:58
Daniel
Moin Michael,
danke das du dich dem Problem widmest.
Zu deiner Frage mit der Bereinigung.
Das bezieht sich immer auf die Startzeit.
Um das Beispiel von dir aufzugreifen sieht man dann in A10 die Hauptstörung die um 6:08 anfing und bis 6:09 ging. Aber diese Störung verursachte Folgestörungen, die immer maximal 1 Minute Differenz zueinander haben dürfen sprich man vergleicht B10 mit A11, B11 mit A12 und zu weiter. Dann stellt man fest das die letzte Folgestörung bis 6:27 ging. Also hat die Hauptstörung einen Stillstand von 6:08 bis 6:27 verursacht und genau das will ich Filtern.
Nach meinem erklärten Beispiel ist die rote Zeit, die Zeit wann die Hauptstörung & alle Folgestörungen beseitigt wurden und die Anlage wieder starten kann. Deswegen muss die Rote Zeit, nicht in die oberste grüne Spalte, sondern in die nächstmöglich oberste gelbe Spalte da diese die Anfangsstörung aufzeigt.
Ich hoffe es ist jetzt etwas verständlicher geworden.
Zu deinem letzten Punkt:
Erst mal hast du recht ich hab mich da nicht klar genug ausgedrückt.
Ich möchte gerne alle Störungen Haupt + Folgestörungen in die anderen Blätter kopiert haben.
Hier z.B. für die ZHA010 (Spalte E = Stationsbezeichnung) A2:F8 für die ZHA 20 A9:F9 für die ZHA30 A10:A25 usw.
Kopieren oder verschieben, ist mir egal :)
Wenn es keinen großen Aufwand macht gerne die Blätter bei Bedarf erstellen.
Das wär echt Klasse wenn du mir da etwas coden könntest. Das würde mir auch für andere Bereiche dann enorm weiterhelfen, in den ich den Code als Grundlage nehmen kann.
Vielen Dank im Vorraus :)
gruß
Daniel
Anzeige
AW: halbe Frage?
26.08.2016 14:55:04
Michael
Hi Daniel,
anbei Datei mit Makro.
Es legt neue Blätter an, sofern nicht vorhanden, leert aber vorhandene, anstatt weitere Werte unten anzuhängen: das läßt sich mit ein paar Zeilen ändern, aber wir hatten den Punkt noch nicht angesprochen.
Das Ersetzen der Zeit erfolgt während des Kopierens in einer Schleife (siehe 3.b), die Du im Prinzip extrahieren und auf den "großen" Bestand anwenden *könntest* - dann aber hier rausnehmen solltest: wozu zweimal das Gleiche rechnen?
Datei: https://www.herber.de/bbs/user/107855.xlsm
Makro:
Option Explicit
Sub Kopieren()
Const abZ = 2
Dim vSh As Worksheet, nSh As Worksheet ' "von"-Sheet und "nach" bzw. "neu"-Sheet
Dim bisZ&, z&, i&
Dim MA, W ' W wie Werte
Dim MAz&
Dim vorhSh As String
Dim gemerkt
Dim t0 As Single, t1 As Single
t0 = Timer
' 1. Ermitteln vorhandener Blätter
vorhSh = "!"
For i = 1 To Sheets.Count
vorhSh = vorhSh & Sheets(i).Name & "!"
Next
' "!" dürfen in Blattnamen nicht vorkommen...
' 2. Ermitteln aller Begriffe
bisZ = Range("E" & Rows.Count).End(xlUp).Row
MA = Range("E1:G" & bisZ + 1) ' bis 1 mehr, weil leer
MAz = 1
For z = 2 To bisZ + 1
If MA(z, 1)  MA(z - 1, 1) Then
MAz = MAz + 1
MA(MAz, 1) = MA(z, 1)
MA(MAz, 2) = z
MA(MAz - 1, 3) = z - 1
End If
Next
Application.ScreenUpdating = False
' Die nächste Zeile dienen nur der Veranschaulichung und können dann entfernt werden.
'MsgBox "Hier mal ansehen..."
Range("j25").Resize(MAz, 3) = MA
' 3. Diverses
Set vSh = ActiveSheet
gemerkt = ""
For z = 2 To MAz - 1
' Hier noch die Gretchenfrage: Werte im Zielblatt UNTEN anhängen
' ODER alles überschreiben?
' 3.a Erzeugen der Blätter
If InStr(vorhSh, "!" & MA(z, 1) & "!") = 0 Then
Sheets.Add After:=Sheets(Sheets.Count)
Set nSh = Sheets(Sheets.Count)
nSh.Name = MA(z, 1)
vorhSh = vorhSh & MA(z, 1) & "!" ' neuer Name in den Prüfstring
Else
Set nSh = Sheets(MA(z, 1))
nSh.Cells.Clear ' LÖSCHT alles im vorh. Blatt
End If
vSh.Range("A1:F1").Copy nSh.Range("A1") ' Kopieren der Überschrift
' 3.b Einlesen des Bereichs und Bearbeitung
W = vSh.Range("A" & MA(z, 2) & ":F" & MA(z, 3)) ' enthält je die Zeilen für Gleiche
For i = UBound(W) To 1 Step -1
If W(i, 2) = "" Then
If gemerkt = "" Then gemerkt = W(i, 3)
Else
If gemerkt  "" Then W(i, 3) = gemerkt: gemerkt = ""
End If
Next
' 3.c Schreiben des Arrays
nSh.Range("A2").Resize(UBound(W), 6) = W
Next
vSh.Activate
t1 = Timer
MsgBox (t1 - t0) * 1000
End Sub
Schöne Grüße,
Michael
Anzeige
AW: halbe Frage?
29.08.2016 07:38:00
Daniel
Moin Michael,
das klappt super gut :)!
Hast meinen Respekt, so ganz hab ich das Makro noch nicht verstanden aber ich arbeite dran.
Es wär super wenn andere Daten unten drangehängt werden können. Da diese Daten ja täglich neu kommen.
Woran ich vor allem noch arbeiten muss ist das Verständnis mit den Arrays.
Es wär super wenn du mir noch den Punkt von oben einbauen könntest.
Eine Sache ist mir jetzt erst noch aufgefallen die fehlt.
Wenn es keine großen Umstände macht wär es super wenn das Makro vor dem Austauschen der Zeit die Differenz in Sekunden bildet und diese der Zeile G addiert um die gesamt Störzeit zu generieren.
In Spalte G steht die Duration Netto in Sekunden, was in der Datei die ich dir gegeben hatte von mir entfernt war.
Bis dahin hast du mir aufjedenfall sehr geholfen !
Vielen Dank
und beste Grüße
Daniel
Anzeige
AW: halbe Frage?
29.08.2016 15:14:02
Daniel
Also das mit der Zeit hab ich jetzt hinbekommen.
Fehlt nur noch das mit dem drunter kopieren.
Sub Kopieren()
Const abZ = 2
Dim vSh As Worksheet, nSh As Worksheet ' "von"-Sheet und "nach" bzw. "neu"-Sheet
Dim bisZ&, z&, i&
Dim MA, W ' W wie Werte
Dim MAz&
Dim vorhSh As String
Dim gemerkt, a
Dim t0 As Single, t1 As Single
t0 = Timer
' 1. Ermitteln vorhandener Blätter
vorhSh = "!"
For i = 1 To Sheets.Count
vorhSh = vorhSh & Sheets(i).Name & "!"
Next
' "!" dürfen in Blattnamen nicht vorkommen...
'2. Ermitteln aller Begriffe
bisZ = Range("E" & Rows.Count).End(xlUp).Row
MA = Range("E1:G" & bisZ + 1) ' bis 1 mehr, weil leer
MAz = 1
For z = 2 To bisZ + 1
If MA(z, 1)  MA(z - 1, 1) Then
MAz = MAz + 1
MA(MAz, 1) = MA(z, 1)
MA(MAz, 2) = z
MA(MAz - 1, 3) = z - 1
End If
Next
Application.ScreenUpdating = False
' Die nächste Zeile dienen nur der Veranschaulichung und können dann entfernt werden.
'MsgBox "Hier mal ansehen..."
Range("j25").Resize(MAz, 3) = MA
' 3. Diverses
Set vSh = ActiveSheet
gemerkt = ""
For z = 2 To MAz - 1
' Hier noch die Gretchenfrage: Werte im Zielblatt UNTEN anhängen
' ODER alles überschreiben?
' 3.a Erzeugen der Blätter
If InStr(vorhSh, "!" & MA(z, 1) & "!") = 0 Then
Sheets.Add After:=Sheets(Sheets.Count)
Set nSh = Sheets(Sheets.Count)
nSh.Name = MA(z, 1)
vorhSh = vorhSh & MA(z, 1) & "!" ' neuer Name in den Prüfstring
Else
Set nSh = Sheets(MA(z, 1))
nSh.Cells.Clear ' LÖSCHT alles im vorh. Blatt
End If
vSh.Range("A1:G1").Copy nSh.Range("A1") ' Kopieren der Überschrift
' 3.b Einlesen des Bereichs und Bearbeitung
W = vSh.Range("A" & MA(z, 2) & ":G" & MA(z, 3)) ' enthält je die Zeilen für Gleiche
For i = UBound(W) To 1 Step -1
If W(i, 2) = "" Then
If gemerkt = "" Then gemerkt = W(i, 3)
Else
a = W(i, 7)
If gemerkt  "" Then W(i, 7) = Format((gemerkt - W(i, 3)) * 86400 + a, "0,00")
If gemerkt  "" Then W(i, 3) = gemerkt: gemerkt = ""
End If
Next
' 3.c Schreiben des Arrays
nSh.Range("A2").Resize(UBound(W), 7) = W
Next
vSh.Activate
t1 = Timer
MsgBox (t1 - t0) * 1000
End Sub 

Anzeige
ganze Antwort
29.08.2016 15:52:01
Michael
Hi Daniel,
ich habe das Ding jetzt wunschgemäß angepaßt; zwischenzeitlich hast Du ja selber noch was geändert: das sehe ich mir jetzt NICHT an, nicht aus Böswilligkeit, sondern aus Zeitgründen.
Datei mit noch ein paar Kommentaren im Code anbei: https://www.herber.de/bbs/user/107871.xlsm
Es gibt eine Reihe schöner Texte zu Arrays, z.B. den:
http://www.online-excel.de/excel/singsel_vba.php?f=152
Ansonsten halt: learning by doing...
Happy Exceling,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige