Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Ursprüngliche Zahlen finden?
#91
Hallo Atilla,

anbei mal der überarbeitete Code. Dauert nun nur noch 0,157 Sekunden, also ca. 10% Laufzeit gegenüber der ursprünglichen Version. Ich sammle die Gefärbten einer Zeile jetzt auch in einem String, weise den dann aber zeilenweise einer Collection zu und prüfe nur noch auf den Inhalt der Collection. Find nehme ich nicht, da nicht ausgeschlossen werden kann, dass eine Zahl im zu prüfenden Bereich gefärbt und ungefärbt enthalten ist. Das ist zumindest dann der Fall, wenn in AM1 nix steht. Das war im ersten Beispiel so und wurde bisher ja nicht ausgeschlossen, wenn ich nichts überlesen habe.

Modul mdl_schauan
Option Explicit 
'Deklaration der API-Funktion 
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long 
 
Public Function CountColored4(ByVal iCalRow As Long, colnumbers As Collection) As Long 
'Konstante fuer Debug-Kontrolle 
Const debCnt As Integer = 29 
'Variablendeklarationen 
'Long 
Dim cCount&, iCntC&, iCntR&, iColI&, iRowF& 
'Bereich 
Dim rngCells As Range, Zellen As Range 
'Boolean 
Dim bolTref As Boolean 
'Collections 
Dim colNumb As Collection, colRows As Collection 
'Collection initialisieren 
Set colNumb = New Collection 
Set colRows = New Collection 
'Funktion in Zeile 1 mit Wert 0 verlassen 
If iCalRow = 1 Then CountColored4 = 0: Exit Function 
'Alle zu pruefenden Zahlen im Bereich O:Z aufnehmen 
Set rngCells = Range("O1:Z" & iCalRow) 
'Zahlen aufnehmen 
With rngCells 
  'Array redimensionieren 
  Redim arrColR(1 To iCalRow) 
  'Schleife ueber alle Zeilen des Bereichs 
  For iCntR = iCalRow To 1 Step -1 
    'Anzahl collectioneintraege in Variable speichern 
    iColI = colNumb.Count 
    'Schleife ueber alle Zellen des Bereiches 
    For Each Zellen In .Rows(iCntR).Cells 
      'Wenn nix in der Zelle steht, dann Schleife verlassen 
      'und weiter mit naechster Zeile 
      If Zellen.Value = "" Then Exit For 
      'Wenn der Farbindex <> keine Fuellung ist, dann Zahl uebernehmen 
      If Zellen.Interior.Color <> RGB(255, 204, 0) Then 
        'Bei Fehler weiter mit naechster Codezeile 
        On Error Resume Next 
          'Zahl hinzufuegen, Fehler, wenn schon enthalten 
          colNumb.Add Zellen.Value, CStr(Zellen.Value) 
          'Wenn kein Fehler, dann Zeilennummer merken 
          If Err = 0 Then colRows.Add iCntR 
        'Fehlerbehandlung Ende 
        On Error GoTo 0 
      'Oder Wenn der Farbindex = keine Fuellung ist, dann 
      Else 
        'offene hochzaehlen 
        cCount = cCount + 1 
        If iCalRow = debCnt Then Debug.Print iCalRow & vbTab & Zellen.Value & vbTab & Zellen.Address & " offen / farblos in O:Z" 
      End If 
    'Ende Schleife ueber alle Zellen des Bereiches 
    Next 
  'Ende Schleife ueber alle Zeilen des Bereichs 
  Next 
'Auszaehlen 
'Schleife ueber alle collectioneintraege 
For iColI = 1 To colNumb.Count 
  'Wenn Zeilennumer = 1, dann 
    'Wenn Zeile des Eintrags in O:Z in AM eingetragen ist, dann 
    'If WorksheetFunction.CountIf(Columns("AM"), colRows(iColI)) > 0 Then 
    If Cells(1, "AM") > 0 Then 
      'Startzeile = Eintrag 
      iRowF = colRows(iColI) 
    'Alternativ 
    Else 
      'Startzeile = 1 
      iRowF = 1 
    'Ende Wenn Zeile des Eintrags in O:Z in AM eingetragen ist, dann 
    End If 
    'Wenn Suchzahl nicht im Bereich ist, dann 
    If WorksheetFunction.CountIf(Range("D" & WorksheetFunction.Min(iRowF, iCalRow - 1) & ":I" & iCalRow - 1), colNumb(iColI)) = 0 Then 
      cCount = cCount + 1 
      If iCalRow = debCnt Then Debug.Print iCalRow & vbTab & colNumb(iColI) & vbTab & colRows(iColI) & " offen / fehlt im Bereich D:I" 
    'Alternativ zu Wenn Suchzahl nicht im Bereich ist, dann 
    Else 
      'Schleife ueber alle Zeilen 
      For iCntR = iCalRow - 1 To WorksheetFunction.Min(iRowF, iCalRow - 1) Step -1 
        'Treffervariable auf false setzen 
        bolTref = False 
        'Pruefzeile feststellen 
            'Schleife ueber die Eintraege der Zeile in Spalten D:I 
            'For iCntC = 4 To 9 
              'Wenn der Zelleninhalt der gesuchten Zahl entspricht und die Zelle eingefaerbt ist, dann 
              'If Cells(iCntR, iCntC).Value = colNumb(iColI) And Cells(iCntR, iCntC).Interior.ColorIndex <> xlNone Then 
              If InStr(1, colnumbers(iCntR), "#" & colNumb(iColI) & "#") > 0 Then 
               'Treffervariable auf true setzen 
                If iRowF <> iCalRow Then bolTref = True 
                If iCalRow = debCnt Then Debug.Print iCalRow & vbTab & colNumb(iColI) & vbTab & colRows(iColI) & vbTab & _
                  "Treffer in Zeile " & iCntR 
                  '"Treffer in " & Cells(iCntR, iCntC).Address 
                'Schleife verlassen 
                'Exit For 
              'Ende Wenn der Zelleninhalt der gesuchten Zahl entspricht und die Zelle eingefaerbt ist, dann 
              End If 
            'Ende Schleife ueber die Eintraege der Zeile in Spalten D:I 
            'Next 
          'Wenn Treffervariable true, dann Schleife verlassen 
          If bolTref = True Then Exit For 
        'Ende Schleife ueber alle Collectioneintraege 
        Next 
      'Wenn nix gefunden wurde, dann 
      If bolTref = False Then 
        'Offene-Zaehler hochsetzen 
        cCount = cCount + 1 
        If iCalRow = debCnt Then Debug.Print iCalRow & vbTab & colNumb(iColI) & vbTab & colRows(iColI) & " offen / farblos in D:I" 
      'Ende Wenn nix gefunden wurde, dann 
       End If 
    'Ende Wenn Suchzahl nicht im Bereich ist, dann 
    End If 
'Ende Schleife ueber alle collectioneintraege 
Next 
End With 
'Counter an Funktionswert geben 
CountColored4 = cCount 
End Function 
 
Sub AusZaehlen() 
'Variablendeklarationen 
'Long 
Dim iCnt&, lRow&, loStartTime& 
'Collection 
Dim colnumbers As Collection 
'Collection initialisieren 
Set colnumbers = New Collection 
'Startzeit uebernehmen 
loStartTime = GetTickCount 
'Spalte AN (40) Leeren 
Columns(40).ClearContents 
'letzte Zeile mit Eintraegen >0 feststellen 
lRow = WorksheetFunction.Max(Application.Evaluate("LOOKUP(2,1/(D1:D1000>0),ROW(D1:D1000))"), _
 Application.Evaluate("LOOKUP(2,1/(E1:E1000>0),ROW(E1:E1000))"), _
 Application.Evaluate("LOOKUP(2,1/(F1:F1000>0),ROW(F1:F1000))"), _
 Application.Evaluate("LOOKUP(2,1/(G1:G1000>0),ROW(G1:G1000))"), _
 Application.Evaluate("LOOKUP(2,1/(H1:H1000>0),ROW(H1:H1000))"), _
 Application.Evaluate("LOOKUP(2,1/(I1:I1000>0),ROW(I1:I1000))")) 
'Schleife bis zur letzten belegten Zeile <> 0 - Eintraege im Bereich D:I 
For iCnt = 1 To lRow 
  'Wenn mindestens 3 Zellen gefaerbt sind, dann 
  If CountColored(iCnt, colnumbers) >= 3 Then 
     'Wert fuer Spalte AN berechnen und eintragen 
     Cells(iCnt, 40) = CountColored4(iCnt, colnumbers) 
  'Ende Wenn mindestens 3 Zellen gefaerbt sind, dann 
  End If 
'Ende Schleife bis zur letzten belegten Zeile (anhend Spalte D (4)) im Bereich D:I 
Next 
'Meldung Laufzeit in Sekunden aus Differenz von Systemzeit 
'und Startzeit / 1000 
MsgBox "Laufzeit " & _
  (GetTickCount - loStartTime) / 1000 & " Sekunden.", _
    vbInformation, "Application.Wait Soll: 3 Sekunden" 
End Sub 
 
Public Function CountColored(ByVal lRow As Long, colnumbers As Collection) As Long 
'Variablendeklarationen 
Dim Zellen, cCount&, rngCells As Range, strNumbers$ 
'Rueckgabewert 0 zuweisen 
CountColored = 0 
'Zeilenbereich setzen 
Set rngCells = Cells(lRow, 4).Resize(1, 6) 
'Anfang des String fuer Collection # zuweisen 
strNumbers = "#" 
'wenn die Summe der Zeileneintraege gt. 0 ist, dann 
If WorksheetFunction.Sum(rngCells) > 0 Then 
  'Schleife ueber alle Zellen des Bereiches 
  For Each Zellen In rngCells 
    'Wenn der Farbindex <> keine Fuellung ist, dann 
    If Zellen.Interior.ColorIndex <> xlNone Then 
      'Counter hochzaehlen 
      cCount = cCount + 1 
      'Collection-Text erweitern 
      strNumbers = strNumbers & Zellen.Value & "#" 
    'Ende Wenn der Farbindex <> keine Fuellung ist, dann 
    End If 
  'Ende Schleife ueber alle Zellen des Bereiches 
  Next 
'Ende wenn die Summe der Zeileneintraege gt. 0 ist, dann 
End If 
'Collection erweitern 
colnumbers.Add strNumbers, CStr(lRow) 
'Counter an Funktionswert geben 
CountColored = cCount 
End Function 
 

.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • Angelina
Antworten Top
#92
hallo schauan,

sehr tolle Arbeit !

Habe es mal getestet - allerdings mit knapp über 700 Zeilen und
mit Veränderung dieser Zeile:

  'Wenn mindestens 3 Zellen gefaerbt sind, dann
  If CountColored(iCnt, colnumbers) >= 3 Then


da habe ich die 3 in 0 geschrieben
If CountColored(iCnt, colnumbers) >= 0 Then

War zwar nicht die Aufgabe, aber so kann ich die Geschwindigkeit besser tatsächlich messen.

Ich komme da auf ca. 31 Sekunden ... ja nicht 0,31 sondern auf 31 Sekunden.

Aber das >=0 war ja nicht die Aufgabe. Nur so mal zur Info.

Nochmals danke für deine tolle Arbeit!

LG
Angelina
Antworten Top
#93
Hallo Angelina,

kurze Zwischenfrage, darf man im Bereich AA:AL zusätzlich die Fundzeile für die gelben Zahlen reinschreiben, oder würde es Dein Konzept stören?
Da stehen ja bisher nur die Fundzeilen der grauen Zahlen.

Noch eine weitere Frage, gehe ich recht in der Annahme, dass der Code nie ausgeführt wird, wenn in AM1 kein Wert steht?

Zum Testen von Andres Code:
Das Testen mit >=0 macht meiner Meinung nach wenig Sinn, wenn überhaupt, dann mit >0. Könntest Du nicht so wie es ist noch einmal mal testen?
Am besten in der Datei, die uns auch zur Verfügung steht

@Andre
Andre nur kurz,später schreibe ich noch mal etwas dazu, ich hatte Deine zuletzt eingestellte Beispielmappe runter geladen und dort Deinen Code getestet.
Augenscheinlich waren es mehr als 5 Sekunden. Werde aber noch genaue Zahlen nachliefern.

Wenn in AM1 kein Wert steht, gehe ich davon aus, dass nichts gemacht wird, dazu habe ich Angelina ja befragt und ich gehe davon aus, dass sie meine Frage bejaht.

Dann brauch im bisher eingestellten Beispiel mit AM1 = 5 bis Zeile 19 grau gar nicht betrachtet werden.

Später melde ich mit mal mit Messergebnissen.
Gruß Atilla
Antworten Top
#94
hallo atilla,

Zitat:kurze Zwischenfrage, darf man im Bereich AA:AL zusätzlich die Fundzeile für die gelben Zahlen reinschreiben, oder würde es Dein Konzept stören?

Da stehen ja bisher nur die Fundzeilen der grauen Zahlen.

Kein Problem ... sehr gute Idee

Zitat:Zum Testen von Andres Code:
Das Testen mit >=0 macht meiner Meinung nach wenig Sinn, wenn überhaupt, dann mit >0. Könntest Du nicht so wie es ist noch einmal mal testen?
Am besten in der Datei, die uns auch zur Verfügung steht

'VBACode von Schauan
mit 700 Zeilen >=3 sind es bei mir: 3,198 Sekunden
mit 700 Zeilen >=0 sind es bei mir: 31 Sekunden

original Datei >=3 sind es bei mir: 0,281 Sekunden

LG
Angelina
Antworten Top
#95
Hallo Angelina,

danke für die Info.

Die Zweite Frage mit AM1 und Code ausführen ja oder nein steht offen.

Da es mit dem ergänzenden schreiben in AA:AL kein Problem ist, kann der Code noch einfacher uund schneller arbeiten.
Dazu müsse in XLPHAN's zwei Zeilen ergänzt werden.

Ich stell den überarbeiteten Code komplett ein, bitte in Deiner Datei austauschen:


Code:
Public Sub XLPHAN()

  Dim lngLetzteZeile As Long
  Dim lngSuchZeilenAnzahlMax As Long
 
  Dim rngSuchwert As Range
 
  Dim avntSuchwert() As Variant
  Dim iavntSuchwert1 As Long
  Dim iavntSuchwert2 As Long
 
  Dim rngDaten As Range
 
  Dim avntDaten() As Variant
  Dim iavntDaten1 As Long
  Dim iavntDaten2 As Long
 
  Dim vntSuchwert As Variant
 
  Dim avntErgebniswert() As Variant
 
  Dim blnFund As Boolean
 
  Dim rngFund As Range
  Dim rngDatenLastRow As Range

  With Sheets("Tabelle1")
      
      Intersect(.UsedRange, .Range("D:I")).Interior.ColorIndex = xlColorIndexNone
      Intersect(.UsedRange, .Range("O:Z")).Interior.Color = RGB(255, 204, 0)
      Intersect(.UsedRange, .Range("AA:AL")).ClearContents
     
      lngLetzteZeile = LetzteBeschriebeneZeile(.Range("D:AL"))
      If lngLetzteZeile = 0 Then Exit Sub
     
      lngSuchZeilenAnzahlMax = Val(.Range("AM1").Value)
      If lngSuchZeilenAnzahlMax = 0 Then Exit Sub
     
      Set rngDatenLastRow = Intersect(.Range("D:I"), .Rows(lngLetzteZeile))
      Set rngSuchwert = .Range("O1:Z" & lngLetzteZeile)
      avntSuchwert() = rngSuchwert.Value
             
      avntErgebniswert() = .Range("AA1:AL" & lngLetzteZeile).Value
     
      For iavntSuchwert1 = LBound(avntSuchwert, 1) To UBound(avntSuchwert, 1)
         
          Set rngDaten = .Range("D" & iavntSuchwert1).Resize(lngSuchZeilenAnzahlMax, 6)
       
          avntDaten() = rngDaten.Value
         
          For iavntSuchwert2 = LBound(avntSuchwert, 2) To UBound(avntSuchwert, 2)
             
              vntSuchwert = avntSuchwert(iavntSuchwert1, iavntSuchwert2)
             
              If Not IsEmpty(vntSuchwert) Then
             
                  For iavntDaten1 = LBound(avntDaten, 1) To UBound(avntDaten, 1)
                      For iavntDaten2 = LBound(avntDaten, 2) To UBound(avntDaten, 2)
                          If avntDaten(iavntDaten1, iavntDaten2) = vntSuchwert Then
                              avntErgebniswert(iavntSuchwert1, iavntSuchwert2) = iavntDaten1
                              blnFund = True: Exit For
                          End If
                      Next
                      If blnFund Then Exit For
                  Next
                 
                  If blnFund Then
                      rngSuchwert.Cells(iavntSuchwert1, iavntSuchwert2).Interior.Color = RGB(192, 192, 192)
                      rngDaten.Cells(iavntDaten1, iavntDaten2).Interior.Color = RGB(192, 192, 192)
                      blnFund = False
                  Else
                      Set rngFund = Range(rngDaten.Rows(1), rngDatenLastRow).Find(vntSuchwert, , xlValues, xlWhole)
                      If Not rngFund Is Nothing Then
                          If rngFund.Interior.Color <> RGB(192, 192, 192) Then
                              rngFund.Interior.Color = vbYellow
                              avntErgebniswert(iavntSuchwert1, iavntSuchwert2) = rngFund.Row  'Zeile hinzugekommen
                          End If
                         
                          rngSuchwert.Cells(iavntSuchwert1, iavntSuchwert2).Interior.Color = vbYellow
                      Else
                          avntErgebniswert(iavntSuchwert1, iavntSuchwert2) = 10000 + lngLetzteZeile 'Zeile hinzugekommen
                      End If
                  End If
                 
              End If
          Next
         
          Set rngDaten = Nothing
         
      Next
     
      .Range("AA1:AL" & lngLetzteZeile).Value = avntErgebniswert()
  End With
 
  Erase avntDaten
  Erase avntErgebniswert
  Erase avntSuchwert
 
  Set rngDatenLastRow = Nothing
  Set rngSuchwert = Nothing

End Sub

Public Function LetzteBeschriebeneZeile(ByRef rngBereich As Range) As Long
  On Error Resume Next
  LetzteBeschriebeneZeile = rngBereich.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End Function

Hinzugekommene Zeilen sind in Kommentaren kenntlich gemacht


