Frage von JoejoePingel, 27

Wo liegt der Fehler, bei der VBA programmierung in Excel?

Ich möchte eine Wenn, dann befehl machen, der dafür sogt, dass in dem in Klammern geschiebenen Feld kein 0 mehr steht. (Bild im Anhang) Ich habe Excel 2003

Danke im Vorraus ;)

Antwort
von PWolff, 22

Eine Stringkonstante in VB ist keine Zelle und keine Zellgruppe. Das wäre ein Range-Objekt.

Was möchtest du erreichen? Dass in jeder der genannten Zellen eine 0 steht oder etwas, das als 0 interpretiert werden kann?

Dann müsstest du entweder die betreffenden Zellen einzeln prüfen, oder ein Range-Objekt mit diesen Zellen erstellen und mit einer Schleife prüfen oder mit einer der Worksheet-Funktionen Count, CountA, CountBlank, CountIf u. ä. arbeiten.

Kommentar von Iamiam ,

Genau!

CountBlank kannte ich übrigens noch nicht, ich hab das früher mal mühsam über Range(..).Cells.Count - CountA(Range(..)) gemacht!.

Kommentar von PWolff ,

Die englischen Namen einer Funktion bekommt man, indem man sie (mit den erforderlichen Argumenten) in eine Zelle einträgt und dann im Direktfenster der Entwicklungsumgebung eingibt

?ActiveCell.Formula
Expertenantwort
von Iamiam, Community-Experte für Excel, 18

was mich wundert: Kann denn eine Range = 0 sein? Oder wird da nur die erste Zelle der Range abgefragt und deshalb gehts (zufällig)?

Ausserdem: normalerweise setzt VBA nach dem , ein Leerzeichen, was obigen Verdacht nährt.

ich denke, korrekt müsste das heissen:

Dim Cell1R, Cell2R

For each Cell1R in Range("F10:F13", "F17:F20", "F24:F27").cells

if Cell1R = 0 then Worksheets(1).calculate 'oder was soll sonst geschehen?

next 'else/end if entfallen bei der einzeiligen (=alternativlosen Merkel-)Variante.

Das kalkuliert bei jeder gefundenen Leerzelle neu (???) wenn nur eine 0 als Grund ausreicht, dann nach Worksheets´(1) in derselben Zeile so fortfahren:

.calculate: exit For

'und dann analog mit dem 2. Bereich und Cell2R


Kommentar von Iamiam ,

Falls das nicht geht. Es gibt auch noch den Befehl

Union(Range("F10:F13"), Range("F17:F20"), ...)

bln mir da nicht ganz sicher, was VBA an Kombibereichen akzeptiert.

Kommentar von PWolff ,

Ich hab mal ein bisschen rumgespielt:

Bei einer Zuweisung kann man ein Range-Objekt mit mehreren Zellen verwenden. Dann wird der angegebene Wert jeder Zelle zugewiesen.

Die Kommas stehen nur in Strings, deshalb setzt VBA keine Leerzeichen dahinter.

Mit Strings kann man auf diese Weise Mehrfachauswahlen als Range erzeugen. Bei Lesezugriff auf dieses Objekt wird tatsächlich der Inhalt der ersten Zelle zurückgegeben (Value ist die Standardeigenschaft der Range-Klasse). Auf die einzelnen Zusammenhangsbereiche kann man mit <Range-Object>.Areas(i) zugreifen (i läuft exceltypisch ab 1) und auf die einzelnen Zellen hierin mit <Range-Object>.Areas(i)(j) (j läuft wieder ab 1). Und mit <Range-Object>(i) auf die einzelnen Zellen.

Das Zusammensetzen von Range-Objekten mittels Strings finde ich etwas unübersichtlich

Expertenantwort
von Ninombre, Community-Experte für Excel, 22

das Gesamtkonstrukt verstehe ich zwar noch nicht ganz, aber mit

range(b13, d13...).value=0 sollte es funktionieren

Du fragst damit aber ab, dass alle der genannten Zellen = 0 sein müssen, um die IF Bedingung zu erfüllen. Ist das so gewünscht oder soll es ein ODER sein?


Keine passende Antwort gefunden?

Fragen Sie die Community