Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1168to1172
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
Inhaltsverzeichnis

Funktion soll sich selbst aufrufen

Funktion soll sich selbst aufrufen
Martin
Hallo,
ich habe eine Funktion geschrieben, die falsch geschriebene Namen in der Groß- und Kleinschreibung automatisch korrigieren soll. Dabei werden die Namen nach Bindestrich und Leerzeichen auseinandergenommen. Leider klappt der eigene Aufruf der Funktion nicht, es erscheint immer die Fehlermeldung "Fehler beim Kompilieren: Argumententyp ByRef unverträglich".
Ich würde mich sehr freuen, wenn Ihr mir helfen würdet.
Viele Grüße
Martin
Sub AuswertungVorname()
'Testnamen: hans-günter, hans - günter, HANS-GÜNTER, hans günter, HANS GÜNTER, hANS gÜNTER
MsgBox Namenskorrektur("hans günter", "-")
End Sub
Function Namenskorrektur(Name As String, Delimiter As String)
Dim NameArr As Variant
Dim i As Integer
NameArr = Split(Name, Delimiter)
Name = ""
For i = 0 To UBound(NameArr)
NameArr(i) = Trim(NameArr(i)) ' falls "Hans - Günter"
If NameArr(i)  "" Then
NameArr(i) = UCase(Left(NameArr(i), 1)) & LCase(Right(NameArr(i), Len(NameArr(i)) -  _
1))
'Die folgende Zeile bereitet mir Probleme:
NameArr(i) = Namenskorrektur(NameArr(i), " ")
If i = 0 Then Name = NameArr(i) Else Name = Name & Delimiter & NameArr(i)
End If
Next i
Namenskorrektur = Name
End Function


		
Funktion Proper
26.07.2010 10:36:41
Tino
Hallo,
schau Dir mal die Funktion Proper an.
Sub beispiel()
Dim meAr, i As Integer
meAr = Array("hans-günter", "hans - günter", "HANS-GÜNTER", "hans günter", "HANS GÜNTER", "hANS gÜNTER")

With Application.WorksheetFunction
    For i = 0 To Ubound(meAr)
        MsgBox .Proper(meAr(i))
    Next i
End With
End Sub
Gruß Tino
Anzeige
AW: Funktion Proper
26.07.2010 11:30:38
Martin
Hallo Tino,
vielen Dank für Deine Antwort. Die Formelfunktion Proper war mir vorher unbekannt und erspart mir das Auseinandernehmen des Namens. Meine Funktion löscht aber auch noch (sinnlos gesetzte) Leerzeichen (zum Beispiel "hans - günter" zu "Hans-Günter"). Entschuldige bitte, dass ich das nicht von Anfang an geschrieben habe. Hast du dafür vielleicht auch eine Idee?
Außerdem interessiert mich auch die Ursache dafür, warum sich "meine" Funktion nicht selbst aufrufen kann. Vielleicht kannst du mir das auch erklären?
Viele Grüße
Martin
AW: Funktion Proper
26.07.2010 11:35:48
Tino
Hallo,
vielleicht so.
Sub beispiel()
Dim meAr, i As Integer
meAr = Array("hans-günter", "hans - günter", "HANS-GÜNTER", "hans günter", "HANS GÜNTER", "hANS gÜNTER")

With Application.WorksheetFunction
    For i = 0 To Ubound(meAr)
        meAr(i) = Replace(meAr(i), " -", "-")
        meAr(i) = Replace(meAr(i), "- ", "-")
        MsgBox .Proper(meAr(i))
    Next i
End With

End Sub
Gruß Tino
Anzeige
AW: Funktion Proper
26.07.2010 11:42:57
Martin
Hallo Tino,
manchmal kommt man nicht auf die einfachsten Lösungen. So wenig Code und alles funktioniert, danke.
Ohne Frage, meine Anliegen ist gelöst. Trotzdem frage ich noch einmal nach dem Grund, warum sich "meine" Funktion nicht selbst aufrufen kann. Ich will einfach nur aus meinen Fehlern lernen.
Viele Grüße
Martin
AW: Funktion Proper
26.07.2010 11:45:35
Ramses
Hallo Tino
Die Funktion versagt aber auch wenn mehr als 1 Leerzeichen nebeneinander stehen.
Gruss Rainer
ok. da hab ich auch noch was ;-) ...
26.07.2010 12:02:41
Tino
Hallo,
Sub beispiel()
Dim meAr, i As Integer

'Beispielnamen 
meAr = _
Array("hans          -     günter", "hans- günter", "HANS -GÜNTER", "hans       günter", "HANS   GÜNTER", "hANS-    gÜNTER")

With Application.WorksheetFunction
    For i = 0 To Ubound(meAr)
        MsgBox Namenskorrektur(meAr(i), "-")
    Next i
End With

End Sub

Function Namenskorrektur(ByVal strName$, Delimiter$)
    Do While InStr(strName$, String(2, " ")) > 0
        strName$ = Replace(strName$, String(2, " "), " ")
    Loop
    strName$ = Replace(strName$, " " & Delimiter, Delimiter)
    strName$ = Replace(strName$, Delimiter & " ", Delimiter)
    With Application.WorksheetFunction
        Namenskorrektur = .Clean(.Proper(strName))
    End With
End Function
Gruß Tino
Anzeige
With Application.WorksheetFunction ...
26.07.2010 12:07:14
Tino
Hallo,
im ersten Code ist natürlich überflüssig.
Sub beispiel()
Dim meAr, i As Integer

'Beispielnamen 
meAr = _
Array("hans          -     günter", "hans- günter", "HANS -GÜNTER", "hans       günter", "HANS   GÜNTER", "hANS-    gÜNTER")

For i = 0 To Ubound(meAr)
    MsgBox Namenskorrektur(meAr(i), "-")
Next i


End Sub

Function Namenskorrektur(ByVal strName$, Delimiter$)
    Do While InStr(strName$, String(2, " ")) > 0
        strName$ = Replace(strName$, String(2, " "), " ")
    Loop
    strName$ = Replace(strName$, " " & Delimiter, Delimiter)
    strName$ = Replace(strName$, Delimiter & " ", Delimiter)
    With Application.WorksheetFunction
        Namenskorrektur = .Clean(.Proper(strName))
    End With
End Function
Gruß Tino
Anzeige
Na also. Geht doch :-) :-) o.w.T.
26.07.2010 12:20:26
Ramses
...
AW: Funktion Proper
26.07.2010 11:42:43
Tino
Hallo,
in einer Funktion würde es so machen.
Sub beispiel()
Dim meAr, i As Integer

'Beispielnamen 
meAr = _
Array("hans-günter", "hans - günter", "HANS-GÜNTER", "hans günter", "HANS GÜNTER", "hANS gÜNTER")

With Application.WorksheetFunction
    For i = 0 To Ubound(meAr)
        MsgBox Namenskorrektur(meAr(i), "-")
    Next i
End With

End Sub

Function Namenskorrektur(ByVal strName$, Delimiter$)
    strName$ = Replace(strName$, " " & Delimiter, Delimiter)
    strName$ = Replace(strName$, Delimiter & " ", Delimiter)
    Namenskorrektur = Application.WorksheetFunction.Proper(strName$)
End Function
Gruß Tino
Anzeige
AW: Funktion soll sich selbst aufrufen
26.07.2010 11:25:06
Ramses
Hallo
ist zwar etwas umständlicher als der Code von Tino, dafür werden die Bindestriche und Leerzeichen korrekt gesetzt
Sub AuswertungVorname()
    'Testnamen: hans-günter, hans - günter, HANS-GÜNTER, hans günter, HANS GÜNTER, hANS gÜNTER
    MsgBox "hans günter = : " & Namenskorrektur("hans günter", "-")
    MsgBox "hans -günter = : " & Namenskorrektur("hans -günter", "-")
    MsgBox "hans- günter = : " & Namenskorrektur("hans- günter", "-")
    MsgBox "HANS-GÜNTER = : " & Namenskorrektur("HANS-GÜNTER", "-")
    MsgBox "hANS gÜNTER = : " & Namenskorrektur("hANS gÜNTER", "-")
End Sub

Function Namenskorrektur(Name As String, myDel As String) As String
    Dim NameArr As Variant
    Dim tmpName As String
    Dim i As Integer
    tmpName = ""
    'Unnötige prüfungen vermeiden
    If InStr(1, Name, myDel) = 0 And InStr(1, Name, " ") > 0 Then
        'Leerzeichen im Namen
        NameArr = Split(Name, " ")
        Debug.Print tmpName
        With WorksheetFunction
            For i = 0 To UBound(NameArr)
                tmpName = tmpName & .Proper(NameArr(i)) & " "
            Next i
        End With
        Namenskorrektur = RTrim(tmpName)
        Exit Function
    End If
    If InStr(1, Name, myDel) > 0 Then
        NameArr = Split(Name, myDel)
        For i = 0 To UBound(NameArr)
            tmpName = tmpName & Trim(WorksheetFunction.Proper(NameArr(i))) & "-"
        Next i
        Namenskorrektur = Left(tmpName, Len(tmpName) - 1)
        Exit Function
    End If
    Namenskorrektur = Name
End Function

Gruss Rainer
Anzeige
AW: Funktion soll sich selbst aufrufen
26.07.2010 11:38:50
Martin
Hallo Ramses,
super, vielen Dank! Jetzt klappt es genau so wie ich es mir vorgestellt habe. Könntest du mir eventuell auch noch erklären, weshalb sich meine Funktion nicht selbst aufrufen kann?
Viele Grüße
Martin
AW: Funktion soll sich selbst aufrufen
26.07.2010 11:43:11
Ramses
Hallo
"...NameArr(i) = Namenskorrektur(NameArr(i), " ").."
Weil du hier eine Endlosschleife produzierst.
Der Arrayeintrag "NameArr(i)" ruft die eigene Funktion immer wieder neu auf mit neuem Parameter als Übergabe.
Die Funktion "Namenskorrektur" darf nur zum Schluss mit dem letzendlichen Ergebnis gefüllt werden
Gruss Rainer
AW: Funktion soll sich selbst aufrufen
26.07.2010 11:45:11
Martin
Hallo Rainer,
okay, auch nochmal vielen Dank für die Erklärung meines Fehlers!
Viele Grüße
Martin
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige