2016-09-08 2 views
0

Lange Rede kurzer Sinn, ich versuche, meine benutzerdefinierte Funktion als Teil der Funktion den Formeleintrag zu erweitern (der, der es ausgelöst hat!). Hier ist ein destilliertes Beispiel:Excel: Benutzerdefinierte Funktion, die sich selbst repariert?

Private Function heythere(blah As String) 
    extraBit = "title" 
    ActiveCell.Formula = Replace(ActiveCell.Formula, ")", "," & """" & extraBit & """" & ")") 
End Function 

Grundsätzlich dass extraBit durch eine Userform ListBox definiert ist, wenn der Benutzer nicht hinzufügen, es in die Formel. Es gibt viele Optionen, die basierend auf dem ersten Argument des Eintrags dynamisch in die ListBox geladen werden. Es ist ein wenig schwierig zu erklären, aber wenn die extraBit in der Formel zur Verfügung gestellt wird, bedeutet dies, dass das UserForm nicht erscheint und das Ergebnis direkt angegeben wird. Also ich möchte den Eintrag "reparieren", nachdem die extraBit definiert ist. Im Wesentlichen würde in dem obigen Beispiel =heythere(a1)=heythere(a1,"title") werden.

Ist das möglich? Ich habe versucht, einen separaten privaten Sub zu erstellen, um den Eintrag zu überschreiben, ohne Erfolg. Vielen Dank im Voraus für irgendwelche Vorschläge ...


Edit: Um zu klären, wie es funktionieren soll, ist die tatsächliche UDF eher wie diese mit einem optionalen Sekundär Argumente:

Private Function heythere2(blah As String, Optional extraBit As String) 
    If extraBit = "" Then 
     extraBit = "title" 
     ActiveCell.Formula = Replace(ActiveCell.Formula, ")", "," & """" & extraBit & """" & ")") 
    End If 
End Function 
+0

Ich bin mir nicht sicher, ob ich den Anwendungsfall verstehe. Warum nicht einfach einen optionalen zweiten Parameter für heythere? – Comintern

+0

Entschuldigung, ich habe den zweiten Parameter entfernt ... lassen Sie mich es wieder hinzufügen und etwas darüber ausarbeiten, wie es funktioniert ... – David

+0

Hm, was ist, wenn: Speichern Sie Ihre Formel als String. Verwenden Sie dann eine beliebige Methode, um diese Zeichenfolge mit Ihrem 'extraBit' zu aktualisieren. Dann können Sie 'Cells (1,1) .Formula = myString' machen? In Ihrem Beispiel funktioniert es sogar? Oder erhalten Sie Fehler? – BruceWayne

Antwort

2

Das Problem Excel hat keine Ahnung, was Sie mit der Formel machen wollen und der Rückgabewert ist nicht gültig. Dies wird Ihnen zeigen, dass Sie einen Fehler finden. Wenn dies eine UDF ist, geben Sie eine Endlosschleife ein, da bei jeder Änderung der Zelle der Code erneut ausgeführt wird. Überdenken Sie Ihren Ansatz.

Public Function heythere(blah As String, Optional extraBit As String = "") 
    On Error Resume Next 
    Dim formulaText As String 
    formulaText = ActiveCell.Formula 
    If extraBit = "" Then 
     extraBit = "title" 
    End If 
    formulaText = Replace(formulaText, ")", "," & Chr(34) & extraBit & Chr(34) & ")") 
    ActiveCell.Formula = formulaText 

    If Err.Number <> 0 Then 
     MsgBox Err.Description 
    End If 
End Function 

So ändern Bit Ihre Formel lässt und verwenden Sie das Arbeitsblatt Änderungsereignis

'Lets set the text of the cell to the value of the extrabit 
Public Function heythere(blah As String, Optional extraBit As String = "") As String 
    If extraBit = "" Then 
     extraBit = "title" 
    End If 
    heythere = extraBit 
End Function 

Jetzt aktualisieren wir die Formel unser Arbeitsblatt geändert Ereignis

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    If InStr(1, Target.Formula, ",") > 0 Then 

    Else 
     On Error Resume Next 
     Dim formulaText As String 
     formulaText = Target.Formula 

     formulaText = Replace(formulaText, ")", "," & Chr(34) & Target.Value & Chr(34) & ")") 
     Target.Formula = formulaText 

     If Err.Number <> 0 Then 
      MsgBox Err.Description 
     End If 
    End If 
End Sub 

Viola verwenden, wird die Formel aktualisiert. IMO, das ist immer noch ein schlechter Ansatz, denn dann müssten Sie überprüfen, welche Formel in der Zelle ist, bevor Sie darauf reagieren.

+0

Vielen Dank - Sorceri mit Namen ... :-) Das funktioniert, super. Ich arbeite am Check-Verfahren, um es so knapp wie möglich zu machen. Vielen Dank! – David

Verwandte Themen