2017-11-21 2 views
1

Ich habe ein MS Access-Formular mit einer Listbox mit Liste der Verfahren. Die Prozedurcodes sind im Formular gespeichert. Es gibt auch einen Knopf. Wenn ich auf eine Schaltfläche klicke, möchte ich, dass sie die Listbox durchläuft und die Prozeduren von den ausgewählten Elementen ausführt. Ich rufe die Prozeduren mit Call und Application.Run auf, aber beide Methoden geben Fehler.MS Access Call/Application.Run Prozedur gespeichert als Variable funktioniert nicht

Anruf 'Kompilierfehler: Erwartete Sub, Funktion oder proeprty
Application.Run' MS Access kann das Verfahren 'Name der Prozedur' nicht finden

Private Sub button_Click() 

With Me.listbox1 
    For Each varItem In .ItemsSelected 
     currSub = .ItemData(varItem) 
     If Not IsNull(varItem) Then 
      Call currSub 'Compile Error: Expected Sub, Function, or Proeprty     
      Application.Run currSub 'MS Access cannot find the procedure 'Name of Procedure' 
     End If 
    Next 
End With 

Sub NameOfcurrSub1() 
    'some code 
End Sub 

Sub NameOfcurrSub2() 
    'some code 
End Sub 
etc. 

Antwort

2

Wenn Sie eine Unter nennen Application.Run verwenden, Sie müssen es in einem separaten Standardmodul (.bas, nicht .cls) speichern. Verschiebe deine Subs zu einem separaten Modul und es wird funktionieren.

Das Schlüsselwort Call ist veraltet und ruft keine auf einer Zeichenfolge basierende Funktion auf.

+0

Das hat perfekt funktioniert! Vielen Dank. – user6762734

2

Ein Formular ist ein Klassenmodul, ist seine laufende Instanz ein Objekt: Application.Run funktioniert nicht Objekte aus. Wenn Sie die Methoden eines Objekts aufrufen möchten, müssen Sie CallByName verwenden und die Objektinstanz angeben, die Me ... wäre. Sie können Me nicht direkt an CallByName übergeben, damit Sie eine lokale Variable zur Proxy-Verarbeitung des Aufrufs implementieren können :

Dim localMe As Object 
Set localMe = Me 
CallByName localMe, currSub, vbMethod ', arguments would go here 

Oder die Verfahren bewegen Sie, wie in Erik's answer zu einem separaten, Standardmodul aufrufen wollen.

Call DoSomething ist 100% identisch mit DoSomething: Ersteres ist die veraltete explizite Aufruf Syntax, wobei letztere der häufiger verwendeten implizite Aufrufsyntax ist. Beide werden zur Kompilierzeit validiert, was bedeutet, dass Call NonExistingProcedure einen Kompilierfehler auslösen würde, so wie das beim Aufruf von NonExistingProcedure der Fall wäre.

Verwandte Themen