Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA-Function aktualisiert sich nicht automatisch - Anzahl unterschiedlicher Einträge in einer Liste

2,633 views
Skip to first unread message

Andreas Gastreich

unread,
May 3, 2000, 3:00:00 AM5/3/00
to
Hallo, NG'ler!

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

Michael Gmeiner

unread,
May 3, 2000, 3:00:00 AM5/3/00
to
Hallo Andreas,

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...

Bernd Held

unread,
May 3, 2000, 3:00:00 AM5/3/00
to Andreas Gastreich
Hallo Andreas,

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:

Michael Gmeiner

unread,
May 3, 2000, 3:00:00 AM5/3/00
to
Hallo Bernd,

SUPER !!!

Den kannte ich noch nicht.

Gruß

Michael

Bernd Held <bh...@debis.com> schrieb in im Newsbeitrag:
390FE7FD...@debis.com...

Andreas Gastreich

unread,
May 4, 2000, 3:00:00 AM5/4/00
to
Hallo, Bernd und Michael!

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

0 new messages