2016-04-01 7 views
0

Ich definierte eine VBA-Funktion, die eine Dateigröße zurückgibt. Jetzt möchte ich es mit einer Schaltfläche aufrufen, die ein anderes Makro aufruft. Meine Erwartung ist, dass nach dem Ausführen des Makros meine Funktion am Ende aufgerufen wird. Mein Problem ist, dass wenn ich eine Formel in eine Zelle einfüge, sie eine aktuelle Dateigröße nur in dem Moment zurückgibt, in dem ich die Formel eintrage. Wenn ich die Datei bearbeite, sie speichere und neu öffne, zeigt das = wbksize() immer noch die Dateigröße vor meinen Änderungen an.Führen Sie VBA-Funktion mit einer Schaltfläche

Der Zweck dieses Makros, das über eine Schaltfläche ausgeführt wird, besteht darin, den Wert der Dateigröße zu aktualisieren. Hier ist mein Versuch, es zu tun.

Funktion:

Function wbksize() 
    myWbk = Application.ThisWorkbook.FullName 
    wbksize = FileLen(myWbk) 
End Function 

refresh:

Worksheets("Sheet2").Range("K1").Calculate 

Die oben nicht zu funktionieren scheint:/

+2

Es sieht so aus, als ob Sie nicht die Ausführung Ihres Makros/Funktion auslösen. Standardmäßig wird die Funktion nicht ausgeführt, nur weil Sie die Arbeitsmappe berechnen. Funktionen, die dies berechnen, werden als "flüchtig" bezeichnet, und Sie können sie explizit definieren, indem Sie 'Application.Volatile' am oberen Rand der Funktion hinzufügen. Weitere Informationen finden Sie hier: http://excel.tips.net/T002013_Forcing_a_Macro_to_Run_when_a_Worksheet_is_Recalculated.html –

+0

Alternativ können Sie, wenn Sie Ihre Funktion nur ausführen möchten, wenn Sie auf die Schaltfläche klicken, der Funktion Ihre Funktion zuweisen. Klicken Sie auf die Schaltfläche und wählen Sie "Makro zuweisen" (vorausgesetzt, Ihre Schaltfläche ist eine grundlegende Formularsteuerung und kein ActiveX-Steuerelement), dann sollte Ihr Funktionsname in dem Dialog aufgeführt sein, den Sie auswählen können. –

+2

Funktionen geben einen Wert zurück und können daher nicht mit einer Schaltfläche aufgerufen werden (da der Wert nicht zurückgegeben werden kann). Sie müssten es einkapseln, wie in Michal Wolinskis Antwort. – Vegard

Antwort

1

Funktion funktioniert gut, aber erfrischend sollte Funktion aufrufen.

Function wbksize() As String 
    myWbk = Application.ThisWorkbook.FullName 
    wbksize = Str(FileLen(myWbk)) 
End Function 
Sub Refresh() 
    Worksheets("Sheet2").Range("K1") = wbksize 
End Sub 
+0

Michał - es scheint als sehr vernünftige Lösung, aber ich bekomme Subskript außerhalb des Bereichs. Ich löste es mit 'Sub Refresh() Dim wsToRefresh Als Arbeitsblatt Set wsToRefresh = Sheets (2) Set rngToRefresh = wsToRefresh.Range ("K1") rngToRefresh = wbksize Ende Sub' Das Problem Ist das, wenn ich Sub, die an den Trigger-Button gepinnt ist, und es gibt eine Zeile dort "Call Refresh" gibt es keine Änderung in Sheet2.K1.Egal ob die Zelle '= wbksize()' enthält oder leer ist. Ich bin wirklich dumm über VBA, also bitte sei explizit. Vielen Dank! –

+1

Ich bekomme es geändert. Überprüfen Sie, ob Sie es als Makro eingebettet oder wenn der Fehler in einem anderen Teil des Codes ist. Wenn Sie es aufrufen möchten, wenn die Arbeitsmappe berechnet wird, nennen Sie es wie oben angegeben 'Private Sub Worksheet_Calculate()'. –

0

Dies kann oder möglicherweise nicht in Ihrer Situation helfen .... LINK

Ich habe nie gebraucht, um dies auf Excel verwenden, aber es ist vielleicht, was Sie suchen R, Sie können benutzerdefinierte Funktionen als "VOLATILE", die Kräfte übertreffen, um sie auszuführen, wann immer etwas berechnet werden, wieder habe ich nie gebraucht, so dass ich nicht auf irgendwelche Nachteile oder irgendetwas kommen kann, aber es sieht aus wie es in Ihrem Fall funktionieren kann.

0

Ich habe diese getestet, und sie funktionieren beide gut. Es hängt davon ab, was Ihr Trigger sein soll: Ändern Sie das Arbeitsblatt, oder führen Sie eine Berechnung auf dem Arbeitsblatt aus.

Legen Sie eines dieser Elemente in Ihr Arbeitsblatt ein. Der erste wird auf Calculate, der zweite auf Change ausgelöst.

Private Sub Worksheet_Calculate() 
Dim lFileLength As Long 
    Application.EnableEvents = False 'to prevent endless loop 
    lFileLength = FileLen("\\MyFile\Path\AndName.XLS.XLS") 
    ThisWorkbook.Sheets("Sheet1").Range("A1").Value = CStr(lFileLength) 
    MsgBox "You changed THE CELL!" 
    Application.EnableEvents = True 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim lFileLength As Long 
    Application.EnableEvents = False 'to prevent endless loop 
    lFileLength = FileLen("\\MyFile\Path\AndName.XLS") 
    ThisWorkbook.Sheets("Sheet1").Range("B1").Value = CStr(lFileLength) 
    MsgBox "You changed THE CELL!" 
    Application.EnableEvents = True 
End Sub 
+0

Simon, geht Ihr Worksheet_Calculate() davon aus, dass ich einen statischen Dateinamen und Pfad habe? Meine Tabelle wird oft aktualisiert und der Dateiname changiert, weil er aus der Versions-ID besteht. Außerdem werden neue Versionen an verschiedene Empfänger gesendet und der Dateipfad muss dynamisch überprüft werden. In diesem Fall weiß ich, dass CELL ("Dateiname") hilfreich ist. –

Verwandte Themen