2015-06-16 38 views
5

Dato un oggetto di database in VBA di MS Access, come si può ottenere VBProject di quel database?Ottieni il VBProject di un database

Function GetVBProject(ByVal db As Database) As VBProject 
    Set GetVBProject = ??? 
End Function 

L'unico modo che conosco come ottenere VBProjects in accesso è attraverso Application.VBE.VBProjects.Item(???). Tuttavia, non saprò in che ordine si trovano i progetti e quale sia il nome. Saprò solo il suo database dei genitori. L'equivalente in Excel sarebbe semplicemente

Function GetVBProject(ByVal wb As Workbook) As VBProject 
    Set GetVBProject = wb.VBProject 
End Function 

risposta

4

Guardate nella raccolta VBProjects e verificare la proprietà di ogni progetto FileName. Se il FileName di un progetto è il file di database corrente (CurrentDb.Name), quello è quello desiderato.

Public Function ThisProject() As String 
    Dim objVBProject As Object 
    Dim strReturn As String 
    For Each objVBProject In Application.VBE.VBProjects 
     If objVBProject.FileName = CurrentDb.Name Then 
      strReturn = objVBProject.Name 
      Exit For 
     End If 
    Next 
    ThisProject = strReturn 
End Function 

Tale funzione restituisce il nome del progetto. È possibile utilizzare il nome per impostare un riferimento all'oggetto VBProject. In alternativa, è possibile modificare la funzione per restituire VBProject anziché una stringa.

Ho appena testato questo, quindi sono incerto objVBProject.FileName = CurrentDb.Name sarà la condizione di test corretta per ogni situazione. Ma spero che questa risposta ti dia qualcosa di utile su cui costruire.

Ho esaminato objVBProject.FileName rispetto a CurrentDb.Name quando il db viene aperto da una lettera di unità e da un percorso UNC a una condivisione di rete. In entrambi i casi, sembra objVBProject.FileName e CurrentDb.Name sia "auto-regolare" e abbinare ancora l'un l'altro:

' db opened from a drive letter ... 
? CurrentDb.Name 
C:\share\Access\BigDb_secure.mdb 
? application.VBE.VBProjects("BigDb_secure").FileName 
C:\share\Access\BigDb_secure.mdb 

' db opened from UNC path to network share ... 
? CurrentDb.Name 
\\HP64\share\Access\BigDb_secure.mdb 
? application.VBE.VBProjects("BigDb_secure").FileName 
\\HP64\share\Access\BigDb_secure.mdb 
+0

Usando il nome del file. Inteligente. ++ – RubberDuck

+1

Non sarà corretto se il file di Access si trova su un percorso relativo. 'CurrentDb.Name' userà la lettera di unità per un'unità mappata ma' VBProject.FileName' restituirà il percorso di rete. – cheezsteak

+0

@cheezsteak Non sei sicuro di cosa intendessi per percorso relativo. Stai parlando di qualcosa di diverso dai casi di test che ho aggiunto alla risposta? – HansUp