Dann meinen Code mit folgendem austauschen:

Code:
Option Explicit
Public arr()
Dim lngMax As Long

Sub zählen_Ati()
  Dim lngLetzteZeile As Long, pp As Long, n As Long, lngP As Long, x
  Dim i As Long, j As Long
  Dim strgSammlung As String
  Dim vantQ As Variant
 
  Dim loStartTime As Long
  loStartTime = GetTickCount
 
  Application.ScreenUpdating = False
  zählen
  lngLetzteZeile = LetzteBeschriebeneZeile(Range("D:I"))
  vantQ = Range("O1:AL" & lngLetzteZeile)
 
  Columns("N").Font.ColorIndex = xlAutomatic
  For pp = 0 To lngMax - 1
  For i = 1 To arr(pp) + 1
    For j = 13 To 24
      If vantQ(i, j) < 6 Then
        If vantQ(i, j) - 1 + i > arr(pp) Or i = arr(pp) + 1 Then
          If InStr(1, strgSammlung, Format(vantQ(i, j - 12), "00"), vbTextCompare) = 0 Then strgSammlung = strgSammlung & "#" & Format(vantQ(i, j - 12), "00")
        End If
      Else
        If vantQ(i, j) > arr(pp) Then
          If InStr(1, strgSammlung, Format(vantQ(i, j - 12), "00"), vbTextCompare) = 0 Then strgSammlung = strgSammlung & "#" & Format(vantQ(i, j - 12), "00")
        End If
      End If
    Next j
  Next i
    If UBound(Split(strgSammlung, "#")) > 0 Then
      Cells(arr(pp) + 1, 40) = UBound(Split(strgSammlung, "#"))
      Cells(arr(pp) + 1, 14) = Replace(Join(Split(strgSammlung, "#"), ", "), ", ", "", 1, 1)
      For n = 1 To UBound(Split(strgSammlung, "#"))
        x = Application.Match(CDbl(Split(strgSammlung, "#")(n)), Range(Cells(arr(pp) + 1, 4), Cells(arr(pp) + 1, 9)), 0)
        If IsNumeric(x) Then
          lngP = n * 3 + n - 3
          Cells(arr(pp) + 1, 14).Characters(Start:=lngP, Length:=2).Font.ColorIndex = 3
        End If
      Next n
    Else
      Cells(arr(pp) + 1, 40) = 0
    End If
    strgSammlung = ""
  Next pp
  Erase arr
 
  Application.ScreenUpdating = True
 
MsgBox "Laufzeit " & _
  (GetTickCount - loStartTime) / 1000 & " Sekunden.", _
    vbInformation, "Application.Wait Soll: 3 Sekunden"
End Sub

Function zählen()

  Dim lngLetzteZeile As Long
  Dim i As Long, j As Long, k As Long, p As Long

  Dim vntFeld_M
  Dim vntFeld_A_O

  Columns("M:N").ClearContents
  Columns("AO").ClearContents
  lngLetzteZeile = LetzteBeschriebeneZeile(Range("D:I"))
  Range(Cells(1, 1), Cells(lngLetzteZeile, 3)).Interior.ColorIndex = xlColorIndexNone
  vntFeld_M = Range(Cells(1, 13), Cells(lngLetzteZeile, 13))
  vntFeld_A_O = Range(Cells(1, 41), Cells(lngLetzteZeile, 41))
  For i = 1 To lngLetzteZeile
    For j = 4 To 9
      If Cells(i, j).Interior.ColorIndex <> xlColorIndexNone Then
        k = k + 1
      End If
    Next j
    If k >= 3 Then
    ReDim Preserve arr(0 To p)
      arr(p) = i - 1
      p = p + 1
      Cells(i, 41) = k
      vntFeld_M(i, 1) = Application.Max(vntFeld_M) + 1
      Range(Cells(i, 1), Cells(i, 3)).Interior.ColorIndex = 3
    Else
      vntFeld_A_O(i, 1) = k
    End If
    k = 0
  Next i
  lngMax = Application.Max(vntFeld_M)
  Range(Cells(1, 13), Cells(lngLetzteZeile, 13)) = vntFeld_M
  Range(Cells(1, 41), Cells(lngLetzteZeile, 41)) = vntFeld_A_O
End Function

Public Function LetzteBeschriebeneZeile(ByRef rngBereich As Range) As Long
   On Error Resume Next
   LetzteBeschriebeneZeile = rngBereich.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End Function


Ich stelle die Zeilen mit mehr als 2 Farben Fest und danach vergleiche ich keine Farben mehr, sondern schau in AA:AL wann die Zahl auftaucht.



Mein Pc scheint nicht so stark auf der Brust zu sein.
System: i7, 8GB RAM, W8.1-64, Off2007-32

Das sind meine Testergebnisse:

Arbeitsblatt mit dem Namen 'Tabelle3'
 ABCDEF
1      
2 Ati altAti mittelaltAti jungSchauan altschauan jung
3ActiveX Steuerelement2,50,820,336,30,55
4wenn mit Schaltfläsche aus Steuerelememten gestartet2,50,82 - 0,810.3 -0,276,1 - 5,70,54 - 0,51
5Letzte Zeile 209 der Daten     
6      
7      
8Jung bedeudet der jüngste Code, welcher aber im größeren Alter geschrieben wurde, leider!!!     
9      
10Ati Jung ist gerade eingestellt     
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg

Angelina, wäre nett, wenn Du hierfür auch die Zeit mal im Original mitteilen würdest.
Zeitmessung ist im Code, kann auskommentiert werden.


Sehe gerade, dass Du zwischenzeitlich noch etwas mit einer neuen Frage gepostet hattest, sehe ich mir später genauer an, und melde mich.
Gruß Atilla
Antworten Top
#96
hallo atilla,

leider geht - mit dem neuen VBCode - bei mir für die Zeitmessung keine MsgBox auf.
Habe beide Teile von dir neu eingefügt.

Zitat:Die Zweite Frage mit AM1 und Code ausführen ja oder nein steht offen.
AM1 hat immer einen Wert

Dann ist mir mit dieser Version noch das aufgefallen - siehe Bild.
Im Bereich AA:AL hast du nun den Wert auch für die gelben eingetragen.
Jedoch diese Werte stimmen nicht!!!

Beispiel:
Zeile 22
gelbe 15
graue 39

Die graue 39 hat den Wert 3 ... das ist richtig ... ist in Zeile 24 gekommen
Die gelbe 15 hat den Wert 29 ... das ist falsch ... ist in Zeile 29 gekommen ... somit hätte sie eigentlich den Wert 8

[Bild: GelbeWerteInAA-AL.jpg?dl=0]
https://www.dropbox.com/s/puykhgymy0uuct...L.jpg?dl=0

Und in Spalte AN bekomme ich keine Werte mehr angezeigt !


LG
Angelina
Antworten Top
#97
Hallo Angelina,

mit der Zeitmessung klappte nicht, weil ich bei mir die Deklaration für die Funktion in einem anderen Modul als Public deklariert hatte
Du hättest unterhalb von Option Explicit diese Zeile ergänzen müssen:


Code:
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long


Spalte AN wurde verkappt gefüllt, da hast du recht.

Bei den Werten in AA:AL für gelb hatte ich die Zeilenzahl eintragen lassen unabhängig vom AM1 Wert.

Man kann es aber auch so, wie Du es haben möchtest.

Das habe ich jetzt mit folgenden Codes alles realisiert:



