Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
820to824
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
820to824
820to824
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Find Methode in eigener Funktion

Find Methode in eigener Funktion
21.11.2006 10:01:25
Mathias
Hallo!
Ich habe mir eine eigene Funktion erstellt die leider noch nicht ganz funktioniert.
Das will ich machen:
Ich habe eine Datei mit Kundendaten. Es gibt zu jedem Kunden mehrere Spalten mit Telefonnummern. Ich will nun herausfinden, ob bei einem Kunden eine Telefonnummer hinterlegt ist oder nicht. Gibt es eine Telefonnummer soll eine 1 zurückgeliefert werden, gibt es keine eine 0.
Die Spalten können 3 verschieden Zustände haben: Entweder sie sind leer, sie enthalten eine Mailadresse oder sie enthalten eine Telefonnummer.
Mein Ansatz:
Die Funktion prüft, ob die Zelle einen Wert enthält, ist dies der Fall, soll geprüft werden, ob ein "@"-Zeichen in der Zelle vorhanden ist. Ist dies nicht der Fall, soll die Funktion eine 1 zurückliefern. D.h. es reicht wenn eine der Telefonspalten diese Bedingungen erfüllt, wenn alle Spalten leer sind oder nur Mailadressen enthalten soll eine 0 zurückgegeben werden.
Mein Code:
Function Telefon1(Bereich As Range) As Integer Dim Zelle As Range Dim Found As Range For Each Zelle In Bereich If Zelle.Value <> "" Then Set Found = Zelle.Find(What:="@", LookIn:=xlValues) If Found Is Nothing Then Telefon1 = 1 Exit Function End If End If Next Zelle Telefon1 = 0 End Function
Da ich das öfter brauche, binde ich das ganze über ein Add-In ein, damit ich es immer zur Verfügung habe.
Es funktioniert auch soweit, dass eine 0 ausgegeben wird, wenn alle Zellen leer sind und eine 1 sobald in einer der Zellen was drin steht. Nur die Prüfung ob ein "@" vorhanden ist funktioniert noch nicht. Wenn also nur z.B. nur eine Zelle gefüllt ist, hier aber ein "@" enthalten ist, wird trotzdem eine 1 zurückgeliefert statt einer 0.
Die Find Methode hatte ich vorher einzeln getestet, müsste also eigentlich funktionieren.
Weiß jemand, wo mein Fehler liegt? Danke für eure Hilfe!
Gruß
Rudi

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Bug
21.11.2006 10:22:10
Hugo
Hallo Rudi,
die Find-Methode kannst Du bei Deiner Excelversion nicht in einer Funktion (UDF) einsetzen, die Du im Tabellenblatt anwendest. Es ist ein Bug, der erst seit Excel 2002 behoben wurde.
Gruß Hugo
AW: Find Methode in eigener Funktion
21.11.2006 10:28:05
lueckii
Hallo Rudi!
Versuchs mal mit dem Zusatz:

Function Telefon1(Bereich As Range) As Integer
Dim Zelle As Range
Dim Found As Range
For Each Zelle In Bereich
If Zelle.Value <> "" Then
Set Found = Zelle.Find(What:="@", LookIn:=xlValues)
If Found Is Nothing Then
Telefon1 = 1
Exit Function
Else
Telefon1 = 0
End If
End If
Next Zelle
Telefon1 = 0
End Function

Gruß Martin
Anzeige
AW: Find Methode in eigener Funktion
21.11.2006 10:47:34
Mathias
Der zusätzliche Else Zweig hat leider keine Veränderung gebracht. Es liegt tatsächlich an der Excel Version. Ich habe gerade meine Funktion auf unserem Laptop getestet, dort ist Excel 2002 installiert und die Funktion läuft dort wie gewünscht.
Danke für den Hinweis, wäre ich sonst nie drauf gekommen! Schade nur, dass ich meine Funktion also nicht an meinem normalen Arbeitsplatz zum laufen kriegen kann. Hoffe, dass wir da auch bald mal ne neue Excelversion bekommen ;-)
Viele Dank nochmal!
Gruß
Rudi
AW: Find Methode in eigener Funktion
21.11.2006 10:53:28
Erich
Hallo Rudi,
brauchst du überhaupt eine UDF?
(und wenn ja, kannst du in VBA die folgende Formel mit Evaluate auswerten lassen.)
Find brauchst du jedenfalls nicht.
 BCD
4 x0
5x4 
6 @ 
7   
8 x1
9x4 
10 x 

