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

...komplette Frage anzeigen Der Fehler - (programmieren, Microsoft, Excel)

3 Antworten

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.

Antwort bewerten Vielen Dank für Deine Bewertung
Iamiam 21.03.2016, 16:20

Genau!

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

0
PWolff 21.03.2016, 16:46
@Iamiam

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
0

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


Antwort bewerten Vielen Dank für Deine Bewertung
Iamiam 21.03.2016, 16:14

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.

0
PWolff 21.03.2016, 17:11

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

1

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?


Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?