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

.find -> Suche erst nach x Durchläufen erfogreich

.find -> Suche erst nach x Durchläufen erfogreich
24.05.2009 09:14:17
Suppenhuhn
Hallo Gemeinde !
Angehängte Makro-Routinen habe ich geschrieben um aus einer sehr, sehr langen Excel-Tapete die Zeilenpaare in ein neues Blatt auszusortieren, die in Spalte 13 bzw. 14 den gleichen Eintrag haben und deren Summe der Beträge in Spalte 17 gleich NULL sind.
Das Problem ist, dass das unten stehende Makro mehr als einen Durchlauf benötigt um alle Zeilenpaare zu finden.
Ich verstehe nicht weshalb das so ist.
Kann mir das bitte jemand erklären ?
Vielen Dank schonmal dafür ...
Suppi
Option Explicit
Dim Seitenname, Tabellenname, GenutzteReihen, Durchgang, Loeschgang, Gefunden, suchVsuch
Dim D, DD, I, II, LastI, X, Y, Z, Spalte
Dim SuchZeile, FindZeile, SuchBetrag, FindBetrag, Suchbegriff
Dim Auftrag, PSPElement
Dim LeereZeile, Gearbeitet As Boolean
Dim Fertig, Zeitmessung, ZeitMin, ZeitSek As Single
Dim ZM As Integer
Dim Sortierspalte As Range
Sub Aktivierungsbuchungen()
X = 0
Gefunden = 0
Durchgang = 0
Loeschgang = 0
Gearbeitet = False
LabelProgress.Width = 0
Tabellenname = "Aktivierungsbuchungen"
Seitenname = ActiveSheet.Name
GenutzteReihen = ActiveSheet.UsedRange.Rows.Count - 1
'MsgBox (GenutzteReihen)
For Y = 1 To Sheets.Count
If Worksheets(Y).Name = Tabellenname Then X = 1
Next Y
If X = 0 Then
Sheets.Add After:=Worksheets(Seitenname)
Worksheets(ActiveSheet.Name).Name = Tabellenname
Worksheets(Seitenname).Select
Worksheets(Seitenname).Rows(1).Copy
Worksheets(Tabellenname).Rows(1).Insert Shift:=xlDown
End If
Call Sortiere("P2")
Worksheets(Seitenname).Cells(1, 17).Select
Zeitmessung = Timer
Do
D = 0
Durchgang = Durchgang + 1
I = 0
Do
I = I + 1
Do
Auftrag = Worksheets(Seitenname).Cells(I, 14).Formula
PSPElement = Worksheets(Seitenname).Cells(I, 13).Formula
If Auftrag = "" And PSPElement = "" Then I = I + 1
If I >= GenutzteReihen Then Exit Do
Loop While Auftrag = "" And PSPElement = ""
SuchBetrag = Worksheets(Seitenname).Cells(I, 17).Value
If Not Auftrag = "" Then Call SuchMich(14, Auftrag)
If Not PSPElement = "" Then Call SuchMich(13, PSPElement)
GenutzteReihen = Worksheets(Seitenname).UsedRange.Rows.Count - 1
Fertig = I / GenutzteReihen
With Fortschrittsbalken
Me.Caption = Format(Fertig, "0%") & " der Aktivierungsbuchungen aussortiert! --- " & Durchgang & ".Durchgang"
.LabelProgress.BackColor = &HFF&
.LabelProgress.Width = Fertig * (.FrameProgress.Width - 5)
End With
DoEvents
Loop Until I >= GenutzteReihen
Call Sortiere("O2")
Loop While D > 0
Zeitmessung = Timer - Zeitmessung
ZeitMin = Round(Zeitmessung / 60, 0)
ZeitSek = Round(Zeitmessung - (ZeitMin * 60), 0)
Call Sortiere("O2")
Fortschrittsbalken.Hide
Application.StatusBar = "Fertig ..."
MsgBox ("Durchgänge: " & Durchgang & Chr(13) & Chr(13) & "Benötigte Zeit: " & ZeitMin & ":" & ZeitSek)
End Sub



Private Sub Sortiere(Sortierspalte)
Range("A1").Activate
Worksheets(Seitenname).Range("A1").Sort _
Key1:=Range(Sortierspalte), _
Order1:=xlAscending, _
Header:=xlYes, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Worksheets(Seitenname).Cells(1, 17).Select
End Sub



Private Sub SuchMich(Spalte, Suchbegriff)
With Worksheets(Seitenname).Columns(Spalte)
Set Z = .Find(Suchbegriff, LookIn:=xlFormulas)
If Not Z Is Nothing Then
If Z.Row = I Then .FindNext (Z)
FindBetrag = Worksheets(Seitenname).Cells(Z.Row, 17).Value
If SuchBetrag  0 And SuchBetrag + FindBetrag = 0 Then
D = D + 1
FindZeile = Z.Row
Gearbeitet = True
Worksheets(Seitenname).Rows(I).Cut
Worksheets(Tabellenname).Rows(2).Insert Shift:=xlDown
Worksheets(Tabellenname).Cells(2, 20).Value = Durchgang
Worksheets(Tabellenname).Cells(2, 21).Value = I
Worksheets(Seitenname).Rows(FindZeile).Cut
Worksheets(Tabellenname).Rows(2).Insert Shift:=xlDown
Worksheets(Tabellenname).Cells(2, 20).Value = Durchgang
Worksheets(Tabellenname).Cells(2, 21).Value = FindZeile
Gefunden = Gefunden + 1
Application.StatusBar = Gefunden & " Aktivierungsbuchungen aussortiert ..."
If I > 2 Then
I = I - 2
Else
I = 1
End If
Else
.FindNext (Z)
End If
End If
End With
End Sub


12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: .find -> Suche erst nach x Durchläufen erfogreich
24.05.2009 09:38:54
ransi
Hallo
PSPElement erinnert mich irgendwie an FAS...
Aber egal.
die in Spalte 13 bzw. 14 den gleichen Eintrag haben und deren Summe der Beträge in Spalte 17 gleich NULL sind.
Bei den Vorgaben kann das doch nur heissen ?
Spalte 13=0
Spalte 14 =0
ransi
AW: .find -> Suche erst nach x Durchläufen erfogreich
24.05.2009 10:49:35
Berndi
Nein !
Es ist so, dass in Spalte 17 ein positiver oder negativer Betrag steht.
Ist in den ~65000 Zeilen ein Doppeleintrag in Spalte 13 oder (!) 14 vorhanden, soll geprüft werden, ob die beiden Beträge (der jeweiligen Zeile, in Spalte 17) addiert, den Wert NULL ergeben.
Sorry !
Es war mir nicht klar, dass ich das so missverständlich formuliert hatte ...
LG,
Berndi
Anzeige
AW: .find -> Suche erst nach x Durchläufen erfogreich
24.05.2009 11:10:52
ransi
HAllo Berndl
Ich habs immer noch nicht verstanden....
Sorry
Lade doch bitte mal eine kleine Beispieldatei hoch.
Daten in Spalte 13,14,17, und wo das Gesuchte dann wie ausgegeben werden soll.
ransi
AW: .find -> Suche erst nach x Durchläufen erfogreich
24.05.2009 12:01:34
Berndi
Bei den kleinen ist's kein Problem.
Da klappt es mit einem Durchlauf.
Bei großen, wie sie leider anfallen (mahr als 20000 Zeilen) braucht es mehrere Durchläufe.
Eine Datei mit diesem Ausmaß möchte ich hier nicht hochladen, zumal es sich um vertrauliche Inhalte handelt.
Die Zeilen gestalten sich im Prinzip so, dass in den Spalten 1-12 irgendwelche Infos stehen, in Spalte 13 eine Auftragsnummer, in Spalte 14 eine Kennung und in Spalte 17 ein EURO-Betrag.
Ich will in dieser wilden Ansammlung von Daten so lange die zwei Zeilen herausfiltern (in ein separates Blatt überführen), die entweder die gleiche Auftragsnummer (Spalte 13) oder Kennung (Spalte 14) haben und deren beide EURO-Beträge (Spalte 17) sich gegenseitig aufheben, bis keine mehr vorhanden sind.
Eine Zeile hat entweder eine Auftragsnummer oder Kennung, nie beides gleichzeitig.
Mein Script findet im ersten Durchlauf ~5600 Einträge.
Im zweiten Durchlauf immer noch 100.
Im dritten 6.
Im vierten keine mehr.
Warum findet es nicht alle im ersten Durchlauf ?
Gibt es eine Fehlfunktion im ".find" ?
Jetzt alles klar ?
LG,
Berndi
Anzeige
AW: .find -> Suche erst nach x Durchläufen erfogreich
24.05.2009 12:01:53
Berndi
Bei den kleinen ist's kein Problem.
Da klappt es mit einem Durchlauf.
Bei großen, wie sie leider anfallen (mahr als 20000 Zeilen) braucht es mehrere Durchläufe.
Eine Datei mit diesem Ausmaß möchte ich hier nicht hochladen, zumal es sich um vertrauliche Inhalte handelt.
Die Zeilen gestalten sich im Prinzip so, dass in den Spalten 1-12 irgendwelche Infos stehen, in Spalte 13 eine Auftragsnummer, in Spalte 14 eine Kennung und in Spalte 17 ein EURO-Betrag.
Ich will in dieser wilden Ansammlung von Daten so lange die zwei Zeilen herausfiltern (in ein separates Blatt überführen), die entweder die gleiche Auftragsnummer (Spalte 13) oder Kennung (Spalte 14) haben und deren beide EURO-Beträge (Spalte 17) sich gegenseitig aufheben, bis keine mehr vorhanden sind.
Eine Zeile hat entweder eine Auftragsnummer oder Kennung, nie beides gleichzeitig.
Mein Script findet im ersten Durchlauf ~5600 Einträge.
Im zweiten Durchlauf immer noch 100.
Im dritten 6.
Im vierten keine mehr.
Warum findet es nicht alle im ersten Durchlauf ?
Gibt es eine Fehlfunktion im ".find" ?
Jetzt alles klar ?
LG,
Berndi
Anzeige
Jetzt alles klar ? Nee!
24.05.2009 12:14:53
ransi
HAllo Berndi
Ich kann mir das nicht nachbauen weil ich das nicht verstehe !!
Lade doch mal bitte eine kleine Beispieldatei hoch.
Irgendwelche Phantasieauftragsnummern, Phantasiekennungen, Phantasiebeträge.
10-20 Datensätze reichen.
ransi
AW: Jetzt alles klar ? Nee!
24.05.2009 14:56:03
Berndi
https://www.herber.de/bbs/user/62008.zip
Ich habe auch das Script als Addon beigefügt.
Bei Aktivierung erscheint ein Symbol an Platz 10 der Standard-Knopfleiste.
Danke für's Testen.
LG,
Berndi
Datei defekt ?
24.05.2009 16:04:39
ransi
HAllo Bernd
Ich sags ungern, aber ich kriege die Beispieldatei nicht geöffnet.
Die XLA geht.
ransi
Anzeige
AW: Datei defekt ?
24.05.2009 20:45:13
Berndi
Also, ich hab' jetzt auch mal die Datei über den Link geöffnet.
Geht alles prima.
In der Zip-Datei ist noch eine Zip-Datei !
Was den Fehler angeht, so habe ich festgestellt, dass der Befehl: .FindNext(Z) zu keinem Ergebnis führt, bzw. nicht zur nächsten, möglichen Zeile springt.
Wie muss ich die Suchroutine denn schreiben, dass das Makro mir in der jeweiligen Spalte nach dem Suchbegriff sucht und bei .FindNext(Z) zur nächsten Zeile mit dem Suchkriterium springt.
Da hab' ich wohl irgendwas falsch gemacht.
Weiß jemand, was ich da falsch gemacht habe ?
LG,
Berndi
Anzeige
AW: Datei defekt -geht nicht!! :-( owT
25.05.2009 08:23:36
robert
AW: .find -> Suche erst nach x Durchläufen erfogreich
24.05.2009 17:23:00
Berndi
Geht das überhaupt ?
With Worksheets(Seitenname).Columns(Spalte)
Set Z = .Find(Suchbegriff, LookIn:=xlFormulas)
AW: mit Formeln zum Erfolg
24.05.2009 13:24:06
Daniel
Hi
markiere dir doch die entsprechenden Zellen per Formel: (Formel für Zeile 1)
=wenn((SummeWenn(M:M;M1;Q:Q)*SummeWenn(N:N;N1;Q1:Q1))=0;"x";""
dann kannst du die entspechenden Zellen per Autofilter oder .SpecialCells markieren und in das andere Blatt kopieren.
allerdings solltest bei dieser Datenmenge vorher nach der Hilfsspalte sortieren und ggf vorher noch in der Hilfsspalte Formeln durch Werte ersetzen, weil die SummeWenn-Formeln recht zeitaufwendig sind.
Gruß, Daniel
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige