1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Excel - Frage zu WorksheetFunction

Discussion in 'Office-Programme' started by Alf_2, Mar 16, 2008.

Thread Status:
Not open for further replies.
  1. Alf_2

    Alf_2 Kbyte

    Moin moin, ja - schon wieder ich

    In einer Funktion steht einmal
    anzahl(1) = WorksheetFunction.CountIf(Cells(r - 2, 11), "=1") + WorksheetFunction.CountIf(Cells(r - 2, 17), "=1") + ..... WorksheetFunction.CountIf(Cells(r - 2, 65), "=1")

    und in einer anderen
    auswert = WorksheetFunction.CountIf((Cells(r, 9) - Cells(r, 11)), "=0") + WorksheetFunction.CountIf((Cells(r, 15) - Cells(r, 17)), "=0") + ...WorksheetFunction.countif((Cells(r, 63) - Cells(r, 65)), "=0")

    r und c wurden zuvor mittels

    Dim c As Integer
    Dim r As Integer
    Dim aktAddress As String

    aktAddress = Application.Caller.Address
    r = Range(Application.Caller.Address).Row
    c = Range(Application.Caller.Address).Column


    ermittelt, die Variablen anzahl bzw. auswert sind Integer, ebenso wie alle Zellen (Ganz-)Zahlenwerte enthalten

    Problem: Die erste Formel funktioniert tadellos.
    Die zweite Formel bringt #WERT. Eingekreist ist das Prob soweit, als daß es am WorksheetFunction.countif-Teil liegen muß, denn die separate Auswertung der dahinter stehenden Argumente Cells(r, 9) - Cells(r, 11) usw. klappt, es wird der richtige Wert angezeigt. Die Anzahl der Klammern um die beiden Operanden ( "((" oder "(" ) ist dabei scheinbar ohne Bedeutung.
    Wo, bitte, liegt hier der Hase im Pfeffer ?
     
  2. Urs2

    Urs2 Megabyte

    "Anzahl(1)" ist eine Variable? Und der Debugger frisst das, als Variable?
    "auswert" kann eine Variable sein...

    Die "Variable" und die Variable As Integer dimensioniert?
    Müsste das nicht As Double sein? >>> Function CountIf(Arg1 As Range, Arg2) As Double


    Uebrigens:
    Bei CountIf kann das Kriterium "=1" auch nur als 1 geschrieben werden, aber ">1" ist richtig. Erleichtert das Tippen...

    Gruss Urs
     
  3. Hascheff

    Hascheff Moderator

    @ Urs: guckstdu: hier
    @ Alf: Urs meint, es ist riskant, Variablen so zu nennen wie Excel-Funktionen. Es scheint zu funktionieren, da VBA stattdessen englische Begriffe verwendet, ich würde es aber auch vermeiden.
    Das kann auch ein Grund für die Fehlermeldung sein. Meine Vermutung ist eine andere:
    Wenn das so in der VBA-Hilfe steht, kannst du eben nicht
    schreiben. Das ist ein Rechenergebnis, kein Wert aus der Tabelle.

    Vor wenigen Wochen gab es mal einen ähnlichen Fall hier im Forum (Musst du mal suchen). Damals ging es zwar nicht um VBA, sondern um eine Excelfunktion und nicht um ZÄHLENWENN, sondern um SUMMEWENN, aber auch da war das Problem, dass die Funktion kein Rechenergebnis verarbeitet hat. Beverly hat damals SUMME verwendet, das ist fähig, mehrere Bedingungen durch Berechnung zu verarbeiten.
    Ich denke, dass du mit ANZAHL statt ZÄHLENWENN, also mit Count statt CountIf dein Ziel erreichst.
    Zum Selbstprobieren fehlt mir jetzt die Zeit.
     
  4. Urs2

    Urs2 Megabyte

    @Hascheff + Alf2
    Also... Array... da bin ich schon froh wenn ich einen grossen Array ohne dumme Fehler hinkriege...

    askArray1 = anzahl(1) kann den 1.Satz im Array abfragen, aber was macht denn das >
    anzahl(1) = ResultatEinerFormel > Setzt es das Resultat in den Array?

    Das Range-Problem hatte ich gar nicht gesehen (die Formeln sind so lang...) > Das dürfte wohl auch nicht funktionieren.
    Meine Zeile mit Range/Double steht im Objektkatalog des VB-Editors > Suche > WorksheetFunction eingeben...

    Das ZählenWenn scheint mir sowieso nicht so geeignet, das ergibt monströse, schwer zu kontrollierende Formeln, aber wir sehen ja nur einen Ausschnitt des Ganzen, da werden wohl noch andere Zwänge bestehen...

    Gruss Urs
     
  5. Alf_2

    Alf_2 Kbyte

    Danke an Beide.
    Hatte inzwischen auch herausgegoogelt, daß es wohl an der Nichtbewältigung einer Rechenoperation liegt.Muß dazu sagen, daß diese und auch die vorhergehenden Fragen Resultat eines Learning-by-Doing-Prozesses sind, wobei es noch mächtig Probleme gibt, z.B. aus den Antworten: warum kann ich nicht Integer benutzen, sondern soll Double nehmen, wenn es sich nur um Ganzzahlen handelt ? Und dann die Sache mit Range, wann wird es angewendet, wann nicht ? Aber vielleicht bin ich langsam etwas zu alt, um das noch zu kapieren. Ich hab's dann halt doch mit Tabellenfunktion gelöst.
     
  6. Urs2

    Urs2 Megabyte

    @Alf_2 ----- zu alt?
    Den Nicknames sieht man das Alter nicht an - Du würdest Dich wahrscheinlich noch wundern...

    In VisualBasic muss man die Variablen mit Dim registrieren und dimensionieren.

    In VBA muss man beides nicht zwingend machen. Registrieren mit Dim ist vorteilhaft (Option Explicit zuoberst im Code hinschreiben), nur schon um Tippfehler zu "entlarven".
    Dimensionieren ist meistens nicht nötig. VBA ist grosszügig, es schreibt Zahlen, die es als Integer, Double, Long oder sonst was erhält ins richtige Format... meistens.
    Wenn aber ein Format vorgegeben wird, ist Schluss mit der Gutmütigkeit, dann muss es auch stimmen, oder mit einem speziellen Befehl zuerst umgewandelt werden!

    Und wenn ein Range, oder Object oder Aehnliches verlangt wird, muss natürlich genau das geliefert werden, ob extra dimensioniert oder nicht.

    "Range" ist die Bezeichnung eines Ortes im Tabellenblatt, eine oder mehrere Zellen. Nicht nur "Range" sondern zum Beispiel auch "Cells" sind ein Range.
    Klick Dich durch die Hilfe im VB-Editor, die ist ganz gut geschrieben, auch für das Prinzipielle.

    Jeder arbeitet so, wie es für ihn am Besten geht.
    Ich ziehe die Arbeit im VB-Editor den Eingaben in die Zellen vor. Die Riesenformeln in den Zellen sind fehlerträchtig, und die Uebersicht geht verloren, man kann immer nur eine Formel aufs Mal sehen.
    Im Editor kann ich die Formeln zerpflücken und ich sehe alles gleichzeitig, Platz spielt keine Rolle.

    Gruss Urs
     
Thread Status:
Not open for further replies.

Share This Page