Search code examples
ms-accessvbadecompiler

Getting at VBA/Access Source Code


I'm rewriting a legacy access / VBA application in C#. While I am limited as a VBA programmer I am under the impression that the code is minimally compiled and runs almost as a script ? Obviously no security / VBA you can just hit alt + f11 to get at the source code is there a good way to decompile / get at this code?

So I tried this: http://forums.databasejournal.com/showthread.php?t=34222

which appears to be about how to decompile .mdb files.

However the program quickly recompiled itself - or at least says it is recompiling itself in the lower left status bar. Any ideas?


Solution

  • Here are some suggestions (some of which I'm repeating from comments I've made above):

    • Alt-F11 is not my usual method of opening the VBE, because I usually want to go to the Immediate Windows. Try Ctrl-G, instead.

    • If both Alt-F11 and Ctrl-G fail to open the VBE, then perhaps the AllowBypassKey property of the database has been changed to False. To get code to change this, search the Access help file for AllowBypassKey (in the VBE, from the help menu, search for "AllowBypassKey"). However, you won't be able to run the code within the database you're trying to investigate if AllowBypassKey is turned OFF, so you can run this code:

    //

      On Error GoTo Change_Err
        Dim db As DAO.Database
        Dim prp As Variant
        Const conPropNotFoundError = 3270
    
        Set db = DBEngine.OpenDatabase("C:\Databases\MyDatabase.mdb")
        db.Properties("AllowBypassProperty") = True
    
      exitRoutine:
        If Not (db Is Nothing) Then
           db.Close
           Set db = Nothing
        End If
        Exit Sub
    
      errHandler:
        If Err = conPropNotFoundError Then    ' Property not found.
           ' do nothing and exit
           Resume exitRoutine
        End If
    

    Then you should be able to open the database when holding down the SHIFT key (which bypasses any defined startup routines, which might have been shutting off access to the VBE).

    • If the file is an MDE, there is no source code. You can find out if it's an MDE by checking this property:

      ?CurrentDB.Properties("MDE")

    If it's an MDE (the file can have any extension), this will return "T". If it's not an MDE, it will throw an error (because the property doesn't exist).

    • Other things to check might be how many modules there are. If you have the database open and can get to the Immediate Windows (Ctrl-G), then this will tell you if there are any modules:

    //

      ?CurrentProject.AllModules.Count
    
    • You also might be able to see what's in the database by opening up the Object Browser in the VBE (F2) and selecting the project name in the dropdown at the top (it will say "" by default

    • Last of all, you may think that it could be protected by Jet ULS, but starting with Access 2000, that's not a big possible, as there's nothing but a password on the VBA project available (i.e., it's no longer covered under Jet ULS). I would expect that if it were password-protected, you'd be prompted for the password somewhere along the line, so you'd already know that.