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:
'Beispiel: kommt eigentlich aus der Parameterliste
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?
Dim retVal As Variant
retVal = Range("A1") '#1
retVal = Range("A1:C4") '#2
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:
'...
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
'...
|