If-Funktion auf einen Bereich begrenzen

Ich frage in mehreren gleich gestalteten Spalten (D-H) ein bestimmtes Ergebnis ab. Wenn es positov ist, soll ein MsgBox angezeigt werden. Und zwar für jede Spalte unabhängig nach der Eingabe der entsprechenden Zahlen und deren Berechung.

Das klappt mit If-Then… schon ganz gut.

Nur leider kommt der Hinweis „kumulativ“. Das heißt, wenn in 3 Spalten das Ergenis positiv ist, kommt der Hinweis in der 3. Spalte 3 mal.

ALso muss ich das Ergebnis immer einzeln für den Bereich abfragen, in dem ich gerade arbeite. Und da scheitere ich mit meinem bescheidenen Wissen von VBA.
Wie beschränke ich meine Auswertungen auf einen bestimmten Bereich, ohne den Rest der Tabelle vollkommen auszublenden?

OR - ELSEIF
Hallo,

Pseudocode:

IF ( SPALTE_A == true OR SPALTE_B == true OR SPALTE_C == true ) THEN
MSGBOX(„Mindestens ein positiver Eintrag“);
ENDIF;
OR wird dir helfen:

-> http://de.wikipedia.org/wiki/ODER-Gatter

Aber ELSEIF auch:

Pseudocode:

IF (SPALTE_A == true) THEN
MSGBOX(„Mindestens ein positiver Eintrag“);
ELSEIF (SPALTE_B == true) THEN
MSGBOX(„Mindestens ein positiver Eintrag“);
ELSEIF (SPALTE_C == true) THEN
MSGBOX(„Mindestens ein positiver Eintrag“);
ENDIF;

-> http://www.selfphp.de/praxisbuch/praxisbuchseite.php…

Ich schreibe bewusst Pseudocode, da ich das nicht getestet habe, es können also Fehler sein :wink: Gerne darf jemand mich korrigieren…

Grüße Roman

Wie beschränke ich meine Auswertungen auf einen bestimmten
Bereich, ohne den Rest der Tabelle vollkommen auszublenden?

Hallo E,

ist spät, bin auch schon Bettmäßig bereit.
Wenn dir das von BHX hilft isses ja gut.
Wenn nicht zeig mal deinen Code.

FALLS nötig auch eine beispielmappe hochladen mit file upload, s. FAQ:2606

Guts Nächtle
Reinhard

Danke erst einmal… ich probiere das mir dem „SpalteA=true…“ wenn das nicht hilft, dann melde ich mich noch mal.

LG

Danke erst einmal… ich probiere das mir dem
„SpalteA=true…“ wenn das nicht hilft, dann melde ich mich
noch mal.

Hallo Euphresia,

geht auch so, (Ereignis ist: Zellwert größer 10)

Option Explicit

Sub Check()
Dim Zei As Long
For Zei = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
 If Application.CountIf(Range(Cells(Zei, 4), Cells(Zei, 8)), "\>10") \> 0 Then
 MsgBox "Fehler in Zeile " & Zei
 End If
Next Zei
End Sub

Gruß
Reinhard

Aber ELSEIF auch:
IF (SPALTE_A == true) THEN
MSGBOX(„Mindestens ein positiver Eintrag“);
ELSEIF (SPALTE_B == true) THEN
MSGBOX(„Mindestens ein positiver Eintrag“);
ELSEIF (SPALTE_C == true) THEN
MSGBOX(„Mindestens ein positiver Eintrag“);
ENDIF;
Ich schreibe bewusst Pseudocode, da ich das nicht getestet
habe, es können also Fehler sein :wink: Gerne darf jemand mich
korrigieren…

Hallo Roman,

nee, ist schon okay :smile:
Elseif geht auch als Einzeiler, denn in IIf ts ElseIf drin:

If IIf(IIf(Cells(Zei, 4) > 10 Or Cells(Zei, 5) > 10, True, False) Or Cells(Zei, 6) > 10, True, False) Then MsgBox „Mindestens ein positiver Eintrag“

Das hier ginge auch, nur ein If:

If (Cells(Zei, 4) \> 10) + (Cells(Zei, 5) \> 10) + (Cells(Zei, 6) \> 10) 

Gruß
Reinhard

Hallo Reinhard,

ich glaube man merkt schon, aus welcher Programmierecke ich komme :wink:

Um dein erstes Beispiel zu verstehen, musste ich erstmal nach allgemeinen Beispielen zu „IIf“ googlen… dann hättest du für eine bessere Lesbarkeit einige Einrückungen machen können. Irgendwie sieht mein Gerüst (s.u.) so komisch aus… Sorry :smiley:

If IIf ( IIf(Cells(Zei, 4) > 10 Or
Cells(Zei, 5) > 10,
True, False)
Or
Cells(Zei, 6) > 10,
True, False)
Then
MsgBox „Mindestens ein positiver Eintrag“

Naja, was wir hier machen, ist ja fast off topic :smiley: Die interne Mail gibt es ja auch noch, falls du antworten möchtest.

Grüße Roman

Hallo Reinhard,

genauer muß es so heißen:
Der Hinweis wird eingeblendet, wenn der Vergleich mehrer (verstreut liegender) Zellen wahr ist. (If…Then…(Else)… end if)

Also nach Eingabe der Daten und der dadurch bewirkten Neuberechnung der Tabelle (calculate) soll bei „Wahr“ der Hinweis (msgBox) eingeblendet werden. Die MsgBox ist der ausdrückliche Wunsch des Auftraggebers, sonst würde ich die ganze Sache mit einer Texbox klären… soll ich aber nicht.

Und das für jede Spalte, in der ich Daten in den benannten Zellen eingebe, einzeln und unabhängig voneinander.
Was wiederum heißt, ich muss den Spaltenbereich in dem ich gearde arbeite „aktivieren“ und wenn ich dann in die nächste Spalte wechsele und dort meine Daten eingebe… darf nur der neue Brereich der „aktive“ bereich sein. Der vorhergehende darf nicht noch einmal bewertet werden.

Wenn ich nämlich 5 Spalten prüfe und das Ergebnis ist 5mal „wahr“… dann kommt der Hinweis in der 5. Spalte 5 mal… was blöd ist.

Für die Eingabe anderer Daten müssen aber wiederum die Spalten wieder aktiviert werden. Also darf die MsgBox auch nur 1-mal je Spalte insgesamt erscheinen. Denn wenn ich andere Zellen auswerte, ist die Bewertung der genannten Zellen unrelevant.

Da die Arbeitsmappe ziemlich umfangreich ist und von einem Steuerbüro in Auftrag gegeben wurde, kann ich sie schlecht „rumreichen“.

Ich vergleiche in der aktiven Tabelle2 die Zellen D19, D20 und D73 in der Spalte D

Die Zellen E19, E20 und D73+tabelle7.(„C17“) in der Spalte E

Die Zellen F19, F20 und D73+tabelle7.(„E17“) in der Spalte F

usw… bis zur Spalte H

Dabei gilt als Wahr: If D20>D19 and D73>0 Then… MsgBox „Hinweis18“
und ab Spalte E If E20>E19 and D73+Tabelle7.(„C17“) Then MsgBox „Hinweis19“

usw. bis Spalte H

Jeder Hinweis erscheint NUR, wenn ich in DIESEN Zellen arbeite, und NUR 1 mal.

Natürlich habe ich alle Zellen als Variablen deklariert (sie heißen also anders) und habe auch eine Bereichsdeklaration mit den entsprechenden Zellen ausprobiert… Wie gesagt, das Ergebnis ist bis jetzt nicht so befriedigend.

Ich denke, dass ich mich jetzt etwas klarer ausgedrückt habe.

Da die Auswertung immer an die Neuberechnung der Daten gekoppelt ist, kann ich nur Sub Worksheet_calculate wählen…

Für mich ist das ne echte Knobelaufgabe… aber vielleicht wird mir ja geholfen.

Vielen Dank

Euphresia

Danke für deinen Vorschlag. Er hat mich zumindest auf viele andere Möglichkeiten aufmerksam gemacht und mich ein Stück weitergebracht.

Grüße

Euphresia

Hallo ihr beiden,

um noch eines drauf zu setzen *ggg*

Folgende Wege fallen mir dazu spontan ein.

1: Mittels IF ElseIF
2: Mittels IF und AND /OR
3: Abfrage über eine Function die alle betroffenen Spalten durchläuft
4: Mittels einer Schleife
5: Mittels Select Case True
6: Prüfen der Eingaben direkt bei einer Eingabe in die betroffene Spalte

Wie man sieht, viele Wege führen nach Rom :smile: Wobei mein Favourit Variante 3 ist, da sie am flexibelsten ist :wink:

MfG Alex

Hallo Reinhard

Ich habe noch vergessen zu erwähnen, das in der Tabelle2 noch ca. 5 andere Auswertungen laufen, für die ich bis jetzt 2 Makros angelegt habe. es ist also keine separate Sub, sondern dann mal ein Teil der Sub Worksheet_calculate… es sei denn, es gibt noch eine andere Möglichkeit.

Grüße

Euphresia

Hallo Alex, danke für deine Anregungen. Ja… bei einigen davon war ich auch schon angekommen.
Ich habe dem Reinhard meinen „Fall“ noch einmal detailierter beschrieben. (sie meine Antworten dort). Vielleicht fällt dir ja beim Lesen ein, was am zutreffendsten wäre.

Grüße

Euphresia

1: Mittels IF ElseIF
2: Mittels IF und AND /OR
3: Abfrage über eine Function die alle betroffenen Spalten
durchläuft
4: Mittels einer Schleife
5: Mittels Select Case True
6: Prüfen der Eingaben direkt bei einer Eingabe in die
betroffene Spalte

Wie man sieht, viele Wege führen nach Rom :smile: Wobei mein
Favourit Variante 3 ist, da sie am flexibelsten ist :wink:

Hallo Alex,

schön dich wieder mal hier zu lesen :smile:

mein Favorit ist da sehr eindutig Nr6, das ist Urschanebekämpfung und quasi nicht Wirkungsbekämpfung wie die anderen Punkte.

Dein Favorit ist Nr 3!?
Wie soll das funktionieren mit „Abfrage über eine Funktion“?
Mir grad unklar bzw. sehe da schon paar Möglichkeiten aber weiß nicht welche du meinst.
Jedenfalls meinst du irgendwas was für eine Zeile einige Spalten nacheinander durchprüft.
Und das sit doch irre langsam in Excel-Vba.
Exceleigene Funktionen sind da 1000mal schneller wie z.B. Zählenwenn (countif) was ich diesem Code ja benutzt habe:

Sub Check()
Dim Zei As Long
For Zei = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
 If Application.CountIf(Range(Cells(Zei, 4), Cells(Zei, 8)), "\>10") \> 0 Then
 MsgBox "Fehler in Zeile " & Zei
 End If
Next Zei
End Sub

Ich würde also diesen Code nehmen oder Nr 6.

Nr 1 und 2 sind ja okay, aber wenn es mal um 100 Spalten einer zeile geht wird das langer Code.

Nr 5 würde mich interessieren wie da der Code aussieht.

Btw. ich habe schon deine Codes hier gelesen und auch die wo du
Select Case True
benutzt hast. Machte immer auch Sinn und ich finde dieses Vorgehen gut.
Was mich irritiert ist, in 10 jahren wo ich Excel-Vba Code in Foren mitlese sah ich das noch nie außer bei dir.

Nr 4 ist mir zu allgemein bzw. wenn damit pro zeile eine Schleife über alle relevanten Spalten gemeint ist so wird das wohl wie oben geschildert zu langsam sein.

Wenn es dir allerdings nur darum ging aufzuzeigen mit welchen anderen Wegen man nach Rom kommt so vergiss was ich schrieb *gg*
Abgesehen vom Code für Nr 5, den würde ich gerne sehen.
In dieser prozedurhülle:

Sub Check()
Dim Zei As Long
For Zei = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
'
'dein Code
'
Next Zei
End Sub

Gruß
Reinhard

Hallo Euphresia,

Da die Arbeitsmappe ziemlich umfangreich ist und von einem
Steuerbüro in Auftrag gegeben wurde, kann ich sie schlecht
„rumreichen“.

Schnickschnack.

Alle Blätter die wir nicht brauchen kannste löschen.
Wir brauchen auch keine 20.000 Datenzeilen.
30 reichen.

Was steht nun in den Blättern? Namen?
Na und, ist ruckzuck anonymisiert.
Stehen z.B. die Namen in A obendrüber eine Überschrift so schreibst du in A2
Name1
Dann markierst du A2, gehst bei ihr auf die rechte untere Ecke und „ziehst“ die nach unten.
Dann steht in A untereinander name1, name2, name3 usw.

Auf die Art haste die tabelle schnell anonymisiert.
Wichtig sind ja für uns nur die Spalten um die es geht.

Dann hochladen und wenn wir an konkrter Tabellensituation „arbeiten“ so ist das für dich in gewisser Weise besser, dann haste keine Umsetzungsprobleme.
„gewisser Weise“ bedeutet du lernst nix dabei wenn du das nur übernimmst.
Biste gezwungen eine Lösung die sich wie allgemein üblich auf Tabelle1 und A-H bezieht auf deine tabelle umzusetzen lernste was…

Gruß
Reinhard

Hallo Reinhard,

2:45 schlafe ich für gewöhnlich, deshalb erst jetzte der Link für die
Tabelle.

Grüße

Euphresia

http://www.file-upload.net/download-3626283/Test-Ber…

http://www.file-upload.net/download-3626283/Test-Ber…

Hallo Holger,

schau mal diese Mappe an.

Gruß
Reinhard