Clever-Excel-Forum

Normale Version: Logikprüfung mit Msgbox Prüfung Zelle in aktueller Zeile
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Liebe Comunity!

Könnt ihr mir bitte helfen betreffend einer allgemeinen VBA-Logikprüfung?

Wenn z.B. in der aktiven Zeile in einer bestimmten Zelle kein Wert steht, dass eine MsgBox mit dem Hinweis "Bitte erst vollständiges Ausmaß eingeben!".

Eine kleine Exceldatei diesem Post angehängt!

Vielen Dank für eure Unterstützung!

Christian

PS: Weiß jemand, ob Office365 auf IOs (Nicht die Gratis-Version) vollständig VBA-Fähig ist. Lt. Google laufen ActiveX-Elemente... Bedeutet dies eine vollwertige VBA-Lauffähigkeit?
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Const RG_WATCH = "D6:D11"
Dim rgWatch As Range

   Set rgWatch = Tabelle1.Range(RG_WATCH)
   If Target.Cells.Count > 1 Then Exit Sub
   If Intersect(rgWatch, Target) Is Nothing Then Exit Sub
   
   If Target.Value2 = "x" Then
       If Len(Target.Offset(0, -2)) = 0 Then
           MsgBox "Bitte vollständiges Mass eingeben!", vbCritical + vbOKOnly, "Fehlende Daten"
       End If
   End If
   
End Sub
Das in das Klassenmodul der Tabelle.
Das setzt Deine Anfoderung um, mehr nicht. Es wird nicht geprüft, ob die Eingabe überhaupt ein "Mass" ist. Negative Werte oder Text ist also erlaubt. Es wird auch nicht die EIngabe von "x" unterdrückt.
Hallo

@Storax   schöner Code, ich habe mir erlaubt ihn ein wenig umzuschreiben.  der Original Code bezieht sich auf den Bereich:  Const RG_WATCH = "D6:D11"

Das erschien mir für die Praxis zu gering, in meiner Version gibt es keine Zeilen Begrenzung nach unten. Ausserdem wird nur die Breite geprüft, es kann aber auch die Laenge fehlen!
Wenn man feststellt es fehlt was kann man den Wert auch gleich mit einer InputBox abfragen und direkt als Wert einfügen.  Es ist aber der Code von Storax!

mfg  Gast 123  

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Wert As Double

  If Target.Row < 6 Then Exit Sub
  If Target.Column <> 4 Then Exit Sub
  If Target.Cells.Count > 1 Then Exit Sub
 
  If Target.Value2 = "x" Then
     If Target.Offset(0, -3) = Empty Then
        Wert = InputBox("Bitte vollständige Länge eingeben!")
        If IsNumeric(Wert) Then Target.Offset(0, -3) = Wert
     End If
     
     If Target.Offset(0, -2) = Empty Then
        Wert = InputBox("Bitte vollständige Breite eingeben!")
        If IsNumeric(Wert) Then Target.Offset(0, -2) = Wert
     End If
  End If
End Sub
Hallo,

die Eingaben finden in der Tabelle statt.
Vielleicht hat man in den Eingabe zellen auch noch Datengültigkeitsprüfungen, wäre empfehlenswert.
Man braucht nämlich dann nicht eventuell per Code prüfen ob die Eingabe eine Zahl ist.

Theoretisch kann man auch in Spalte D eine Datengültigkeitsprüfung einsetzen. Mit ihr kann eine Eingabe verhindert werden,
solange die Zellen vorher nicht gefüllt sind.

Wenn ich es per Code machen würde, dann würde ich in Storax Code nur eine Zeile ergenzen.
Nach der Meldung würde ich die Zeile noch einbauen:

Code:
   Target.Offset(0, -2).Select

Das ist meiner Meinung nach hifreicher als noch eine Inputbox aufgehen zu lassen.

Im Ganzen würde der Code dann so aussehen:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim rgWatch As Range

  Set rgWatch = Tabelle1.Range("D6:D11")
  If Target.Cells.Count > 1 Then Exit Sub
  If Intersect(rgWatch, Target) Is Nothing Then Exit Sub
 
  If Target.Value2 = "x" Then
      If Len(Target.Offset(0, -2)) = 0 Then
          MsgBox "Bitte vollständiges Mass eingeben!", vbCritical + vbOKOnly, "Fehlende Daten"
          Target.Offset(0, -2).Select
      End If
  End If
 
End Sub


und wenn die Länge auch noch geprüft werden soll, dann ginge es auch so:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
Dim rgWatch As Range

  Set rgWatch = Tabelle1.Range("D6:D11")
  If Target.Cells.Count > 1 Then Exit Sub
  If Intersect(rgWatch, Target) Is Nothing Then Exit Sub
 
  If Target.Value2 = "x" Then
      If Len(Target.Offset(0, -2)) = 0 Or Len(Target.Offset(0, -3)) = 0 Then
          MsgBox "Bitte vollständiges Mass eingeben!", vbCritical + vbOKOnly, "Fehlende Daten"
          i = IIf(Len(Target.Offset(0, -3)) = 0, -3, -2)
          Target.Offset(0, i).Select
      End If
  End If
 
End Sub

Ich hoffe mein Vorschlag bringt Licht ins Dunkel.
Moin!
Nur ein ergänzender Hinweis:
Seit nunmehr 10 Jahren sollte man bei einem Worksheet_Change auf .CountLarge prüfen.
Ein .Count kann zu einem unexpected Error führen (LZF 6, Überlauf).

Two Cents,
Ralf
Zitat:Seit nunmehr 10 Jahren sollte man bei einem Worksheet_Change auf .CountLarge prüfen.

Ups, sorry, da hast Du natürlich Recht. Vergesse ich immer gerne :s
Da hilft auch nicht, dass das schon seit 10 Jahren so ist :22:
Mein einzige Ausrede ist, dass
i) Intellisense zuerst Count anbietet. Ok, direkt danach Countlarge ...
ii) ich wollte euch was zu meckern geben :19:
Danke Freunde!

Danke für eure Rückmeldungen! Sorry das ich mich erst jetzt melde! Bin gerade aus dem Urlaub retour (leider ohne Internet) und werde morgen eure Inputs prüfen!

Liebe Grüsse

Christian
Hallo Helfer!

Code geprüft und funktioniert grundsätzlich gut...

Was leider nicht eingebaut ist - aber hier war ich nicht präzise genug - ist eine Prüfung der Leistungseinheit in der jeweiligen Spalte, Zeile 5 (m2, ml, Stk., etc.).
Natürlich soll die Meldung nur kommen, wenn der Benutzer auf ein Feld mit "m2" ein "x" markiert. Bei Längsmassen soll keine Fehlermeldung kommen...

Danke für eure Hilfe!

Christian

PS: Ist es möglich, daß mir jemand den Code grob erklären kann?