So scheint es zu funktionieren. Ich verstehe trotzdem nicht so ganz, warum an der Stelle nicht direkt zu dem ElseIf übergegangen wird.
Betrachten wir das mal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Dim Argument As Excel.Range
Set Argument = Range( "A1:C3" )
Dim Zelle As Excel.Range
Dim Summe As Double
Dim Anzahl As Double
If IsNumeric(Argument) And Argument >= 0 Then
Summe = Summe + Argument
Anzahl = Anzahl + 1
ElseIf TypeName(Argument) = "Range" Then
For Each Zelle In Argument
If IsNumeric(Zelle.Value) And Zelle.Value >= 0 Then
Summe = Summe + Zelle.Value
Anzahl = Anzahl + 1
End If
Next
End If
|
Was passiert den in dem Fall (markierte Zeile)?
Argument ist ein Objekt, noch genauer, es ist ein Range-Objekt.
Betrachten wir das mal anders:
Frage: Was passiert wenn man folgendes schreibt?
1 2 3 4 | Dim retVal As Variant
retVal = Range( "A1" )
retVal = Range( "A1:C4" )
|
Im Fall #1 steht in retVal der Zelleninhalt von A1 drin.
Im Fall #2 steht in retVal ein 2D-Array (4 Zeilen, 3 Spalten) mit den jeweiligen Zelleninhalten von A1 bis C4 drin.
Was erwartet die Funktion IsNumeric()? Laut Dokumentation erwartet sie einen Ausdruck - ein Array ist aber kein Ausdruck; Argument >= 0 würde auch einen Fehler verursachen.
Du erinnerst dich sicher noch an eines deiner anderen Themen, wo es kurz darum ging das jemand meinte: "Wozu der Test auf Objekt, ist doch egal?"
Tja, nun sieht man wie "egal" das ist - nämlich gar nicht egal. ;o) (Ich hoffe die Trantüte von damals liest das hier.)
Entweder du löst es wie du es hast, oder du änderst die Reihenfolge:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | For Each Argument In AlleArgumente
If NurPosZahlen = True Then
If TypeName(Argument) = "Range" Then
For Each Zelle In Argument
If IsNumeric(Zelle.Value) And Zelle.Value >= 0 Then
Summe = Summe + Zelle.Value
Anzahl = Anzahl + 1
End If
Next
Else
If IsNumeric(Argument) And Argument >= 0 Then
Summe = Summe + Argument
Anzahl = Anzahl + 1
End If
End If
|
|