Legen Sie eine Zelle Wert aus einer Funktion
Den Inhalt der Zelle A1
ist =test(2)
wo test
ist die Funktion:
Function test(ByRef x As Double) As Double
Range("A2") = x
test = x * x
End Function
Können Sie erklären, warum diese gibt #VALUE!
in Zelle A1
und nichts in der Zelle A2
? Ich erwartete A2
enthalten 2
und A1
enthalten 4
. Ohne die Linie Range("A2") = x
die Funktion wie erwartet funktioniert (Quadratur der Wert einer Zelle).
Was ist wirklich verwirrend ist, wenn Sie wickeln test
mit dem Unterprogramm calltest
dann funktioniert es:
Sub calltest()
t = test(2)
Range("A1") = t
End Sub
Function test(ByRef x As Double) As Double
Range("A2") = x
test = x * x
End Function
Aber nicht
Function test(ByRef x As Double) As Double
Range("A2") = x
End Function
Wie im stackoverflow.com/questions/8520732/... ist es eigentlich möglich, eine UDF-Datei zu ändern, eine andere Zelle, aber es ist hässlich.
InformationsquelleAutor Chris Seymour | 2013-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Aufruf einer Funktion aus einer Arbeitsblatt-Zelle, Sie effektiv über die Funktion als benutzerdefinierte Funktion, die die Grenzen, wie hier beschrieben:
http://support.microsoft.com/kb/170787
In dem text eine Zeile:
Es ist interessant, wie verwenden Sie das Wort sollte eher als muss. Ich Frage mich, ob der Autor der KB wusste, dass die Umgebung sich ändert kann passieren, aus einer VBA-Funktion.
Nun, wenn Sie rufen Sie die Funktion aus einem anderen VBA-Sub /Function, es wird anders behandelt. Aus dem Hilfe-docs (sorry, ich konnte nicht finden, dass eine Webseite verweisen - im Prinzip, in VBE, markieren Sie das Wort Function und F1 drücken):
Hört sich So an Subs und Funktionen können die gleichen Dinge tun, wenn in VBA nur, außer, dass Funktionen können Rückgabewerte zurück an den aufrufenden Funktion/sub.
Dies ist ziemlich interessant, da Excel eine Funktion mit irgendeiner Art von "Read-Only" - Beschränkung auf der Excel-Umgebung.
Ich denke, dass, am Ende, kann Excel Aufruf der Funktion aus einer Arbeitsblatt-Zelle in einer anderen Weise als VBA funktioniert. Beim Aufruf aus einer Zelle, es als eine benutzerdefinierte Funktion, die auch die Einschränkungen für das ändern von Excel-Umgebung. Wo, wenn aus aufgerufen, in VBA (wo die original Anrufer aus einer Kette von aufrufen aus VBA), es hat alle macht, einen Sub hat, plus es können Werte zurückgeben.
Application.EnableEvents
, zum Beispiel. ...das ist eine schöne Quelle der unerwartete Fehler und unbeabsichtigte Verhalten.Yep, das war das Problem hier auch. Verdammt nervig!
InformationsquelleAutor Joseph
Aufgrund
Function
Grundlagen, die behaupten, dass Sie nicht ändern können oder set Blech-Zellen. Löschen Sie die Zeile mitRange("A2") = x
BEARBEITEN Einige zusätzliche link (was ich glaube, ist immer sehr nützlich für diejenigen, die wollen, um zu analysieren, UDF Thema): Erstellen von benutzerdefinierten Funktionen von Microsoft
Es gibt einige andere Regeln, die Ergebnisse sind, dass die Funktionen, die in Excel-App muss strenger sein, dass die in VBA. Daher schreiben und die Benutzung von UDF ' s ist ein bisschen schwierig.
Ein Unterprogramm ist erlaubt zu manipulieren Zellen im Arbeitsblatt, und eine Funktion nicht. Eine Funktion kann nur einen Wert zurückgeben zu sich selbst (oder eine variable, die in einem anderen Unterprogramm)
dies erklärt nicht, warum eine Funktion kann ändern der Arbeitsblatt-Zellen beim Aufruf von einem Unterprogramm aber nicht, wenn direkt aufgerufen?
siehe die Antwort hier für die möglicherweise eine bessere Erklärung. Es scheint, dass Excel behandelt ein UDF anders, wenn es heißt aus einer Arbeitsblatt-Zelle, als wenn er aufgerufen wird eine subroutine. Ich hab früher immer Funktionen, die nur auf return - Werte (D. H., aufteilen & rationalisieren Berechnung der Schritte) Unterprogramme, die dann die subroutine legt der Wert der Zelle.
InformationsquelleAutor Kazimierz Jawor