Formeln der Tabelle
ZelleFormel
D4{=1*(SUMME(LÄNGE(B4:C6))-SUMME(LÄNGE(WECHSELN(B4:C6;"@";"")))=0)}
D8{=1*(SUMME(LÄNGE(B8:C10))-SUMME(LÄNGE(WECHSELN(B8:C10;"@";"")))=0)}
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Find Methode in eigener Funktion
21.11.2006 11:07:22
Erich
Hallo nochmal,
probier mal als UDF
Public Function NoMail(rng As Range)
NoMail = Evaluate("=1*(SUM(LEN(" & rng.Address & "))" & _
"-SUM(LEN(SUBSTITUTE(" & rng.Address & ",""@"","""")))=0)")
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Sorry - war auf falschem Dampfer!
21.11.2006 11:14:52
Erich
Hallo Rudi,
vergiss meine beiden Beiträge - sie treffen nicht das, was du brauchst.
Grüße von Erich aus Kamp-Lintfort
Hat aber trotzdem geholfen!
21.11.2006 11:24:15
Mathias
Bist du verrückt? Wieso soll ich deine Beiträge vergessen, die haben mich auf genau die richtige Lösung geführt! Deine Funktion hat zwar nicht exakt das gemacht, was ich wollte, aber ich konnte es entsprechend in meine Funktion einbauen:

Function Telefon1(Bereich As Range) As Integer
Dim Zelle As Range
Dim Found As Integer
For Each Zelle In Bereich
If Zelle.Value <> "" Then
Found = Evaluate("=1*(SUM(LEN(" & Zelle.Address & "))" & _
"-SUM(LEN(SUBSTITUTE(" & Zelle.Address & ",""@"","""")))=0)")
If Found <> 0 Then
Telefon1 = 1
Exit Function
Else
Telefon1 = 0
End If
End If
Next Zelle
Telefon1 = 0
End Function

Funktioniert bestens! Vielen Dank!
Gruß
Rudi
Anzeige
Hat aber trotzdem geholfen!
21.11.2006 11:24:21
Mathias
Bist du verrückt? Wieso soll ich deine Beiträge vergessen, die haben mich auf genau die richtige Lösung geführt! Deine Funktion hat zwar nicht exakt das gemacht, was ich wollte, aber ich konnte es entsprechend in meine Funktion einbauen:

Function Telefon1(Bereich As Range) As Integer
Dim Zelle As Range
Dim Found As Integer
For Each Zelle In Bereich
If Zelle.Value <> "" Then
Found = Evaluate("=1*(SUM(LEN(" & Zelle.Address & "))" & _
"-SUM(LEN(SUBSTITUTE(" & Zelle.Address & ",""@"","""")))=0)")
If Found <> 0 Then
Telefon1 = 1
Exit Function
Else
Telefon1 = 0
End If
End If
Next Zelle
Telefon1 = 0
End Function

Funktioniert bestens! Vielen Dank!
Gruß
Rudi
Anzeige
AW: Hat aber trotzdem geholfen!
21.11.2006 11:51:54
Erich
Hallo Rudi,
ist vielleicht kürzer:
 BCDEF
3  FormelNoMailTelefon1
4@ 000
5 @   
6     
7     
8@1111
9 @   
10     

Formeln der Tabelle
ZelleFormel
D4=--(ZEILEN(B4:C6)*SPALTEN(B4:C6)-ZÄHLENWENN(B4:C6;"*@*")-ANZAHLLEEREZELLEN(B4:C6)<>0)
E4=NoMail(B4:C6)
F4=Telefon1(B4:C6)
B6=""
D8=--(ZEILEN(B8:C10)*SPALTEN(B8:C10)-ZÄHLENWENN(B8:C10;"*@*")-ANZAHLLEEREZELLEN(B8:C10)<>0)
E8=NoMail(B8:C10)
F8=Telefon1(B8:C10)
B10=""

mit der Funktion
Public Function NoMail(rng As Range) As Integer
NoMail = Evaluate("--(ROWS(" & rng.Address & ")*COLUMNS(" & rng.Address & ")" & _
"-COUNTIF(" & rng.Address & ",""*@*"")-COUNTBLANK(" & rng.Address & ")<>0)")
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: UDF war zu lang
21.11.2006 11:56:38
Erich
Hallo nochmal,
etwas besser:
Public Function NoMail(rng As Range) As Integer
NoMail = Evaluate("--(" & rng.Count & "-COUNTIF(" & rng.Address & ",""*@*"")" & _
"-COUNTBLANK(" & rng.Address & ")<>0)")
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: UDF war zu lang
21.11.2006 13:17:45
Mathias
Wow, ich bin beeindruckt! Vielen Dank für die Mühe!
Gruß
Rudi
AW: Find Methode in eigener Funktion
21.11.2006 11:22:40
Reinhard
Hi Matthias,
Option Explicit
Function Telefon1(Bereich As Range) As Integer
Dim Zelle As Range
For Each Zelle In Bereich
If Zelle.Value <> "" Then
If InStr(Zelle, "@") = 0 Then
Telefon1 = 1
Exit Function
End If
End If
Next Zelle
End Function

Gruß
Reinhard
ps: Ich freue mich über eine Rückmeldung ob diese Antwort hilfreich war oder nicht..
Anzeige
Danke!
21.11.2006 11:32:29
Mathias
Hallo Reinhard!
Auch dir vielen Dank, die Funktion liefert das perfekte Ergebnis und ist sogar noch kürzer als meine! Super Support hier, ich dank euch allen!
Gruß
Rudi

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige