Code:
Option Explicit
Dim objRib As IRibbonUI
Dim strControlID As String
Dim strMessage As String
Dim varArrayValues As Variant
Dim varArrayTypes As Variant
Dim lngSht As Long
Dim objSh As Object
Const lngMaxList As Long = 50
Const strTitle As String = "ExcelFox Solutions"
Const strPathKey As String = "HKEY_CURRENT_USER\Software\Microsoft\Office\FavFol\Fol "
'Callback for rxLst, rxFol, rxFav getContent
Sub rxDynMenuGetContent(control As IRibbonControl, ByRef returnedVal)
Dim xml As String
Dim lng As Long
lngSht = Empty
If IsArray(varArrayTypes) Then Erase varArrayTypes
If IsArray(varArrayValues) Then Erase varArrayValues
If control.ID = "rxLst" Then
GetRecentFiles False
For lng = 0 To UBound(varArrayTypes)
xml = xml & "<button id=""dynSubMenu" & lng & """ imageMso=""" & ImageName(CStr(varArrayTypes(lng))) & """ tag=""" & XMLParse(CStr(varArrayValues(lng))) & """ label=""" & GiveFile(CStr(varArrayValues(lng))) & """ screentip=""" & XMLParse(CStr(varArrayValues(lng))) & """ onAction=""FileCustomOpen""/>" & vbLf
Next lng
ElseIf control.ID = "rxFol" Then
GetRecentFiles False
Call BubbleSort(varArrayValues)
'For lng = UBound(varArrayValues) To Application.Max(0, UBound(varArrayValues) - lngMaxList) Step -1
For lng = UBound(varArrayValues) To LBound(varArrayValues) Step -1
If InStr(1, xml, """" & GiveFolder(CStr(varArrayValues(lng))) & """") = 0 Then
xml = xml & "<button id=""dynSubMenu" & lng & """ imageMso=""MenuPublish"" tag=""" & GiveFolder(CStr(varArrayValues(lng))) & """ label=""" & GiveFolder(CStr(varArrayValues(lng))) & """ onAction=""FileCustomOpen""/>" & vbLf
End If
Next lng
Else 'rxFav
GetFavFolders
xml = xml & vbLf & "<button id=""btnAddFavFol"""
xml = xml & vbLf & "label=""Add Favorites"""
xml = xml & vbLf & "imageMso=""CustomActionsMenu"""
xml = xml & vbLf & "onAction=""AddFavorites""/>" & vbLf
If IsArray(varArrayTypes) Then
For lng = UBound(varArrayTypes) To Application.Max(0, UBound(varArrayTypes) - lngMaxList) Step -1
If InStr(1, xml, """" & varArrayValues(lng) & """") = 0 Then
xml = xml & "<splitButton id=""splButton" & lng & """>"
xml = xml & vbLf & "<button id=""btnFavFol" & lng & """"
xml = xml & vbLf & "label=""" & varArrayValues(lng) & """"
xml = xml & vbLf & "tag=""" & varArrayValues(lng) & """"
xml = xml & vbLf & "imageMso=""MenuPublish"""
xml = xml & vbLf & "onAction=""ToOpenPath""/>"
xml = xml & vbLf & "<menu id=""mnu" & lng & """ itemSize=""normal"">"
xml = xml & vbLf & "<button id=""btnOpenFolder" & lng & """"
xml = xml & vbLf & "label=""Show"""
xml = xml & vbLf & "tag=""" & varArrayValues(lng) & """"
xml = xml & vbLf & "imageMso=""VisibilityVisible"""
xml = xml & vbLf & "onAction=""ToOpenPath"" />"
xml = xml & vbLf & "<button id=""btnRemoveFolder" & lng & """"
xml = xml & vbLf & "label=""Remove"""
xml = xml & vbLf & "tag=""" & varArrayValues(lng) & """"
xml = xml & vbLf & "imageMso=""VisibilityHidden"""
xml = xml & vbLf & "onAction=""ToRemovePath"" />"
xml = xml & vbLf & "</menu>"
xml = xml & vbLf & "</splitButton>" & vbLf
End If
Next lng
End If
End If
xml = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" title=""" & strTitle & """>" & vbLf & _
xml & "</menu>"
returnedVal = xml
On Error Resume Next
lngSht = ActiveWorkbook.Sheets.Count
Err.Clear: On Error GoTo 0: On Error GoTo -1
If lngSht > 0 Then
objRib.InvalidateControl control.ID
End If
strControlID = control.ID
End Sub
'Callback for btnFavFol0 onAction
Sub AddFavorites(control As IRibbonControl)
Dim strPath As String
Dim lng As Long
If IsArray(varArrayValues) Then
lng = UBound(varArrayValues)
Else
lng = -1
End If
strPath = InputBox("Enter folder path here", "Chronos Twelve")
If strPath <> "" Then
If FolderShouldBeAdded(strPath) Then
RegKeySave strPathKey & lng + 2, strPath
Else
MsgBox strMessage, vbOKOnly + vbInformation, "Chronos Twelve"
End If
End If
objRib.InvalidateControl "rxFav"
End Sub
'Callback for btnFavFol1 onAction
Sub ToOpenPath(control As IRibbonControl)
Shell "explorer.exe """ & control.Tag & """", 3 'vbMaximizedFocus
End Sub
'Callback for btnRemoveFolder1 onAction
Sub ToRemovePath(control As IRibbonControl)
Dim lngLoop As Long
Dim lngCounter As Long
GetFavFolders
RegKeyDelete "HKEY_CURRENT_USER\Software\Microsoft\Office\FavFol\"
RegKeySave "HKEY_CURRENT_USER\Software\Microsoft\Office\FavFol\", "Chronos Twelve"
For lngLoop = 0 To UBound(varArrayValues)
If varArrayValues(lngLoop) <> control.Tag Then
lngCounter = lngCounter + 1
RegKeySave strPathKey & lngCounter, CStr(varArrayValues(lngLoop))
End If
Next lngLoop
objRib.InvalidateControl "rxFav"
End Sub
Sub GetRecentFiles(Optional blnExcludeHostApplication As Boolean = True)
Dim lngLoop As Long
Dim lngApps As Long
Dim lngArrayLoop As Long
Dim strRegistryPath As String
Dim strKeyValue As String
Dim strApps As Variant
Dim strVers As Variant
Dim objDic As Object
Dim strString As String
Set objDic = CreateObject("Scripting.Dictionary")
strApps = Array("Access", "Word", "Excel", "PowerPoint")
strVers = Array("10.0", "11.0", "12.0", "14.0")
For lngApps = 0 To UBound(strApps)
For lngArrayLoop = 0 To UBound(strVers)
If Not (blnExcludeHostApplication And strApps(lngApps) & strVers(lngArrayLoop) = Replace(Application.Name, "Microsoft ", "") & Application.Version) Then
strRegistryPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & RegiPath(CStr(strApps(lngApps)), CStr(strVers(lngArrayLoop)))
On Error Resume Next
For lngLoop = 1 To lngMaxList 'Because Office Applications Until Version 14.0 do not have the feature to record more than 50 most recently used files
strKeyValue = objSh.RegRead(strRegistryPath & lngLoop)
If strKeyValue = "" Then
Exit For
Else
If InStr(1, strKeyValue, "*") Then
objDic.Add Split(strKeyValue, "*")(1), CStr(strApps(lngApps)) & " " & CStr(strVers(lngArrayLoop)) & " " & lngLoop
Else
objDic.Add strKeyValue, CStr(strApps(lngApps)) & " " & CStr(strVers(lngArrayLoop)) & " " & lngLoop
End If
strKeyValue = ""
End If
Next lngLoop
Err.Clear: On Error GoTo 0: On Error GoTo -1
End If
Next lngArrayLoop
Next lngApps
varArrayValues = objDic.Keys
varArrayTypes = objDic.Items
Application.StatusBar = False
Set objDic = Nothing
End Sub
Sub GetFavFolders()
Dim lngLoop As Long
Dim strRegistryPath As String
Dim strKeyValue As String
Dim objSh As Object
Dim objDic As Object
Dim objRegistry As Object
Dim varArraySubKeys As Variant
Const HKEY_CURRENT_USER = &H80000001
With Application
strRegistryPath = "Software\Microsoft\Office\FavFol"
End With
Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
objRegistry.EnumValues HKEY_CURRENT_USER, strRegistryPath, varArrayValues, varArrayTypes
If IsArray(varArrayValues) Then
ReDim varArraySubKeys(UBound(varArrayValues))
For lngLoop = 1 To UBound(varArrayValues)
objRegistry.GetStringValue HKEY_CURRENT_USER, strRegistryPath, varArrayValues(lngLoop), varArraySubKeys(lngLoop)
Next lngLoop
Set objDic = CreateObject("Scripting.Dictionary")
On Error Resume Next
For lngLoop = 1 To UBound(varArraySubKeys)
objDic.Add CStr(varArraySubKeys(lngLoop)), CStr(varArrayValues(lngLoop))
Next lngLoop
Err.Clear: On Error GoTo 0: On Error GoTo -1
varArrayValues = objDic.Keys
varArrayTypes = objDic.Items
End If
Application.StatusBar = False
Set objRegistry = Nothing
Set objDic = Nothing
Set objSh = Nothing
End Sub
Function RegiPath(strApp As String, strVer As String) As String
Select Case Val(strVer)
Case 10, 11
Select Case strApp
Case "Excel"
RegiPath = strVer & "\" & strApp & "\Recent Files\File"
Case "Access"
RegiPath = strVer & "\" & strApp & "\Settings\MRU"
Case "Word"
RegiPath = strVer & "\" & strApp & "\Data Settings\MRU"
Case "PowerPoint"
RegiPath = strVer & "\" & strApp & "\Recent File List\File"
End Select
Case 12, 14
Select Case strApp
Case "Access"
RegiPath = strVer & "\" & strApp & "\Settings\MRU"
Case Else
RegiPath = strVer & "\" & strApp & "\File MRU\Item "
End Select
End Select
End Function
'Callback's for the macro's
Sub FileCustomOpen(control As IRibbonControl)
If lngSht = 0 Then
objRib.InvalidateControl strControlID
End If
Shell "explorer.exe """ & control.Tag & """", 3 'vbMaximizedFocus
End Sub
Private Function ImageName(strType As String) As String
Select Case Left(strType, InStr(1, strType, " ") - 1)
Case "Excel"
ImageName = "MicrosoftExcel" '"FileSaveAsExcelXlsx"
Case "Word"
ImageName = "FileSaveAsWordDotx"
Case "PowerPoint"
ImageName = "MicrosoftPowerPoint" '"FileSaveAsPowerPointPptx"
Case "Access"
ImageName = "MicrosoftAccess" '"FileSaveAsAccess2007"
End Select
End Function
'Callback for customUI.onLoad
Sub rxLoad(ribbon As IRibbonUI)
Set objRib = ribbon
'access Windows scripting
Set objSh = CreateObject("WScript.Shell")
If RegKeyExists("HKEY_CURRENT_USER\Software\Microsoft\Office\FavFol\") Then
GetFavFolders
Else
RegKeySave "HKEY_CURRENT_USER\Software\Microsoft\Office\FavFol\", "Chronos Twelve"
End If
End Sub
Private Function GiveFolder(strPath As String) As String
Dim lng As Long
lng = InStrRev(strPath, "\")
If lng <> 0 Then
GiveFolder = Left(strPath, lng)
Else
lng = InStrRev(strPath, "/")
GiveFolder = XMLParse(Left(strPath, lng))
End If
End Function
Private Function GiveFile(strPath As String) As String
Dim lng As Long
lng = InStrRev(strPath, "\")
GiveFile = XMLParse(CStr(Mid(strPath, lng + 1)))
End Function
Private Function XMLParse(strText As String) As String
XMLParse = Replace(strText, "&", "&&")
XMLParse = Replace(XMLParse, "'", "'")
End Function
Function MatchUp(CityName As String)
MatchUp = Switch(CityName = "London", "English", CityName _
= "Rome", "Italian", CityName = "Paris", "French")
End Function
'reads the value for the registry key i_RegKey
'if the key cannot be found, the return value is ""
Function RegKeyRead(i_RegKey As String) As String
On Error Resume Next
'read key from registry
RegKeyRead = objSh.RegRead(i_RegKey)
End Function
'returns True if the registry key i_RegKey was found
'and False if not
Function RegKeyExists(i_RegKey As String) As Boolean
On Error GoTo ErrorHandler
'try to read the registry key
objSh.RegRead i_RegKey
'key was found
RegKeyExists = True
Exit Function
ErrorHandler: 'key was not found
End Function
'sets the registry key i_RegKey to the
'value i_Value with type i_Type
'if i_Type is omitted, the value will be saved as string
'if i_RegKey wasn't found, a new registry key will be created
Sub RegKeySave(i_RegKey As String, i_Value As String, Optional i_Type As String = "REG_SZ")
'write registry key
objSh.RegWrite i_RegKey, i_Value, i_Type
End Sub
'deletes i_RegKey from the registry
'returns True if the deletion was successful,
'and False if not (the key couldn't be found)
Function RegKeyDelete(i_RegKey As String) As Boolean
On Error GoTo ErrorHandler
'delete registry key
objSh.RegDelete i_RegKey
'deletion was successful
RegKeyDelete = True
Exit Function
ErrorHandler: 'deletion wasn't successful
End Function
Public Function FExist(strFullPath As String) As Boolean
'Macro Purpose: Check if a file or folder exists
If InStr(1, strFullPath, "\\Client") > 0 Then
FExist = True
Exit Function
End If
On Error GoTo EarlyExit
If Dir(strFullPath, 16) <> vbNullString Then FExist = True
Exit Function
EarlyExit: Err.Clear: On Error GoTo 0
End Function
Sub Auto_Close()
Set objSh = Nothing
End Sub
Function FolderShouldBeAdded(strPath As String) As Boolean
FolderShouldBeAdded = True
If FExist(strPath) = False Then
strMessage = "Not a valid directory! Please try again."
FolderShouldBeAdded = False
Exit Function
Else
GetFavFolders
End If
If IsNumeric(Application.Match(strPath, varArrayValues, 0)) Then
strMessage = "This folder already exists in your favorites list!"
FolderShouldBeAdded = False
End If
End Function
Sub BubbleSort(arr)
Dim strTemp As String
Dim lngFirst As Long
Dim lngSecond As Long
Dim lngMin As Long
Dim lngMax As Long
lngMin = LBound(arr)
lngMax = UBound(arr)
For lngFirst = lngMin To lngMax - 1
For lngSecond = lngFirst + 1 To lngMax
If arr(lngFirst) < arr(lngSecond) Then
strTemp = arr(lngFirst)
arr(lngFirst) = arr(lngSecond)
arr(lngSecond) = strTemp
End If
Next lngSecond
Next lngFirst
End Sub
Bookmarks