Wie erhalte ich die Zeilennummer, wenn ich über ein Array Werte vergleiche.

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von joerg_W.

    Wie erhalte ich die Zeilennummer, wenn ich über ein Array Werte vergleiche.

    Liebe VB-Paradise User,

    ich stehe mal wieder vor einer Frage für die mir mittlerweile keine Lösung einfällt

    In Spalte "D" habe ich eine Liste von Datumswerten. Diese Liste lese ich in ein Array ein und vergleiche im nächsten Schritt, ob das Datum aus dem Array größer ist als der "Datumswert -7 Tage". An sich funktioniert dies wunderbar.
    Nun möchte ich aber, dass mir dann, wenn ein solcher Fall gefunden wird mir die Zeilennummer ausgegeben wird, in dem dieser Fall eintritt. Im Anschluss möchte ich nämlich hieraus eine weitere Variable aus anderen Zellen, die in dieser Zeile sind basteln.
    Ich hoffe, Ihr habt eine Idee und schon mal vielen Dank für Eure Mühen.

    Schöne Grüße

    Jörg

    Hier ein Testversuch:

    Sub neuer_test()

    Dim Date_Changed As Variant
    Dim Datum_Vorwoche As Variant
    Dim AnzZeilen As Variant

    Datum_Vorwoche = Format(Now - 30, "yyyy-mm-dd")

    Set zeilen = Sheets("Tabelle1")

    AnzZeilen = zeilen.UsedRange.SpecialCells(xlCellTypeLastCell).Row

    Date_Changed = zeilen.Range("d3:d" & AnzZeilen).Value

    For i = 1 To AnzZeilen

    If Date_Changed(i, 1) > Datum_Vorwoche Then

    MsgBox Date_Changed(i, 1) & " / " & Datum

    'MsgBox Date_Changed(i, 1).Address 'klappt nicht

    ElseIf Date_Changed(i, 1) = "" Then

    End If

    Next i

    End Sub
    Du hast Date_Changed einen Wert zugewiesen. Ich denke es geht deshalb nicht.

    Ansonsten würde ich mir die Addresse einfach mit Cells(i + 'x-Zeilen', 4).Address ausweisen lassen. Deine For next Schleife beginnt mit 1 und entsprechend der Zeile, in der Dein erstes Datum steht aufaddieren -> bei D3 wäre es dann Cells(i + 2, 4).Address

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „cry.baby“ ()

    Hallo cry.baby,

    vielen Dank für deine schnelle Hilfe.

    Aber ich verstehe nicht was du meinst :) - ich sitze gerade irgendwie auf dem Schlauch. Soll ich jetzt das komplette Array sein lassen und nur mit dem aufaddieren von Zeilen weitermachen. Aber ich muss doch die Infos, in welcher Zeile die Bedingung erfüllt ist, in ein Array bringen, damit ich später hieraus meine zweiten Variablen bilden kann. Ziel soll sein, dass zum Schluss in einer Mail steht: "Die Veränderungen zur Vorwoche sind auf folgende Aufträge zurückzuführen: " & kommen eben nur die Aufträge, die in der letzten Woche eingegeben wurden.
    Wie gesagt, ich stehe gerade irgendwie auf dem Schlauch.

    Vielleicht kannst du mir dein Vorgehen noch einmal erklären.

    Vielen Dank

    Jörg
    Mein Code würde so aussehen:

    Visual Basic-Quellcode

    1. Sub neuer_test()
    2. Dim Date_Changed () As Variant
    3. Dim Datum_Vorwoche As Variant
    4. Datum_Vorwoche = Format(Now - 30, "yyyy-mm-dd")
    5. Set zeilen = Sheets("Tabelle1")
    6. Date_Changed = zeilen.Range("D3", Range("D3").end(xldown))
    7. For i = 1 To Ubound(Date_Changed)
    8. If Date_Changed(i, 1) > Datum_Vorwoche Then
    9. MsgBox Date_Changed(i, 1) & " / " & Datum
    10. 'MsgBox Date_Changed(i, 1).Address 'klappt nicht
    11. MsgBox Cells(i + 2, 4).Address
    12. ElseIf Date_Changed(i, 1) = "" Then
    13. End If
    14. Next i
    15. End Sub
    Ich verstehe nur nicht, weshalb man die Daten mühevoll in ein Array kopieren sollte.

    Visual Basic-Quellcode

    1. Dim c As Range
    2. CompareDate = Format(Now - 30, "yyyy-mm-dd")
    3. For Each c in Intersect(UsedRange, Range("D:D"))
    4. If c.Value > CompareDate Then
    5. MsgBox c.Address
    6. Endif
    7. Next
    Macht dasselbe und ist einiges kürzer.

    Wieso stehen die Datumsstempel überhaupt als String im Format yyyy-mm-dd in den Zellen?
    Sind das keine Date-Zellen, die nur so angezeigt werden?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    *unnötiges Zitat entfernt*

    Update: habe Deinen Code oben ausprobiert -> leider funktioniert er nicht.

    Frage (wenn die Methode denn so funktioniert); Mit der For each-Schleife und Intersect(UsedRange, Range("D:D")) spart man sich somit zwei Arbeitsschritte:
    1. Dim ... as Range
    2. Set Range = ...

    Right? Was sind die Drawbacks von dieser Methode, wenn es denn welche gibt?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    cry.baby schrieb:

    leider funktioniert er nicht.
    Was funktioniert nicht?
    Vielleicht liegt es ja daran, dass du dir über meine Frage noch keine Gedanken gemacht hast:

    petaod schrieb:

    Wieso stehen die Datumsstempel überhaupt als String im Format yyyy-mm-dd in den Zellen?
    Sind das keine Date-Zellen, die nur so angezeigt werden?
    Edit: Oder es liegt daran, dass der Code in irgendeinem Modul steht und nicht im Codebereiche des Arbeitsblattes.
    Da müsstest du die beiden Ranges natürlich explizit angeben ​Tabelle1.UsedRange, Tabelle1.Range("D:D").
    Wenn's das ist, Sorry. Ich arbeite immer objektorientiert und komme nicht auf die Idee, Code in Module zu verfrachten, wenn er ins Objekt gehört.



    cry.baby schrieb:

    spart man sich somit zwei Arbeitsschritte:
    1. Dim ... as Range
    2. Set Range = ...
    Set Range wäre tödlich. Range ist ein Datentyp, keine Variable.
    Was man sich spart, ist das kopieren einer relativ umfangreichen Datenstruktur in das Array Date_Changed.
    Man arbeitet direkt auf der Orignal-Excel-Struktur anstatt sie zu duplizieren und auf der Kopie zu arbeiten.

    cry.baby schrieb:

    Was sind die Drawbacks von dieser Methode
    Bei meiner Methode sehe ich keine Nachteile, bei deiner einen unnötigen Ressourcen-Verbrauch.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    @petaod; ich habe die Intersect-Methode tatsächlich über ein Modul ausgeführt und nicht über das Arbeitsblatt. Jetzt funktioniert es und somit ist Dein Code natürlich viel kürzer und schöner.

    'Set Range' is natürlich auch quatsch - ich wollte nur ausdrücken, dass ich den "Bereich" oder eben die "Range" nicht festlegen muss.

    Danke für die Hinweise und die neue Methode Meister. Ich habe wieder etwas von Euch gelernt! :thumbsup: - Verbeug -
    Hallo petaod,
    hallo cry.baby,

    vielen, vielen Dank für Eure Hilfe. Ich kann mich cry.baby nur anschließen - ich habe durch euch viel gelernt.

    Habe jetzt den Code von petaod verwendet und es läuft alles wunderbar.

    Wünsche euch noch eine schöne Woche.

    Liebe Grüße

    Jörg