2017-05-16 3 views
2

Ich möchte in der Lage sein, Anwendungsfunktionen wie left() und right() mit einer String-Variable aufzurufen.Excel VBA - Aufruf der Anwendungsfunktion (links, rechts) nach Name

Der Grund ist, dass mein derzeitiger Code gut funktioniert, aber mehrere Instanzen von left() und right() hat, die sich jedes Mal ändern müssen, wenn ich es ausführe. Ich möchte es nur einmal ("global") jedes Mal ändern können.

Nach googeln habe ich versucht, CallByName und Application.Run. Es scheint, dass sie nur mit einer benutzerdefinierten Klasse/Makro arbeiten. Ist das wahr? Gibt es noch etwas, das ich untersuchen sollte? Ich brauche keinen spezifischen Code, danke!

+0

Was versuchst du zu tun? Was ist der Code bisher? Sie versuchen, 'LEFT()' in VBA zu verwenden? – BruceWayne

+0

Ich verstehe nicht, was Sie mit String-Variable meinen. Meinst du damit, dass die Sache an die Funktion übergeben wird, Right ("TheLastLetterIsR", "1") wo die Zahl 1 eine Zeichenkette ist? –

Antwort

3

Sie können eine benutzerdefinierte Funktion erstellen, die Sie übergeben, wenn Sie Left oder Right möchten.

Option Explicit 

Sub Test() 

    Debug.Print LeftRight("L", "StackOverflow", 5) 
    Debug.Print LeftRight("R", "StackOverflow", 8) 

End Sub 

Function LeftRight(sWhich As String, sValue As String, iLength As Integer) As String 

    Select Case sWhich 

     Case "L": LeftRight = Left(sValue, iLength) 
     Case "R": LeftRight = Right(sValue, iLength) 

    End Select 

End Function 

Sie verwenden einfach "L" oder "R" wie benötigt. Ändern Sie es einmal und übergeben Sie als sWhich jedes Mal. Sie können sogar eine Zellreferenz dafür verwenden und die Zelle aktualisieren, bevor Sie Code ausführen.

Ergebnisse

Stapel

Überlauf

+0

Ich versuchte zu vermeiden, meine eigene Funktion zu schreiben, aber es scheint, als gäbe es keinen Weg um sie herum. Vielen Dank! – lemon

1

Der einfachste Weg um dies zu ersetzen ist alle Ihre Left und Right Anrufe mit einer generischen Funktion, z. statt

x = Left("abc", 2) 

sagen

x = LeftOrRight("abc", 2) 

und haben dann eine Funktion

Function LeftOrRight(str As Variant, len As Long) As Variant 
    'Uncomment this line for Left 
    LeftOrRight = Left(str, len) 
    'Uncomment this line for Right 
    LeftOrRight = Right(str, len) 
End Function 

Dann können Sie nur die eine Funktion entsprechend ändern.

+0

Vielen Dank für Ihre großartige Antwort! Ich wählte Scott Holtzmans Lösung, weil ich sie zusammen mit meinen anderen Variablen im Hauptmodul ändern konnte. – lemon

1

Sie auch SWITCH verwenden könnte Scotts Idee (keine Fehlerbehandlung, wenn String-Länge ist ungültig) zu implementieren:

Sub Test() 
    Debug.Print LeftRight("L", "StackOverflow", 5) 
    Debug.Print LeftRight("R", "StackOverflow", 8) 
End Sub 

Function LeftRight(sWhich As String, sValue As String, iLength As Integer) As String 
    LeftRight = Switch(sWhich = "L", Left$(sValue, iLength), sWhich = "R", Right$(sValue, iLength)) 
End Function 
+0

cool - Ich habe gerade etwas Neues gelernt. –

Verwandte Themen