Code:
Public Sub XLPHAN()

 Dim lngLetzteZeile As Long
 Dim lngSuchZeilenAnzahlMax As Long

 Dim rngSuchwert As Range

 Dim avntSuchwert() As Variant
 Dim iavntSuchwert1 As Long
 Dim iavntSuchwert2 As Long

 Dim rngDaten As Range

 Dim avntDaten() As Variant
 Dim iavntDaten1 As Long
 Dim iavntDaten2 As Long

 Dim vntSuchwert As Variant

 Dim avntErgebniswert() As Variant

 Dim blnFund As Boolean

 Dim rngFund As Range
 Dim rngDatenLastRow As Range

 With Sheets("Tabelle1")
     
     Intersect(.UsedRange, .Range("D:I")).Interior.ColorIndex = xlColorIndexNone
     Intersect(.UsedRange, .Range("O:Z")).Interior.Color = RGB(255, 204, 0)
     Intersect(.UsedRange, .Range("AA:AL")).ClearContents
   
     lngLetzteZeile = LetzteBeschriebeneZeile(.Range("D:AL"))
     If lngLetzteZeile = 0 Then Exit Sub
   
     lngSuchZeilenAnzahlMax = Val(.Range("AM1").Value)
     If lngSuchZeilenAnzahlMax = 0 Then Exit Sub
   
     Set rngDatenLastRow = Intersect(.Range("D:I"), .Rows(lngLetzteZeile))
     Set rngSuchwert = .Range("O1:Z" & lngLetzteZeile)
     avntSuchwert() = rngSuchwert.Value
           
     avntErgebniswert() = .Range("AA1:AL" & lngLetzteZeile).Value
   
     For iavntSuchwert1 = LBound(avntSuchwert, 1) To UBound(avntSuchwert, 1)
       
         Set rngDaten = .Range("D" & iavntSuchwert1).Resize(lngSuchZeilenAnzahlMax, 6)
     
         avntDaten() = rngDaten.Value
       
         For iavntSuchwert2 = LBound(avntSuchwert, 2) To UBound(avntSuchwert, 2)
           
             vntSuchwert = avntSuchwert(iavntSuchwert1, iavntSuchwert2)
           
             If Not IsEmpty(vntSuchwert) Then
           
                 For iavntDaten1 = LBound(avntDaten, 1) To UBound(avntDaten, 1)
                     For iavntDaten2 = LBound(avntDaten, 2) To UBound(avntDaten, 2)
                         If avntDaten(iavntDaten1, iavntDaten2) = vntSuchwert Then
                             avntErgebniswert(iavntSuchwert1, iavntSuchwert2) = iavntDaten1
                             blnFund = True: Exit For
                         End If
                     Next
                     If blnFund Then Exit For
                 Next
               
                 If blnFund Then
                     rngSuchwert.Cells(iavntSuchwert1, iavntSuchwert2).Interior.Color = RGB(192, 192, 192)
                     rngDaten.Cells(iavntDaten1, iavntDaten2).Interior.Color = RGB(192, 192, 192)
                     blnFund = False
                 Else
                     Set rngFund = Range(rngDaten.Rows(1), rngDatenLastRow).Find(vntSuchwert, , xlValues, xlWhole)
                     If Not rngFund Is Nothing Then
                         If rngFund.Interior.Color <> RGB(192, 192, 192) Then
                             rngFund.Interior.Color = vbYellow
                             avntErgebniswert(iavntSuchwert1, iavntSuchwert2) = rngFund.Row - iavntSuchwert1 + 1 ' + lngSuchZeilenAnzahlMax 'Zeile hinzugekommen
                         End If
                       
                         rngSuchwert.Cells(iavntSuchwert1, iavntSuchwert2).Interior.Color = vbYellow
                     Else
                         avntErgebniswert(iavntSuchwert1, iavntSuchwert2) = 10000 + lngLetzteZeile 'Zeile hinzugekommen
                     End If
                 End If
               
             End If
         Next
       
         Set rngDaten = Nothing
       
     Next
   
     .Range("AA1:AL" & lngLetzteZeile).Value = avntErgebniswert()
 End With

 Erase avntDaten
 Erase avntErgebniswert
 Erase avntSuchwert

 Set rngDatenLastRow = Nothing
 Set rngSuchwert = Nothing

End Sub

Public Function LetzteBeschriebeneZeile(ByRef rngBereich As Range) As Long
 On Error Resume Next
 LetzteBeschriebeneZeile = rngBereich.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End Function


Code:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Public arr()
Dim lngMax As Long

Sub zählen_Ati()
 Dim lngLetzteZeile As Long, pp As Long, n As Long, lngP As Long, x
 Dim i As Long, j As Long
 Dim strgSammlung As String
 Dim vantQ As Variant
 
 Dim loStartTime As Long
 loStartTime = GetTickCount
 
 Application.ScreenUpdating = False
 zählen
 lngLetzteZeile = LetzteBeschriebeneZeile(Range("D:I"))
 vantQ = Range("O1:AL" & lngLetzteZeile)
 
 Columns("N").Font.ColorIndex = xlAutomatic
 For pp = 0 To lngMax - 1
 For i = 1 To arr(pp) + 1
   For j = 13 To 24
     If vantQ(i, j) < 6 Then
       If vantQ(i, j) - 1 + i > arr(pp) Or i = arr(pp) + 1 Then
         If InStr(1, strgSammlung, Format(vantQ(i, j - 12), "00"), vbTextCompare) = 0 Then strgSammlung = strgSammlung & "#" & Format(vantQ(i, j - 12), "00")
       End If
     Else
       If vantQ(i, j) + i - 1 > arr(pp) Then
         If InStr(1, strgSammlung, Format(vantQ(i, j - 12), "00"), vbTextCompare) = 0 Then strgSammlung = strgSammlung & "#" & Format(vantQ(i, j - 12), "00")
       End If
     End If
   Next j
 Next i
   If UBound(Split(strgSammlung, "#")) > 0 Then
     Cells(arr(pp) + 1, 40) = UBound(Split(strgSammlung, "#"))
     Cells(arr(pp) + 1, 14) = Replace(Join(Split(strgSammlung, "#"), ", "), ", ", "", 1, 1)
     For n = 1 To UBound(Split(strgSammlung, "#"))
       x = Application.Match(CDbl(Split(strgSammlung, "#")(n)), Range(Cells(arr(pp) + 1, 4), Cells(arr(pp) + 1, 9)), 0)
       If IsNumeric(x) Then
         lngP = n * 3 + n - 3
         Cells(arr(pp) + 1, 14).Characters(Start:=lngP, Length:=2).Font.ColorIndex = 3
       End If
     Next n
   Else
     Cells(arr(pp) + 1, 40) = 0
   End If
   strgSammlung = ""
 Next pp
 Erase arr
 
 Application.ScreenUpdating = True
 
MsgBox "Laufzeit " & _
 (GetTickCount - loStartTime) / 1000 & " Sekunden.", _
   vbInformation, "Application.Wait Soll: 3 Sekunden"
End Sub

Function zählen()

 Dim lngLetzteZeile As Long
 Dim i As Long, j As Long, k As Long, p As Long

 Dim vntFeld_M
 Dim vntFeld_A_O

 Columns("M:N").ClearContents
 Columns("AO").ClearContents
 lngLetzteZeile = LetzteBeschriebeneZeile(Range("D:I"))
 Range(Cells(1, 1), Cells(lngLetzteZeile, 3)).Interior.ColorIndex = xlColorIndexNone
 vntFeld_M = Range(Cells(1, 13), Cells(lngLetzteZeile, 13))
 vntFeld_A_O = Range(Cells(1, 41), Cells(lngLetzteZeile, 41))
 For i = 1 To lngLetzteZeile
   For j = 4 To 9
     If Cells(i, j).Interior.ColorIndex <> xlColorIndexNone Then
       k = k + 1
     End If
   Next j
   If k >= 3 Then
   ReDim Preserve arr(0 To p)
     arr(p) = i - 1
     p = p + 1
     vntFeld_M(i, 1) = Application.Max(vntFeld_M) + 1
     Range(Cells(i, 1), Cells(i, 3)).Interior.ColorIndex = 3
   End If
   vntFeld_A_O(i, 1) = k
   k = 0
 Next i
 lngMax = Application.Max(vntFeld_M)
 Range(Cells(1, 13), Cells(lngLetzteZeile, 13)) = vntFeld_M
 Range(Cells(1, 41), Cells(lngLetzteZeile, 41)) = vntFeld_A_O
End Function

Public Function LetzteBeschriebeneZeile(ByRef rngBereich As Range) As Long
  On Error Resume Next
  LetzteBeschriebeneZeile = rngBereich.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End Function

Wo die einzelnen Codes hinkommen weißt Du ja.


Zu Deiner weiteren Anfrage muss ich gestehen, dass ich es nicht verstanden habe.
Kannst Du es mit den mir vorliegenden Daten und mit Ergebnissen noch einmal versuchen zu erklären.
Aber mathematische Fachbegriffe kannst Du von mir auch nicht erwarten.
Gruß Atilla
Antworten Top
#98
hallo atilla,

auch mit dem neuen VBCode kommt bei mir keine MsgBox.

Spalte N fehlt die Auflistung der Zahlen ... die du mal eingefügt hast.



LG
Angelina
Antworten Top
#99
Hallo Angelina,

kann ich leider nicht nachvollziehen:

so sieht es bei mir nach Codedurchlauf aus:

Arbeitsblatt mit dem Namen 'Tabelle1'
 ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKALAMANAO
22440M18.03.2015612232540460426427  1539          83            1
23441S21.03.20153451930410427428113, 14, 26, 24, 44, 35, 30, 02, 19, 04, 10, 32, 15, 39                        14143
24442M25.03.20151316192739480428429  5           8             2
25443S28.03.201567262730460429430  13           13             1
26444M01.04.2015716222932380430431  26           11             1
27445S04.04.20151220232834430431432  29           4             0
28446M08.04.20151420374144470432433214, 24, 44, 35, 02, 10, 15, 05, 13, 26, 29, 34, 473447          51          13133
29447S11.04.2015211153646470433434324, 35, 02, 10, 15, 05, 13, 26, 29, 34, 14, 37, 44, 4714374447        2231        14143
30448M15.04.20151429333739460434435424, 35, 10, 05, 13, 26, 29, 34, 14, 37, 44, 1111           3           12123
31449S18.04.201535141739440435436  33           10             2
32450M22.04.2015411212234350436437524, 35, 10, 13, 26, 34, 11, 33, 1717           22           993
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg


Du musst auf jeden Fall einmal den Code von XLPHAN ausgeführt haben.

Zeitmessung funktioniert bei mir auch.

Tausch mal in der  Zeile:

Code:
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long


das Private mit Public.
Gruß Atilla
Antworten Top
hallo atilla,

schaue selbst ... geht nicht !

Der eine CommandB ist der von Schauan ... der andere von dir!



LG
Angelina


Angehängte Dateien
.xls   Original-SuchZahlen-Schritt2-23-03-2016-schauan.xls (Größe: 164,5 KB / Downloads: 4)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste