Difference between revisions of "Microsoft Access VBA Code Snippets"

From database24
Jump to navigation Jump to search
Line 2: Line 2:
 
Retrieving and processing a recordset works like this
 
Retrieving and processing a recordset works like this
  
 +
<syntaxhighlight lang="vb">
 
  Dim cn As ADODB.Connection
 
  Dim cn As ADODB.Connection
 
  Dim rs As ADODB.Recordset
 
  Dim rs As ADODB.Recordset
Line 21: Line 22:
 
  Set rs = Nothing
 
  Set rs = Nothing
 
  Set cn = Nothing
 
  Set cn = Nothing
 +
</syntaxhighlight>
  
  
Line 40: Line 42:
 
The first guess for this is usually '''CurrentProject.Name''' but unfortunately this just returns the name of the file. If you want to bind your settings to a certain project, you certainly don't want to rely on the exact naming of a file; to the contrary you want to be able to use your stored settings no matter what the database file is named.
 
The first guess for this is usually '''CurrentProject.Name''' but unfortunately this just returns the name of the file. If you want to bind your settings to a certain project, you certainly don't want to rely on the exact naming of a file; to the contrary you want to be able to use your stored settings no matter what the database file is named.
  
 +
<syntaxhighlight lang="vb">
 
  Function getProjectName() As String
 
  Function getProjectName() As String
 
     Dim strResult As String
 
     Dim strResult As String
Line 47: Line 50:
 
     getDbAppTitle = strResult
 
     getDbAppTitle = strResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== setDebug ===
 
=== setDebug ===
 +
<syntaxhighlight lang="vb">
 
  Sub setDebug(blnDebug As Boolean)
 
  Sub setDebug(blnDebug As Boolean)
 
     saveSetting getProjectName, "RunTime", "Debug", CStr(blnDebug)
 
     saveSetting getProjectName, "RunTime", "Debug", CStr(blnDebug)
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
  
 
=== isDebug ===
 
=== isDebug ===
 +
<syntaxhighlight lang="vb">
 
  Function isDebug() As Boolean
 
  Function isDebug() As Boolean
 
     Dim blnResult As Boolean
 
     Dim blnResult As Boolean
Line 61: Line 68:
 
     isDebug = blnResult
 
     isDebug = blnResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== existsTable ===
 
=== existsTable ===
 +
<syntaxhighlight lang="vb">
 
  Function existsTable(strTable As String) As Boolean
 
  Function existsTable(strTable As String) As Boolean
 
     Dim blnResult As Boolean
 
     Dim blnResult As Boolean
Line 77: Line 86:
 
     existsTable = blnResult
 
     existsTable = blnResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== existsQuery ===
 
=== existsQuery ===
 +
<syntaxhighlight lang="vb">
 
  Function existsQuery(strQuery As String) As Boolean
 
  Function existsQuery(strQuery As String) As Boolean
 
     Dim blnResult As Boolean
 
     Dim blnResult As Boolean
Line 93: Line 104:
 
     existsQuery = blnResult
 
     existsQuery = blnResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== inList ===
 
=== inList ===
 +
<syntaxhighlight lang="vb">
 
  Public Function inList(cmb As ComboBox, var As Variant) As Boolean
 
  Public Function inList(cmb As ComboBox, var As Variant) As Boolean
 
     Dim blnResult As Boolean
 
     Dim blnResult As Boolean
Line 111: Line 124:
 
     inList = blnResult
 
     inList = blnResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== displayActiveUsers ===
 
=== displayActiveUsers ===
 
The usage of the Windows Script Host Object in order to identify the user's workstation is optional.
 
The usage of the Windows Script Host Object in order to identify the user's workstation is optional.
  
 +
<syntaxhighlight lang="vb">
 
  Sub displayActiveUsers()
 
  Sub displayActiveUsers()
 
     Dim strUsers As String
 
     Dim strUsers As String
Line 155: Line 170:
 
     MsgBox strUsers, vbOKOnly, "Current Users"
 
     MsgBox strUsers, vbOKOnly, "Current Users"
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
  
  
Line 160: Line 176:
  
 
=== debugPrintUserRunTimeSettings ===
 
=== debugPrintUserRunTimeSettings ===
 +
<syntaxhighlight lang="vb">
 
  Sub debugPrintUserRunTimeSettings()
 
  Sub debugPrintUserRunTimeSettings()
 
     Dim arrSetting() As String
 
     Dim arrSetting() As String
Line 178: Line 195:
 
     Debug.Print "No user settings available."
 
     Debug.Print "No user settings available."
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
  
 
=== deleteUserSettings ===
 
=== deleteUserSettings ===
 +
<syntaxhighlight lang="vb">
 
  Sub deleteUserSettings()
 
  Sub deleteUserSettings()
 
     Debug.Print
 
     Debug.Print
Line 188: Line 207:
 
     Debug.Print "All user settings deleted."
 
     Debug.Print "All user settings deleted."
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
 +
  
 
== modUi ==
 
== modUi ==
  
 
=== setStatus ===
 
=== setStatus ===
 +
<syntaxhighlight lang="vb">
 
  Public Sub setStatus(Optional strMessage As String = "Bereit")
 
  Public Sub setStatus(Optional strMessage As String = "Bereit")
 
     strMessage = _
 
     strMessage = _
Line 198: Line 220:
 
     SysCmd acSysCmdSetStatus, strMessage
 
     SysCmd acSysCmdSetStatus, strMessage
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
  
  
Line 205: Line 228:
 
Microsoft Access' Round() function is different from the one implemented in Microsoft Excel. The behavious can be imitated using a user defined function.
 
Microsoft Access' Round() function is different from the one implemented in Microsoft Excel. The behavious can be imitated using a user defined function.
  
 +
<syntaxhighlight lang="vb">
 
  Public Function Round2(dblValue As Double, intDecimal As Integer) As Double
 
  Public Function Round2(dblValue As Double, intDecimal As Integer) As Double
 
     Dim dblResult As Double
 
     Dim dblResult As Double
Line 212: Line 236:
 
     Round2 = dblResult
 
     Round2 = dblResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
== modSql ==
 
== modSql ==
  
 
=== Constants ===
 
=== Constants ===
 +
<syntaxhighlight lang="vb">
 
  Public Const strFormatSqlDate As String = "yyyy\-mm\-dd"
 
  Public Const strFormatSqlDate As String = "yyyy\-mm\-dd"
 
  Public Const strFormatSqlDateCriterion As String = "\#yyyy\-mm\-dd\#"
 
  Public Const strFormatSqlDateCriterion As String = "\#yyyy\-mm\-dd\#"
 +
</syntaxhighlight>
  
 
=== executeSql ===
 
=== executeSql ===
 +
<syntaxhighlight lang="vb">
 
  Public Function executeSql(strSql As String) As Long
 
  Public Function executeSql(strSql As String) As Long
 
     Dim lngResult As Long
 
     Dim lngResult As Long
Line 276: Line 304:
 
  '    On Error GoTo 0
 
  '    On Error GoTo 0
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== showSqlResult ===
 
=== showSqlResult ===
 +
<syntaxhighlight lang="vb">
 
  Public Sub showSqlResult(strSql As String, Optional strQuery As String = "")
 
  Public Sub showSqlResult(strSql As String, Optional strQuery As String = "")
 
     Dim dbs As Database
 
     Dim dbs As Database
Line 297: Line 327:
 
     Set qdf = Nothing
 
     Set qdf = Nothing
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
  
 
=== getSqlAmount ===
 
=== getSqlAmount ===
 +
<syntaxhighlight lang="vb">
 
  Public Function getSqlAmount(cur As Currency) As String
 
  Public Function getSqlAmount(cur As Currency) As String
 
     Dim strResult As String
 
     Dim strResult As String
Line 312: Line 344:
 
     getSqlAmount = strResult
 
     getSqlAmount = strResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== getSqlDate ===
 
=== getSqlDate ===
 +
<syntaxhighlight lang="vb">
 
  Public Function getSqlDate(dat As Date) As String
 
  Public Function getSqlDate(dat As Date) As String
 
     Dim strResult As String
 
     Dim strResult As String
Line 321: Line 355:
 
     getSqlDate = strResult
 
     getSqlDate = strResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== getSqlDateCriterion ===
 
=== getSqlDateCriterion ===
 +
<syntaxhighlight lang="vb">
 
  Public Function getSqlDateCriterion(dat As Date) As String
 
  Public Function getSqlDateCriterion(dat As Date) As String
 
     Dim strResult As String
 
     Dim strResult As String
Line 330: Line 366:
 
     getSqlDateCriterion = strResult
 
     getSqlDateCriterion = strResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
  
Line 335: Line 372:
  
 
=== assurePath ===
 
=== assurePath ===
 +
<syntaxhighlight lang="vb">
 
  Sub assurePath(strPath)
 
  Sub assurePath(strPath)
 
     Dim fso As FileSystemObject
 
     Dim fso As FileSystemObject
Line 361: Line 399:
 
     End If
 
     End If
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
  
  
Line 367: Line 406:
  
 
=== getUserName ===
 
=== getUserName ===
 +
<syntaxhighlight lang="vb">
 
  Function getUserName() As String
 
  Function getUserName() As String
 
     Dim strResult As String
 
     Dim strResult As String
Line 377: Line 417:
 
     getUserName = strResult
 
     getUserName = strResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
 
   
 
   
 
=== getComputerName ===
 
=== getComputerName ===
 +
<syntaxhighlight lang="vb">
 
  Function getComputerName() As String
 
  Function getComputerName() As String
 
     Dim strResult As String
 
     Dim strResult As String
Line 389: Line 431:
 
     getComputerName = strResult
 
     getComputerName = strResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
== modExcel ==
 
== modExcel ==
  
 
=== Variables ===
 
=== Variables ===
 +
<syntaxhighlight lang="vb">
 
  Private xl As Excel.Application
 
  Private xl As Excel.Application
 
  Private blnCreated As Boolean
 
  Private blnCreated As Boolean
 +
</syntaxhighlight>
  
 
=== getExcel ===
 
=== getExcel ===
 +
<syntaxhighlight lang="vb">
 
  Private Function getExcel() As Excel.Application
 
  Private Function getExcel() As Excel.Application
 
     If xl Is Nothing Then
 
     If xl Is Nothing Then
Line 413: Line 459:
 
     Set getExcel = xl
 
     Set getExcel = xl
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== quitExcel ===
 
=== quitExcel ===
 +
<syntaxhighlight lang="vb">
 
  Sub quitExcel()
 
  Sub quitExcel()
 
     With xl
 
     With xl
Line 423: Line 471:
 
     End With
 
     End With
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>
  
 
=== openExcelWorkbook ===
 
=== openExcelWorkbook ===
 +
<syntaxhighlight lang="vb">
 
  Public Function openExcelWorkbook(strPathFile As String) As Excel.Workbook
 
  Public Function openExcelWorkbook(strPathFile As String) As Excel.Workbook
 
     Dim wbkResult As Excel.Workbook
 
     Dim wbkResult As Excel.Workbook
Line 434: Line 484:
 
     Set openExcelWorkbook = wbkResult
 
     Set openExcelWorkbook = wbkResult
 
  End Function
 
  End Function
 +
</syntaxhighlight>
  
 
=== closeExcelWorkbook ===
 
=== closeExcelWorkbook ===
 +
</syntaxhighlight lang="vb">
 
  Public Sub closeExcelWorkbook(strWorkbook As String, Optional blnQuit As Boolean = False)
 
  Public Sub closeExcelWorkbook(strWorkbook As String, Optional blnQuit As Boolean = False)
 
     With xl
 
     With xl
Line 444: Line 496:
 
     End With
 
     End With
 
  End Sub
 
  End Sub
 +
</syntaxhighlight>

Revision as of 06:22, 30 January 2010

ActiveX Data Objects

Retrieving and processing a recordset works like this

 Dim cn As ADODB.Connection
 Dim rs As ADODB.Recordset
 
 Set cn = CurrentProject.Connection
 Set rs = New ADODB.Recordset
 With rs
     .Open _
         Source:="SELECT * FROM tblTable", _
         ActiveConnection:=cn
     .MoveFirst
     Do While Not .EOF
         'Record based instructions
         .MoveNext
     Loop
     .Close
 End With
 
 Set rs = Nothing
 Set cn = Nothing


modAccess

modAccess consists basically of methods, which are specific to Microsoft Access like methods for retrieving information about properties, checking Access objects for their existence.

getApplicationTitle

 Function getApplicationTitle() As String
     Dim strResult As String
     
     strResult = CurrentDb.Properties("AppTitle").Value
     
     getApplicationTitle = strResult
 End Function

getProjectName

The first guess for this is usually CurrentProject.Name but unfortunately this just returns the name of the file. If you want to bind your settings to a certain project, you certainly don't want to rely on the exact naming of a file; to the contrary you want to be able to use your stored settings no matter what the database file is named.

 Function getProjectName() As String
     Dim strResult As String
     
     strResult = Application.VBE.ActiveVBProject.Name
     
     getDbAppTitle = strResult
 End Function

setDebug

 Sub setDebug(blnDebug As Boolean)
     saveSetting getProjectName, "RunTime", "Debug", CStr(blnDebug)
 End Sub

isDebug

 Function isDebug() As Boolean
     Dim blnResult As Boolean
     
     blnResult = CBool(GetSetting(getProjectName, "RunTime", "Debug", 0))
     
     isDebug = blnResult
 End Function

existsTable

 Function existsTable(strTable As String) As Boolean
     Dim blnResult As Boolean
     Dim tdf As TableDef
     
     blnResult = False
     For Each tdf In CurrentDb.TableDefs
         If tdf.Name = strTable Then
             blnResult = True
             Exit For
         End If
     Next
     
     existsTable = blnResult
 End Function

existsQuery

 Function existsQuery(strQuery As String) As Boolean
     Dim blnResult As Boolean
     Dim qdf As QueryDef
     
     blnResult = False
     For Each qdf In CurrentDb.QueryDefs
         If qdf.Name = strQuery Then
             blnResult = True
             Exit For
         End If
     Next
     
     existsQuery = blnResult
 End Function

inList

 Public Function inList(cmb As ComboBox, var As Variant) As Boolean
     Dim blnResult As Boolean
     Dim intIndex As Integer
     
     blnResult = False
     With cmb
         For intIndex = Abs(.ColumnHeads) To .ListCount - 1
             If CLng(.ItemData(intIndex)) = CLng(Nz(var)) Then
                 blnResult = True
                 Exit For
             End If
         Next
     End With
     
     inList = blnResult
 End Function

displayActiveUsers

The usage of the Windows Script Host Object in order to identify the user's workstation is optional.

 Sub displayActiveUsers()
     Dim strUsers As String
     Dim cn As New ADODB.Connection
     Dim rs As New ADODB.Recordset
     Dim wshNet As WshNetwork
 
     strUsers = "Computer Name"
     Set cn = CurrentProject.Connection
     Set rs = cn.OpenSchema( _
         Schema:=adSchemaProviderSpecific, _
         SchemaId:="{947bb102-5d43-11d1-bdbf-00c04fb92675}" _
         )
     Debug.Print _
         rs.Fields(0).Name & " " & _
         rs.Fields(1).Name ' & " " & _
         rs.Fields(2).Name & " " & _
         rs.Fields(3).Name
     Set wshNet = New WshNetwork
     With rs
         Do While Not .EOF
             strUsers = strUsers & vbCrLf & Chr$(149) & "  " & Left(.Fields(0).Value, Len(wshNet.ComputerName))
             If Left(.Fields(0).Value, Len(wshNet.ComputerName)) = wshNet.ComputerName Then
                 strUsers = strUsers & " (me)"
                 Debug.Print _
                     wshNet.ComputerName & "*     " & _
                     wshNet.UserName ' & " " & _
                     .Fields(2).Value & " " & _
                     .Fields(3).Value
             Else
                 Debug.Print _
                     Left(.Fields(0).Value, Len(wshNet.ComputerName)) & "      " & _
                     Trim(.Fields(1).Value) ' & " " & _
                     .Fields(2).Value & " " & _
                     .Fields(3).Value
             End If
             .MoveNext
         Loop
     End With
     MsgBox strUsers, vbOKOnly, "Current Users"
 End Sub


modSetting

debugPrintUserRunTimeSettings

 Sub debugPrintUserRunTimeSettings()
     Dim arrSetting() As String
     Dim intIndex As Integer
     
     Debug.Print
     Debug.Print "User RunTime Settings"
     Debug.Print "---------------------"
     On Error GoTo handleGetAllSettingsError
     arrSetting = GetAllSettings(getProjectName, "RunTime")
     On Error GoTo 0
     For intIndex = LBound(arrSetting) To UBound(arrSetting)
         Debug.Print arrSetting(intIndex, 0) & " : " & arrSetting(intIndex, 1)
     Next
     Exit Sub
     
 handleGetAllSettingsError:
     Debug.Print "No user settings available."
 End Sub

deleteUserSettings

 Sub deleteUserSettings()
     Debug.Print
     Debug.Print "User Settings"
     Debug.Print "-------------"
     On Error Resume Next
     DeleteSetting getProjectName
     Debug.Print "All user settings deleted."
 End Sub


modUi

setStatus

 Public Sub setStatus(Optional strMessage As String = "Bereit")
     strMessage = _
         getUserName & " - " & _
         strMessage
     SysCmd acSysCmdSetStatus, strMessage
 End Sub


modFunction

Round2

Microsoft Access' Round() function is different from the one implemented in Microsoft Excel. The behavious can be imitated using a user defined function.

 Public Function Round2(dblValue As Double, intDecimal As Integer) As Double
     Dim dblResult As Double
     
     dblResult = CLng(dblValue * 10 ^ intDecimal) / 10 ^ intDecimal
     
     Round2 = dblResult
 End Function

modSql

Constants

 Public Const strFormatSqlDate As String = "yyyy\-mm\-dd"
 Public Const strFormatSqlDateCriterion As String = "\#yyyy\-mm\-dd\#"

executeSql

 Public Function executeSql(strSql As String) As Long
     Dim lngResult As Long
     
     Const strFormatHms As String = "hh:mm:ss"
     
     Dim datStart As Date
     
     lngResult = 0
     
     If isDebug Then
         Debug.Print "----------------------------------------"
         Debug.Print strSql
         Debug.Print
         datStart = Now
         Debug.Print "Start      : " & Format(datStart, strFormatHms)
     End If
 
     With CurrentDb
         'DoCmd.SetWarnings False
         'On Error GoTo handleExecuteSqlError
         If isDebug Then
             .Execute strSql, dbFailOnError
         Else
             .Execute strSql
         End If
         'On Error GoTo 0
         'DoCmd.SetWarnings True
         DoEvents
         
         Select Case .RecordsAffected
         Case 1
             'Last inserted id
             lngResult = .OpenRecordset("SELECT @@IDENTITY")(0)
         Case Else
             'Number of affected records
             lngResult = .RecordsAffected
         End Select
     End With
     
     If isDebug Then
         Debug.Print "End        : " & Format(Now, strFormatHms)
         Debug.Print "             " & "--------"
         Debug.Print "Duration   : " & Format(Now - datStart, strFormatHms)
         Debug.Print "Records    : " & Format(lngResult, "#,##0")
         Debug.Print "----------------------------------------"
         Debug.Print
     End If
 
     executeSql = lngResult
     'Exit Function
     
 'handleExecuteSqlError:
 '    On Error GoTo handleExecuteSqlErrorFinal
 '    DoCmd.RunSQL strSql
 '    On Error GoTo 0
 End Function

showSqlResult

 Public Sub showSqlResult(strSql As String, Optional strQuery As String = "")
     Dim dbs As Database
     Dim qdf As QueryDef
     
     If strQuery = "" Then
         strQuery = "SQL Result"
     End If
     If existsQuery(strQuery) Then
         DoCmd.DeleteObject acQuery, strQuery
     End If
     Set dbs = CurrentDb
     Set qdf = dbs.CreateQueryDef(Name:=strQuery, SQLText:=strSql)
     DoCmd.OpenQuery strQuery
     Do While CurrentData.AllQueries(strQuery).IsLoaded
         DoEvents
     Loop
     DoCmd.DeleteObject acQuery, strQuery
     Set qdf = Nothing
 End Sub

getSqlAmount

 Public Function getSqlAmount(cur As Currency) As String
     Dim strResult As String
     
     strResult = CStr(cur)
     strResult = Replace( _
         Expression:=strResult, _
         Find:=",", _
         Replace:=".", _
         Compare:=vbTextCompare _
         )
     
     getSqlAmount = strResult
 End Function

getSqlDate

 Public Function getSqlDate(dat As Date) As String
     Dim strResult As String
     
     strResult = Format(dat, strFormatSqlDate)
     
     getSqlDate = strResult
 End Function

getSqlDateCriterion

 Public Function getSqlDateCriterion(dat As Date) As String
     Dim strResult As String
     
     strResult = Format(dat, strFormatSqlDateCriterion)
     
     getSqlDateCriterion = strResult
 End Function


modFso

assurePath

 Sub assurePath(strPath)
     Dim fso As FileSystemObject
     Dim blnFirst As Boolean
     
     blnFirst = True
     Set fso = New FileSystemObject
     With fso
         If Not .FolderExists(strPath) Then
             On Error GoTo handleCreateFolderError
             .CreateFolder strPath
             On Error GoTo 0
         End If
     End With
     Set fso = Nothing
     Exit Sub
     
 handleCreateFolderError:
     If Err.Number = 76 And blnFirst Then
         Debug.Print strPath & " not found - trying to create parent ..."
         assurePath fso.GetParentFolderName(strPath)
         blnFirst = False
         Resume
     Else
         MsgBox "The path '" & strPath & "' could not be found, nor created.", vbExclamation + vbOKOnly
     End If
 End Sub


modWsh

Windows Scripting Host Object based methods

getUserName

 Function getUserName() As String
     Dim strResult As String
     
     Dim wshNet As WshNetwork
     
     Set wshNet = New WshNetwork
     strResult = wshNet.UserName
     
     getUserName = strResult
 End Function

getComputerName

 Function getComputerName() As String
     Dim strResult As String
     
     Dim wshNet As WshNetwork
     
     Set wshNet = New WshNetwork
     strResult = wshNet.ComputerName
     
     getComputerName = strResult
 End Function

modExcel

Variables

 Private xl As Excel.Application
 Private blnCreated As Boolean

getExcel

 Private Function getExcel() As Excel.Application
     If xl Is Nothing Then
         On Error Resume Next
         Set xl = GetObject(, "Excel.Application")
         On Error GoTo 0
         If xl Is Nothing Then
             Set xl = CreateObject("Excel.Application")
             xl.Visible = True
             blnCreated = True
         Else
             blnCreated = False
         End If
     End If
     
     Set getExcel = xl
 End Function

quitExcel

 Sub quitExcel()
     With xl
         If blnCreated Then
             .Quit
         End If
         Set xl = Nothing
     End With
 End Sub

openExcelWorkbook

 Public Function openExcelWorkbook(strPathFile As String) As Excel.Workbook
     Dim wbkResult As Excel.Workbook
     
     With getExcel
         Set wbkResult = .Workbooks.Open(strPathFile)
     End With
     
     Set openExcelWorkbook = wbkResult
 End Function

closeExcelWorkbook

</syntaxhighlight lang="vb">

Public Sub closeExcelWorkbook(strWorkbook As String, Optional blnQuit As Boolean = False)
    With xl
        .Workbooks(strWorkbook).Close
        If blnQuit Then
            quitExcel
        End If
    End With
End Sub

</syntaxhighlight>