Nur benutzerdefinierten Typs definiert, die in öffentlichen objektmodulen kann genötigt, wenn Sie versuchen, rufen Sie eine externe VBA-Funktion
Bin ich versucht, rufen Sie eine Access-Funktion von Excel und bekomme diese Fehlermeldung:
Kompilieren-Fehler: Nur benutzerdefinierte Typen in öffentlichen Objekt
Module werden dazu gezwungen oder von einer Variante oder übergeben zu spät-gebunden
Funktionen.
Habe ich versucht, dies zu übernehmen Lösung ich gefunden, aber ohne Glück. Hier ist mein code:
In der Excel-Modul ExternalStatistics
Option Explicit
Public Type MyExternalStatistics
esMyInvites As Single
esMyInvitePerTalk As Single
End Type
Public MyExtRecStats As MyExternalStatistics
In der Tabelle1(Ein-Schritt-Nummern) Objekt:
Option Explicit
Public appRecruitingAccess As Access.Application
Public Sub Worksheet_Activate()
Dim MyExtRecStats As MyExternalStatistics
Dim RecruitWindow As Integer
Dim test As String
Set appRecruitingAccess = New Access.Application
With appRecruitingAccess
.Visible = False
.OpenCurrentDatabase "C:\Dropbox\RECRUITING\Remote0\Recruiting 0.accdb"
RecruitWindow = DateDiff("d", Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveStart").Value), Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveEnd").Value))
RecruitWindow = DateDiff("d", Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveStart").Value), Format(Date, Worksheets("ActivityAndIncentive").Range("IncentiveEnd").Value))
MyExtRecStats = .Run("ExternalRecruitingStats", RecruitWindow) '*** ERROR HERE ***
.CloseCurrentDatabase
.Quit
End With
Set appRecruitingAccess = Nothing
End Sub
In der Access-Modul ExternalStatistics
Option Compare Database
Option Explicit
Public Type MyExternalStatistics
esMyInvites As Single
esMyInvitePerTalk As Single
end Type
Public Function ExternalRecruitingStats(StatWindow As Integer) As MyExternalStatistics
Dim MyRecStats As MyExternalStatistics
Dim Invites As Integer, Talks As Integer
Invites = 1
Talks = 2
With MyRecStats
.esMyInvites = CSng(Invites)
.esMyInvitesPerTalk = CSng(Invites/Talks)
End With
ExternalRecruitingStats = MyRecStats 'return a single structure
End Function
Es nicht wie die MyExtRecStats = .Run("ExternalRecruitingStats", RecruitWindow)
- Anweisung. Ich möchte schließlich weisen mehrere Satz in der Access-Funktion, und bringen Sie Sie alle wieder mit einem Objekt. Dann kann ich die Werte wo Sie sein sollten in der Tabelle.
- Gibt es einen Grund, Sie sind nicht mit einer Abfrage an die Datenbank in Excel zu ziehen, die Daten, die Sie brauchen? Es scheint mir, dass wäre einfacher und effizienter.
- Schließlich werde ich brauchen, um die Funktion von mindestens 36 Punkte von Daten zurück in Excel. Ich war mit einer Schnur und Parsen der Zeichenfolge, die arbeiten war, aber die Untersuchungen habe ich oben schien ein effizienter Weg, um es getan. Ich bin mir nicht bewusst eine Abfrage Ansatz, die könnten das für mich tun. Offen für Vorschläge...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Typ-Definitionen in VBA sind sehr lokal und es funktioniert nicht gut, wenn Sie versuchen, Sie mit Objekten, die möglicherweise nicht über Zugriff auf die genaue definition der Art (was wohl hier der Fall).
Manchmal, mit einem
Class
arbeiten kann. Würden Sie benötigen, um die Klasse öffentlich und instanziieren Sie es vor der übergabe um, aber ich habe einige Zweifel, dass es tatsächlich funktioniert (aus dem gleichen Grund, dass die definition der Klasse nicht sichtbar, von einer app in die andere).Andere einfache Lösung wäre die Verwendung einer einfachen
Collection
Objekt statt, wo Sie fügen Sie Ihre Werte als Elemente der Auflistung. Natürlich ist die genaue Reihenfolge, wie Sie hinzufügen/abrufen der Elemente wichtig ist.Gibt es ein paar interessante Antworten zu einem ähnlichen Problem in User Defined Type (UDT) Als Parameter In Public Sub Im Klassenmodul. Es geht um VB6, aber es sollte auch gelten zu einem großen Teil auf VBA.
Having said all dies, können Sie in der Lage sein, zu lösen alle Ihre Probleme durch Import der Access-code in Excel statt.
Sie verwenden DAO oder ADO aus Excel und Bearbeiten von Access-Datenbanken genauso wie wenn man in Excel zum Beispiel: