Für gewöhnlich aktualisieren sich meine selbstgeschriebenen
(benutzerdefinierten) Funktionen automatisch. Nur die folgende verhält sich
etwas 'zickig': erst nach Doppelklick und Enter (oder [F2] und Enter) passt
sich das Ergebnis an eine geänderte Liste an.
Hat jemand von Euch eine Idee, warum das so ist?
Die Funktion zählt - zuverlässig - die Anzahl unterschiedlicher Einträge in
einer Liste.
Der 'Fehler' ist mit XL97 und mit XL2000 nachvollziehbar.
Danke und Gruss
Andreas
Option Explicit
Function ANZAHLVS(zelle1 As Range, zelle2 As Range)
' die Werte müssen einspaltig, in einer einzigen Spalte angeordnet sein
Dim i, j, i2, x, y As Integer
Dim abbruch As Boolean
x = 0 ' zählt die Anzahl der Einträge insgesamt
y = 0 ' zählt die Anzahl der doppelten Einträge
j = zelle1.Column
For i = zelle1.Row To zelle2.Row ' Schleife über alle Zeilen des Bereichs
If Not (IsEmpty(Cells(i, j))) Then
x = x + 1
i2 = i + 1
abbruch = False
Do Until i2 > zelle2.Row Or abbruch ' Schleife über den bisher
durchsuchten Bereich
If Cells(i, j) = Cells(i2, j) And Not i = i2 Then
y = y + 1
abbruch = True
End If
i2 = i2 + 1
Loop
End If
Next i
ANZAHLVS = x - y
End Function
ich habe mir Deine Funktion angesehen. Sie arbeitet sauber. Wenn die Formel
lautet =ANZAHLVS(A1;A20), dann ändert sich allerdings erst dann etwas, wenn
sich die Werte in Zelle A1 oder A20 ändern. Bei Änderungen in den Zellen
dazwischen passiert nichts. Das liegt schlicht und ergreifend daran, daß Du
nicht mit dem Gesamtbereich als Range arbeitest. Und Excel erkennt, daß sich
etwas getan hat, erst nach Änderung einer der Zellbezüge, die als Parameter
an die Funktion übergeben wurden.
Schau Dir bitte folgende Funktionen an. Beide summieren einfach nur Werte
aus einem bestimmten Bereich. Der Unterschied ist der, daß sich die erste
Funktion nur dann aktualiesert, wenn man entweder F2 + Enter drückt, oder
einen Wert in der ersten oder letzten Zelle ändert.
Bei der zweiten Funktion ändert sich das Ergebnis, sobald irgend ein Wert
innerhalb des Bereichs geändert wird.
Function test(zelle1 As Range, zelle2 As Range)
Dim i%
For i = zelle1.Row To zelle2.Row
test = test + Cells(i, zelle1.Column)
Next i
End Function
Function test2(rngBereich As Range)
Dim Cell As Variant
For Each Cell In rngBereich
test2 = test2 + Cell
Next Cell
End Function
Ändere Deinen Code so ab, daß Du den Gesamtbereich als Parameter für die
Funktion verwenden kannst. Dann wird's funktionieren.
ÜBRIGENS:
Dim i, j, i2, x, y As Integer
Ich gehe aus dem Zusammenhang in Deinem Code mal davon aus, daß die
Variablen allesamt als Integervariablen deklariert werden sollten.Mit dieser
Deklaration wird nur die Variable y als Integer dimensioniert. Alle anderen
Variablen in dieser Reihe werden, mangels Zuweisung eines Datentyps, zu
Variantvariablen.
Wenn Du ein Freund der platzsparenden Variablenbenamung bist, dann arbeite
doch mit Typenkennzeichen. Für Integervariablen ist das z. B. das
Prozentzeichen (% = Integer, ! = Single, @ = Currency, $ = String usw.)
In Deinem Beispiel würde das so aussehen:
Dim i%, j%, i2%, x%, y%
Damit ist allen Variablen der Typ "Integer" zugewiesen.
Viele Grüße
Michael
Andreas Gastreich <Andreas....@rockwool.de> schrieb in im Newsbeitrag:
390fc8fb$0$20...@personalnews.de.uu.net...
möglicherweise hilft es Dir weiter, wenn Du die Anweisung
Application.volatile einsetzt.
Kopiert aus Online hilfe:
"Kennzeichnet eine benutzerdefinierte Funktion als flüchtig. Solche Funktionen
werden immer neu berechnet, wenn in einer beliebigen Zelle des Tabellenblattes
eine Berechnung durchgeführt wird. Nicht flüchtige Funktionen werden nur dann
neu berechnet, wenn sich die Eingabevariablen ändern. Diese Methode wird in der
Regel in einer benutzerdefinierten Funktion zur Berechnung einer Tabellenzelle
verwendet, andernfalls hat sie keine Auswirkung."
Viele Grüße
Bernd
//////////////////////////////////////
// Die MacHero EXCEL/WORKS Homepage
// Microsoft Excel MVP
// http://members.aol.com/Machero
//
// Computerbild 06/2000 "Buch der Woche" unter
// http://members.aol.com/Machero/derexcel.html
Andreas Gastreich schrieb:
SUPER !!!
Den kannte ich noch nicht.
Gruß
Michael
Bernd Held <bh...@debis.com> schrieb in im Newsbeitrag:
390FE7FD...@debis.com...
Vielen Dank für Eure - überaus kompetente - Hilfe.
Ich habe Eure Tipps umgesetzt - beides funktioniert.
Schneller war die Umsetzung des Tipps von Bernd zu realisieren, aber (und
das war ja mein Fehler), ein Bereich ist was anderes als 2 Parameter, die
Anfang und Ende eines Bereiches festlegen sollen.
Deshalb arbeite ich nun mit der folgenden Funktion:
Function ANZAHLVS(Bereich As Range)
' die Werte müssen einspaltig, in einer einzigen Spalte also angeordnet sein
Dim i%, j%, i2%, x%, y%, r1%, r2%
Dim abbruch As Boolean
x = 0 ' zählt die Anzahl der Einträge insgesamt
y = 0 ' zählt die Anzahl der doppelten Einträge
j = Bereich.Column
r1 = Bereich.Row
r2 = Bereich.Row + Bereich.Rows.Count - 1
For i = r1 To r2 ' Schleife über alle Zeilen des Bereichs
If Not (IsEmpty(Cells(i, j))) Then
x = x + 1
i2 = i + 1
abbruch = False
Do Until i2 > r2 Or abbruch ' Schleife über die nachfolgenden Zellen