2016-11-29 6 views
0

Ich habe ein Add-in erstellt, das über 1 Ribbon-Steuerelement verfügt, das eine SQL-Anweisung für eine Access DB ausführt und das Ergebnis eine Zelle auf der rechten Seite einfügt. Das funktioniert perfekt. Es heißt SubTest (c wie iribboncontrol) Ich habe auch eine andere Untereinheit namens GetData (arg1, arg2), die ich aus dem Arbeitsblatt verwenden wollte, als = GetData ("01/02/2016", "Open") und dann eins auf der rechten Seite wird das angepasste SQL zurückgegeben. Das klappt alles ok, bis das Einfügen ActiveCell.Offset(1, 1).CopyFromRecordset rstData klapperfrei funktioniert, aber nicht vom Funktionsaufruf, mir fehlt etwas einfaches.Addin Funktion, Referenz aktives Arbeitsblatt

get Daten zu haben, wie so, immer noch Fehler gibt

public sub get_data() 
    activecell.offset(1,1).value="TEST" 
end sub 

Vielen Dank

+3

Eine Funktion, die von einer Zelle als Arbeitsblattfunktion aufgerufen wird, kann den Wert einer anderen Zelle oder Zellen nicht ändern. –

+0

Prost, ich habe auf etwas Besonderes gehofft, Ad-hoc-Anfragen zu erstellen :) –

Antwort

3

A Funktion Ein- und kehrt nimmt ein Wert. Es kann nicht Nebenwirkungen haben. Daher können Sie eine Prozedur, die Zellwerte innerhalb einer Funktion ändert, die aus einer Arbeitsblattzelle as Scott Craner already mentioned aufgerufen wird, nicht aufrufen.


Es gibt eine Reihe von Dingen, die mit diesem obwohl falsch sind:

Public Sub get_data() 
    ActiveCell.Offset(1,1).Value="TEST" 
End Sub 

-Code, der auf ActiveCell beruht bedeutet, dass Sie anderen Code, der Select und Activate verwendet. Dies macht Ihren Code extrem anfällig und Fehler/Fehler anfällig, vermeiden Sie sie (see how).

Vermeiden Sie Unterstriche in Prozedurnamen; Verwenden Sie stattdessen PascalCase. Dies ist nicht nur "weil es Konvention ist" - VBA wird sich weigern, komplexeren Code zu kompilieren, der Unterstriche in den Namen von Interface-Membern hat; Wenn Sie also niemals Schnittstellen und das Schlüsselwort Implements verwenden, sollten Sie Unterstriche in den Elementnamen vermeiden. In VBA hat der Unterstrich eine spezielle Bedeutung, wie sie in Event-Handler-Prozeduren zu sehen sind: ObjectName_MemberName, z.B. Button1_Click.

Namen Dinge für das, was sie tun. "get data" wäre der Name einer Funktion, die einen Wert "bekommt" und zurückgibt. Eine Sub, die etwas "bekommt", macht keinen Sinn. Ihre Prozedur "bekommt" nichts, sie "setzt" einen Wert wenn überhaupt.


Function Verfahren von VBA-Code genannt kann auf jeden Fall haben Nebenwirkungen. Tatsache ist, in einer idealen Welt sollten sie nicht ; Verwenden Sie stattdessen Prozeduren für Seiteneffektcode. Excel-Tabellenfunktionen sind reine Funktionen, und benutzerdefinierte Funktionen sind erforderlich mehr oder weniger reine Funktionen als auch sonst können sie einfach nicht in einem Arbeitsblatt verwendet werden. Nehmen Sie eine Eingabe, berechnen Sie einen Wert, geben Sie diesen Wert zurück: Das ist alles Funktion tut.