2 Spalten vergleichen automatisch!

  • Excel

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    2 Spalten vergleichen automatisch!

    Hallo zusammen,
    ich bin leider ein Neuling wenn es um das Thema VBA geht.
    Vielleicht könnt ihr mir helfen.

    In meiner Tabelle habe ich Spalte A und Spalte B (Die ersten 3 Zeilen sind uninterestant dort steht nur die Bennennung)
    In der Spalte A kann 1 oder 0 stehen (muss auch über VBA eingeschränkt werden) in der Zeile B genau das selbe wie in Spalte A.
    Wenn jemand jetzt in Spalte A und B eine 0 einträgt muss das Feld Rot markiert werden.

    Bekommt man das mit VBA hin?

    Gruß
    Rüdiger
    Das sind alles Dinge, die Excel an Bord hat.
    Das eine mittels "Datenüberprüfung" (Ganze Zahl zwischen 0 und 1), das andere über "Bedingte Formatierung".

    Da braucht man kein VBA.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Hier jetzt noch einmal etwas genauer

    Hallo zusammen,
    Ich habe mir eine Excel Tabelle erstellt und möchte gern über VBA ein paar Regeln einprogrammieren. Über die Normalen Regeln funktoniert es leider nicht da man dort keine Spalten selektieren kann. Cielleicht findet sich hier jemand der ein wenig mehr Ahnung hat?

    Also ich habe einen Tabreiter (Regal Standard):
    Dort werden die Standard Werte eines Regals festgelegt.
    z.B. ein Holz Regal mit der Farbe schwarz darf 20 - 500cm breit sein und die Tiefe darf 10 - 65cm betragen. Standard wäre jetzt 50cm breit und 60cm tief.

    Auf dem zweiten Tabreiter (Regal Kunde):
    Dort werden für jeden Kunden die speziefischen Werte hinterlegt.
    Also wenn ein Kunde immer das schwarze Regal in 200cm breit und 50cm tief bestellt.

    Jetzt kommen wir zur VBA programmierung:
    Die Breite und die Tiefe die der Kunde einträgt muss zwischen den Min/Max Werten auf dem Tabreiter "Regal Standard" liegen wenn nicht soll das Feld rot makiert werden.

    Vielleicht kennt sich jemand damit aus?
    Ich häng mal meine Liste mit an.
    Dateien
    • Test.xlsx

      (11,13 kB, 225 mal heruntergeladen, zuletzt: )
    Welchen Teil im Code verstehst du nicht?
    Stell einfach (spezifische) Fragen, dann kriegen wir das geklärt.

    Vielleicht reicht's ja schon, wenn du im Worksheet_Change einen Breakpoint setzt, eine Zelle veränderst und dann mit F8 zeilenwiese durchdebuggst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Dim r As Long
    // Was passiert hier?
    For r = 3 To Cells(Rows.Count, 2).End(xlUp).Row
    //sagst du ihm hiermit, dass der Typ gleich ist und die farbe auch??
    If Cells(r, 2).Value = Typ Then
    If Cells(r, 3).Value = Farbe Then
    //Hier werden die min Max Werte verglichen?
    BreiteOK = Breite >= Cells(r, 5).Value And Breite <= Cells(r, 6).Value

    Visual Basic-Quellcode

    1. ​For r = 3 To Cells(Rows.Count, 2).End(xlUp).Row ' hier geht er durch alle Zeilen durch (von der dritten bis zur letzten in Spalte 2 befüllten)
    2. If Cells(r, 2).Value = Typ Then 'wenn in Spalte 2 der übergebene Typ übereinstimmt.
    3. If Cells(r, 3).Value = Farbe Then 'wenn in Spalte 3 die übergebene Farbe übereinstimmt
    4. BreiteOK = Breite >= Cells(r, 5).Value And Breite <= Cells(r, 6).Value 'setzt den Returnwert der Funktion (BreiteOK) auf True, wenn die übergebene Breite innerhalb der Werte in Spalten 5-6 liegt
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Du solltest vielleicht verifizieren, dass der Code objektorientiert aufgebaut ist.
    Im Sheet Kunden wird die Eingabe getriggert (Worksheet_Change).
    Im Sheet Standard ist die Prüffunktion auf BreiteOK bzw TiefeOK
    Die Prüffunktionen werden aus dem Kunden-Sheet aufgerufen und dabei die entsprechenden Parameter übergeben.

    McSniper92 schrieb:

    warum nutzt du Property und keine Sub?
    Eine Sub hat keinen Rückgabewert, wäre also hier fehl am Platz.
    Man hätte aber durchaus auch eine Function daraus machen können.
    Warum ich eine Property und keine Function nahm, hat eher philosophische Bedeutung.
    Die Funktion ist ohne das Sheet und dessen Objekte nicht lauffähig, weshalb es eine Eigenschaft des Sheet ist und keine allgemeine Funktion.

    Tu dir den Gefallen und setze in der Routine Worksheet_Change (im Sheet Kunde) einen Breakpoint, ändere einen Wert und gehe im Singlestep durch den Code, damit du die Wirkungsweise verstehst.
    Betrachte dabei die verwendeten Variablen und Übergabeparameter.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vorab: Dein Code wäre einfacher zu lesen, wenn du VB-Tags verwenden würdest.

    McSniper92 schrieb:

    //Ich habe nur die Spalte M und nicht die Range M:N ist das egal?
    Das ist einfach eine Vorauswahl, welche Bereiche du bei einer Änderung überhaupt behandeln willst.
    Weiter unten selektierst du ja speziell noch auf Spalte 13.
    Wenn du mehrere Spalten hast, kannst du auch Range("M:M,X:X") angeben.

    McSniper92 schrieb:

    //Die 5: steht dafür das die 5 Zeile erst die Infos enthält?
    ja

    McSniper92 schrieb:

    // hier sage ich das er die Spalte 13 wo er das Feld Rot oder weiß färbt.
    // Er soll Sheet4 vergleichen mit Spalte 3,5 und 8
    If Cell.Column = 13 Then Cell.Interior.Color = IIf(Sheet4.Alarm1(Cells(Cell.Row, 3).Value, Cells(Cell.Row, 5).Value, Cells(Cell.Row, 8).Value, Cell.Value), White, Red)
    müsste passen.
    Dem Sheet4 würde ich allerdings einen sprechenden Objektnamen geben (der Lesbarkeit halber).

    Wenn du mal dein Workbook hoch lädst, kann ich mal reinschauen.
    In der Theorie ist es ein wenig schwer nachzuvollziehen.

    Edit:
    Jetzt hast du den relevanten Post leider tot editiert.
    Damit hängen meine Ausführungen in der Luft.
    Bitte in solchen Fällen nicht einfach löschen, sondern durchstreichen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Ich habe noch eine Frage zu diesem Thema.
    Sorry das ich den anderen Beitrag bearbeitet habe.
    Dein Beitrag wurde geschrieben und in der Zeit habe ich das Bearbeitet ganz blöder Zufall.

    Wie kann ich eine MsgBox machen die nur erscheint wenn der Wert nicht im Min Max Bereich liegt. In der Box sollen die Min Max Werte für die Zelle angezeigt werden.

    Meine Programmierung klappt nur wenn kein Filter gesetzt ist.
    Und hinter deine Schleife bekomm ich die MSG Box nicht.

    McSniper92 schrieb:

    Wie kann ich eine MsgBox machen die nur erscheint wenn der Wert nicht im Min Max Bereich liegt
    Ohne deinen Code ist das schwer zu erklären.
    In meinem Beispiel müsstest du BreiteOK so erweitern, dass es dir auch die Grenzen zurück gibt (ByRef).

    Visual Basic-Quellcode

    1. ​Property Get BreiteOK(ByVal Typ As String, ByVal Farbe As String, ByVal Breite As Double, Optional ByRef MinValue As Double, Optional ByRef MaxValue As Double) As Boolean
    2. Dim r As Long
    3. For r = 3 To Cells(Rows.Count, 2).End(xlUp).Row
    4. If Cells(r, 2).Value = Typ Then
    5. If Cells(r, 3).Value = Farbe Then
    6. MinValue = Cells(r, 5).Value
    7. MaxValue = Cells(r, 6).Value
    8. BreiteOK = Breite >= MinValue And Breite <= MaxValue
    9. Exit Property
    10. End If
    11. End If
    12. Next
    13. End Property

    Dann kannst du beim Aufruf in etwa so agieren:

    Visual Basic-Quellcode

    1. ​Ok = Standard.BreiteOK(Cells(Cell.Row, 3).Value, Cells(Cell.Row, 4).Value, Cell.Value, MinValue, MaxValue)
    2. If Ok Then
    3. Cell.Interior.Color = White
    4. Else
    5. Cell.Interior.Color = Red
    6. MsgBox "invalid value range. Cell=" & Cell.Address & " MinValue=" & MinValue & " MaxValue=" & MaxValue
    7. End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wie soll ich das denn in den Code vom letzten mal rein bekommen?

    ​Ok = Standard.BreiteOK(Cells(Cell.Row, 3).Value, Cells(Cell.Row, 4).Value, Cell.Value, MinValue, MaxValue)
    If Ok Then
    Cell.Interior.Color = White
    Else
    Cell.Interior.Color = Red
    MsgBox "invalid value range. Cell=" & Cell.Address & " MinValue=" & MinValue & " MaxValue=" & MaxValue
    End If

    er sagt das eine Variable nicht definiert ist :-O