Well, it looks like, for some reasons, the zip attachment is not allowed on my side. SO, I copy all the code I changed here:
1. Create a new module, name it "modCommonDialog64bit" (or whatever name you choose). Copy following code into it:
''===================================================================================================================
'' Following code is copied from Autodesk discussion forum here:
'' http://forums.autodesk.com/t5/inventor-customization/folder-browser-needed-for-vba-7-64-bit/m-p/4365989#M45667
''===================================================================================================================
Option Explicit
Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare PtrSafe Function GetSaveFileName Lib "comdlg32.dll" Alias _
"GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias _
"SHBrowseForFolderA" (lpBrowseInfo As BrowseInfo) As Long
Private Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" _
(ByVal pidList As LongPtr, ByVal lpBuffer As String) As Long
Public Declare PtrSafe Function SendMessageA Lib "user32" _
(ByVal Hwnd As LongPtr, ByVal wMsg As Long, _
ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As LongPtr)
Private Const BIF_RETURNONLYFSDIRS As Long = 1
Private Const CSIDL_DRIVES As Long = &H11
Private Const WM_USER As Long = &H400
Private Const MAX_PATH As Long = 260 '// message from browser
Private Const BFFM_INITIALIZED As Long = 1
Private Const BFFM_SELCHANGED As Long = 2
Private Const BFFM_VALIDATEFAILEDA As Long = 3 '// lParam:szPath ret:1(cont),0(EndDialog)
Private Const BFFM_VALIDATEFAILEDW As Long = 4 '// lParam:wzPath ret:1(cont),0(EndDialog)
Private Const BFFM_IUNKNOWN As Long = 5 '// provides IUnknown to client. lParam: IUnknown*
'// messages to browser
Private Const BFFM_SETSTATUSTEXTA As Long = WM_USER + 100
Private Const BFFM_ENABLEOK As Long = WM_USER + 101
Private Const BFFM_SETSELECTIONA As Long = WM_USER + 102
Private Const BFFM_SETSELECTIONW As Long = WM_USER + 103
Private Const BFFM_SETSTATUSTEXTW As Long = WM_USER + 104
Private Const BFFM_SETOKTEXT As Long = WM_USER + 105 '// Unicode only
Private Const BFFM_SETEXPANDED As Long = WM_USER + 106 '// Unicode only
Public Const OFN_ALLOWMULTISELECT As Long = &H200
Public Const OFN_CREATEPROMPT As Long = &H2000
Public Const OFN_ENABLEHOOK As Long = &H20
Public Const OFN_ENABLETEMPLATE As Long = &H40
Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80
Public Const OFN_EXPLORER As Long = &H80000
Public Const OFN_EXTENSIONDIFFERENT As Long = &H400
Public Const OFN_FILEMUSTEXIST As Long = &H1000
Public Const OFN_HIDEREADONLY As Long = &H4
Public Const OFN_LONGNAMES As Long = &H200000
Public Const OFN_NOCHANGEDIR As Long = &H8
Public Const OFN_NODEREFERENCELINKS As Long = &H100000
Public Const OFN_NOLONGNAMES As Long = &H40000
Public Const OFN_NONETWORKBUTTON As Long = &H20000
Public Const OFN_NOREADONLYRETURN As Long = &H8000& '*see comments
Public Const OFN_NOTESTFILECREATE As Long = &H10000
Public Const OFN_NOVALIDATE As Long = &H100
Public Const OFN_OVERWRITEPROMPT As Long = &H2
Public Const OFN_PATHMUSTEXIST As Long = &H800
Public Const OFN_READONLY As Long = &H1
Public Const OFN_SHAREAWARE As Long = &H4000
Public Const OFN_SHAREFALLTHROUGH As Long = 2
Public Const OFN_SHAREWARN As Long = 0
Public Const OFN_SHARENOWARN As Long = 1
Public Const OFN_SHOWHELP As Long = &H10
Public Const OFN_ENABLESIZING As Long = &H800000
Public Const OFS_MAXPATHNAME As Long = 260
'OFS_FILE_OPEN_FLAGS:
Public Const OFS_FILE_OPEN_FLAGS = OFN_EXPLORER Or _
OFN_LONGNAMES Or _
OFN_CREATEPROMPT Or _
OFN_NODEREFERENCELINKS
Private Type OPENFILENAME
lStructSize As Long
hWndOwner As LongPtr
hInstance As LongPtr
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As LongPtr
lpTemplateName As String
End Type
Public Type BrowseInfo
hWndOwner As LongPtr
pIDLRoot As LongPtr
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfnCallback As LongPtr
lParam As LongPtr
iImage As Long
End Type
'====== File Browsers for 64 bit VBA 7 ========
Public Function FileBrowseOpen( _
ByVal sInitFolder As String, _
ByVal sTitle As String, _
ByVal sFilter As String, _
ByVal nFilterIndex As Integer, _
Optional ByVal multiSelect = False) As String
Dim OpenFile As OPENFILENAME
Dim lReturn As Long
sInitFolder = CorrectPath(sInitFolder)
OpenFile.lpstrInitialDir = sInitFolder
' Swap filter separator for api separator
sFilter = Replace(sFilter, "|", Chr(0))
OpenFile.lpstrFilter = sFilter
OpenFile.nFilterIndex = nFilterIndex
OpenFile.lpstrTitle = sTitle
OpenFile.hWndOwner = 0
OpenFile.lpstrFile = String(257, 0)
OpenFile.nMaxFile = LenB(OpenFile.lpstrFile) - 1
OpenFile.lStructSize = LenB(OpenFile)
OpenFile.lpstrFileTitle = OpenFile.lpstrFile
OpenFile.nMaxFileTitle = OpenFile.nMaxFile
If Not multiSelect Then
OpenFile.flags = 0
Else
OpenFile.flags = OFS_FILE_OPEN_FLAGS + OFN_ALLOWMULTISELECT
End If
lReturn = GetOpenFileName(OpenFile)
If lReturn = 0 Then
FileBrowseOpen = ""
Else
If multiSelect Then
Dim str As String
str = Trim(Replace(Trim(OpenFile.lpstrFile), vbNullChar, ","))
Dim ed As String
ed = Mid(str, Len(str))
While (ed = ",")
str = Trim(Left(str, Len(str) - 1))
ed = Mid(str, Len(str))
Wend
FileBrowseOpen = str
Else
FileBrowseOpen = Trim(Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, vbNullChar) - 1))
End If
End If
End Function
Public Function GetFiles( _
ByVal sInitFolder As String, _
ByVal sTitle As String, _
ByVal sFilter As String, _
ByVal nFilterIndex As Integer) As String()
strReturn = FileBrowseOpen(sInitFolder, sTitle, sFilter, nFilterIndex, True)
GetFiles = Split(strReturn, ",")
End Function
Public Function FileBrowseSave( _
ByVal sDefaultFilename As String, _
ByVal sInitFolder As String, _
ByVal sTitle As String, _
ByVal sFilter As String, _
ByVal nFilterIndex As Integer) As String
Dim PadCount As Integer
Dim OpenFile As OPENFILENAME
Dim lReturn As Long
sInitFolder = CorrectPath(sInitFolder)
' Swap filter separator for api separator
sFilter = Replace(sFilter, "|", Chr(0))
OpenFile.lpstrFilter = sFilter
OpenFile.nFilterIndex = 1
OpenFile.hWndOwner = 0
PadCount = 260 - Len(sDefaultFilename)
OpenFile.lpstrFile = sDefaultFilename & String(PadCount, Chr(0))
'OpenFile.lpstrFile = String(257, 0)
OpenFile.nMaxFile = LenB(OpenFile.lpstrFile) - 1
OpenFile.lStructSize = LenB(OpenFile)
OpenFile.lpstrFileTitle = OpenFile.lpstrFile
OpenFile.nMaxFileTitle = OpenFile.nMaxFile
OpenFile.lpstrInitialDir = sInitFolder
OpenFile.lpstrTitle = sTitle
OpenFile.flags = 0
lReturn = GetSaveFileName(OpenFile)
If lReturn = 0 Then
FileBrowseSave = ""
Else
FileBrowseSave = Trim(Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, vbNullChar) - 1))
End If
End Function
'====== Folder Browser for 64 bit VBA 7 ========
Public Function FolderBrowse(ByVal sDialogTitle As String, ByVal sInitFolder As String) As String
Dim ReturnPath As String
Dim b(MAX_PATH) As Byte
Dim pItem As Long
Dim sFullPath As String
Dim bi As BrowseInfo
Dim ppidl As Long
sInitFolder = CorrectPath(sInitFolder)
' Note VBA windows and dialogs do not have an hWnd property.
bi.hWndOwner = 0 'Windows Main Screen handle.
' SHGetSpecialFolderLocation bi.hWndOwner, CSIDL_DRIVES, ppidl
bi.pIDLRoot = 0 'ppidl
bi.pszDisplayName = VarPtr(b(0))
bi.lpszTitle = sDialogTitle
bi.ulFlags = BIF_RETURNONLYFSDIRS
If FolderExists(sInitFolder) Then bi.lpfnCallback = PtrToFunction(AddressOf BFFCallback)
bi.lParam = StrPtr(sInitFolder)
pItem = SHBrowseForFolder(bi)
If pItem Then ' Succeeded
sFullPath = Space$(MAX_PATH)
If SHGetPathFromIDList(pItem, sFullPath) Then
ReturnPath = Left$(sFullPath, InStr(sFullPath, vbNullChar) - 1) ' Strip nulls
CoTaskMemFree pItem
End If
End If
If ReturnPath <> "" Then
If Right$(ReturnPath, 1) <> "\" Then
ReturnPath = ReturnPath & "\"
End If
End If
FolderBrowse = ReturnPath
End Function
' typedef int (CALLBACK* BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
Private Function BFFCallback( _
ByVal Hwnd As LongPtr, ByVal uMsg As LongPtr, _
ByVal lParam As LongPtr, ByVal sData As String) As LongPtr
If uMsg = BFFM_INITIALIZED Then
SendMessageA Hwnd, BFFM_SETSELECTIONA, True, ByVal sData
End If
End Function
Private Function PtrToFunction(ByVal lFcnPtr As LongPtr) As LongPtr
PtrToFunction = lFcnPtr
End Function
Private Function CorrectPath(ByVal sPath As String) As String
If Right$(sPath, 1) = "\" Then
If Len(sPath) > 3 Then sPath = Left$(sPath, Len(sPath) - 1) ' Strip backslash from non-root
Else
If Len(sPath) = 2 Then sPath = sPath & "\" ' Append backslash to root
End If
CorrectPath = sPath
End Function
Public Function FolderExists(ByVal sFolderName As String) As Boolean
Dim att As Long
On Error Resume Next
att = GetAttr(sFolderName)
If Err.Number = 0 Then
FolderExists = True
Else
Err.Clear
FolderExists = False
End If
On Error GoTo 0
End Function
2. in the code for the frmMultiScript, only code for the 3 buttons' click event handling code changed:
Private Sub cmdAddDwg_Click()
'''' Dim objFile As CommonDialog, file
''''
'''' Set objFile = New CommonDialog
'''' With objFile
'''' .DialogTitle = "Select files to process: "
'''' .Filter = "AutoCAD Drawings (*.dwg)|*.dwg|" & _
'''' "All Files (*.*)|*.*"
'''' .FilterIndex = 0
'''' .flags = OFN_ALLOWMULTISELECT Or OFN_EXPLORER Or OFN_FILEMUSTEXIST
'''' .InitDir = ThisDrawing.Path
'''' .MaxFileSize = 4096
'''' If .ShowOpen Then
'''' If Not .FileName = "" Then
'''' For Each file In .ParseFileNames
'''' frmMultiScript.lstDwgList.AddItem file
'''' Next file
'''' End If
'''' End If
'''' End With
''''
'''' lstDwgList_Change
Dim initFolder As String
Dim filter As String
Dim fileNames() As String
Dim i As Integer
initFolder = ThisDrawing.Path
filter = "AutoCAD Drawing Files (*.dwg)|*.dwg|All Files (*.*)|*.*"
fileNames = GetFiles(initFolder, "Select Drawing Files", filter, 0)
If UBound(fileNames) > 0 Then
For i = 1 To UBound(fileNames)
lstDwgList.AddItem fileNames(0) & "\" & fileNames(i)
Next
End If
End Sub
and
Private Sub cmdBrowse_Click()
''''' Dim fh As Variant
''''' Dim tmp As String
''''' Dim objFile As CommonDialog, file
'''''
''''' Set objFile = New CommonDialog
''''' With objFile
''''' .DialogTitle = "Select AutoCAD Script (*.scr) file: "
''''' .Filter = "AutoCAD Script Files (*.scr)|*.scr|" & _
''''' "All Files (*.*)|*.*"
''''' .FilterIndex = 0
''''' .flags = OFN_EXPLORER Or OFN_FILEMUSTEXIST
''''' .InitDir = ThisDrawing.Path
''''' .MaxFileSize = 4096
''''' If .ShowOpen Then
''''' If .FileName <> "" Then
''''' frmMultiScript.txtScriptFileName.Text = .FileName
''''' End If
''''' End If
''''' End With
Dim scrFile As String
Dim initFolder As String
Dim filter As String
initFolder = ThisDrawing.Path
filter = "AutoCAD Script Files (*.scr)|*.scr|All Files (*.*)|*.*"
scrFile = FileBrowseOpen(initFolder, "Select AutoCAD Script File (*.scr)", filter, 0)
If Len(scrFile) > 0 Then
txtScriptFileName.Text = scrFile
End If
End Sub
and
Private Sub cmdtxt_Click()
''''Dim fh As Variant
''''Dim tmp As String
''''Dim objFile As CommonDialog, file
''''
'''' Set objFile = New CommonDialog
'''' With objFile
'''' .DialogTitle = "Select Text (*.txt) file: "
'''' .Filter = "Text Files (*.txt)|*.txt|" & _
'''' "All Files (*.*)|*.*"
'''' .FilterIndex = 0
'''' .flags = OFN_EXPLORER Or OFN_FILEMUSTEXIST
'''' .InitDir = ThisDrawing.Path
'''' .MaxFileSize = 4096
'''' If .ShowOpen Then
'''' If .FileName <> "" Then
'''' fh = FreeFile
'''' Open .FileName For Input As #fh
''''
'''' Do While Not EOF(fh)
'''' Line Input #fh, tmp
'''' frmMultiScript.lstDwgList.AddItem tmp
'''' Loop
''''
'''' Close fh
'''' End If
'''' End If
'''' End With
''''
Dim txtFile As String
Dim initFolder As String
Dim filter As String
Dim fh As Integer
Dim tmp As String
initFolder = ThisDrawing.Path
filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*"
txtFile = FileBrowseOpen(initFolder, "Select Text File (*.txt)", filter, 0)
If Len(txtFile) > 0 Then
lstDwgList.Clear
fh = FreeFile
Open txtFile For Input As #fh
Do While Not EOF(fh)
Line Input #fh, tmp
frmMultiScript.lstDwgList.AddItem tmp
Loop
Close fh
End If
lstDwgList_Change
End Sub
HTH