I have been using the fantastic Rubberduck VBE add-in to do unit testing on my project code. As a result I was ending up with a lot of test modules cluttering up my add-in code. So, I have pulled out all of my test code into a separate macro enabled (pptm in my case) file. To speed up switching between working on the main code in one file and running tests in the other, I have set up some automation for creating an add-in from the first pptm file and adding this as a reference for use by the test code. It works fairly well - but any comments for improving it would be great!
This example is from PowerPoint - but would be similar for other Office formats.
Saving code to be tested as an add-in:
Code in the file doing the testing:Application.ActivePresentation.SaveAs "\path\for\addin\under\test", ppSaveAsOpenXMLAddin
(Run LoadAddIn - with the name of the project you saved and the full path to its add-in file).
Option Explicit ' Loads or reloads the add-in to test Public Sub LoadAddIn(ByVal stSrcProjectName, ByVal stSrcAddInPath) Dim stAddInCopyPath As String stAddInCopyPath = LAM_TmpFilePath() If LAM_RefExists(stSrcProjectName) Then LAM_DeleteRef stSrcProjectName Debug.Print "Existing add-in - " & stSrcProjectName & " - de-referenced." End If ' Clear out old temporary files. Note, any add-ins that have been referenced ' since ppt was last opened may not be deletable even if they are no longer ' referenced. These can be deleted by closing and opening ppt and running ' this procedure: Dim lngFileDeleteCount As Long lngFileDeleteCount = LAM_RemoveTempFiles() If lngFileDeleteCount > 0 Then Debug.Print "Number of temporary files deleted: " & lngFileDeleteCount End If Dim fso Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExists(stSrcAddInPath) Then ' Copy the file to a new file for loading - if it is loaded with the ' original file name we will not be able to save new versions of the ' source file without closing this file. fso.CopyFile stSrcAddInPath, stAddInCopyPath Debug.Print "Source file:" & vbCrLf & stSrcAddInPath & vbCrLf & _ "found. Last modified:" & vbCrLf & _ fso.getfile(stSrcAddInPath).datelastmodified Else Debug.Print stSrcAddInPath & vbCrLf & "could not be found." Exit Sub End If If Not fso.FileExists(stAddInCopyPath) Then Debug.Print "The temporary copy of the add-in could notbe created at:" & _ stAddInCopyPath & vbCrLf & "The add-in has not been loaded." Exit Sub End If Application.ActivePresentation.VBProject.References.AddFromFile stAddInCopyPath If LAM_RefExists(stSrcProjectName) Then Debug.Print "Add-in - " & stSrcProjectName & " - loaded." Else Debug.Print "Failed to load add-in - " & stSrcProjectName & "." End If End Sub Public Sub UnloadAddIn(ByVal stSrcProjectName) If LAM_RefExists(stSrcProjectName) Then LAM_DeleteRef stSrcProjectName Debug.Print "Existing add-in - " & stSrcProjectName & " - de-referenced." Else Debug.Print stSrcProjectName & " was not found in the list of references." End If End Sub ' This removes as many unused temporary files as possible - given that ' PowerPoint may hold onto them - even if the reference has been removed. Public Function LAM_RemoveTempFiles() As Long Dim stBaseFileName As String stBaseFileName = LAM_TmpAddInBaseName() Dim stTmpFolder As String stTmpFolder = Environ("TMP") Dim lngFileCount As Long lngFileCount = 0 Dim stTmp As String stTmp = Dir(stTmpFolder & "\") Do While stTmp <> vbNullString If Mid(stTmp, 1, Len(stBaseFileName)) = stBaseFileName Then If LAM_DeleteFile(stTmpFolder & "\" & stTmp) Then lngFileCount = lngFileCount + 1 End If End If stTmp = Dir Loop LAM_RemoveTempFiles = lngFileCount End Function Public Function LAM_DeleteFile(ByVal stFilePath As String) As Boolean LAM_DeleteFile = False Dim fso Set fso = CreateObject("Scripting.FileSystemObject") On Error GoTo DeleteFailed fso.DeleteFile stFilePath LAM_DeleteFile = True Exit Function DeleteFailed: End Function Public Function LAM_RefExists(ByVal RefName) Dim ref As Object LAM_RefExists = False For Each ref In Application.ActivePresentation.VBProject.References If ref.Name = RefName Then LAM_RefExists = True Exit Function End If Next End Function Public Sub LAM_ListReferences() Dim ref As Object For Each ref In Application.ActivePresentation.VBProject.References Debug.Print ref.Name Next End Sub Public Function LAM_DeleteRef(ByVal stRefName As String) As Boolean Dim ref As Object LAM_DeleteRef = False On Error GoTo RemoveProblem With Application.ActivePresentation.VBProject.References .Remove .Item(stRefName) LAM_DeleteRef = True End With Exit Function RemoveProblem: ' LAM_DeleteRef = False End Function Private Function LAM_TmpAddInBaseName() As String LAM_TmpAddInBaseName = "vba-tmp-addin-" End Function Private Function LAM_TmpFilePath() As String LAM_TmpFilePath = Environ("TMP") & "\" & LAM_TmpAddInBaseName() & (Now() * 86400) & ".ppam" End Function



Reply With Quote

