Открыть папку (каталог) в проводнике Windows для просмотра из кода VBA Excel с помощью функции Shell и ключевых слов explorer и cmd. Передача фокуса открытой папке.
Открытие папки в проводнике
Открытие папки (каталога) в проводнике Windows для просмотра с помощью функции Shell и ключевого слова explorer:
Shell «explorer C:UsersPublicТекущая папка», vbNormalFocus |
vbNormalFocus означает, что окно Windows Explorer получает фокус и восстанавливает свое исходное положение и размер.
Преимущество способа: имя папки может содержать пробелы.
Недостаток способа: если открываемая папка уже открыта, открывается второй экземпляр, затем третий и т.д.
То же преимущество и тот же недостаток у следующего способа:
ThisWorkbook.FollowHyperlink «C:UsersPublicТекущая папка» |
Открытие или передача фокуса
Открытие папки (каталога) в проводнике Windows для просмотра или передача папке фокуса, если она уже открыта, с помощью функции Shell и ключевого слова cmd:
Shell «cmd /C start C:UsersPublic», vbNormalFocus |
При реализации этого способа происходит кратковременное отображение на экране окна командной строки (cmd.exe). Если убрать параметр vbNormalFocus
, окно командной строки мелькать не будет, но и окно проводника, при повторном его вызове, не получит фокус.
Преимущество способа: если открываемая папка уже открыта, ей передается фокус, а второй экземпляр этой папки не открывается.
Недостаток способа: имя папки не должно содержать пробелы.
От недостатка этого способа можно избавиться с помощью экранирующих кавычек:
Shell «cmd /C start ««»» ««C:UsersPublicТекущая папка»«», vbNormalFocus |
Для себя на заметку, какие кавычки что экранируют:
«[cmd /C start ««[неиспользуемый параметр]»» ««[C:UsersPublicТекущая папка]»«]» |
Смотрите как открывать из кода VBA Excel файлы других приложений и интернет-сайты.
Добрый день, подскажите как с помощью макроса открыть определенную папку, например C:BUILDINGDoc, с помощью стандартного проводника Windows. |
|
Слэн Пользователь Сообщений: 5192 |
Shell «explorer C:tempdbf» |
А можно выложить код полностью ? |
|
Слэн Пользователь Сообщений: 5192 |
#4 10.01.2014 15:10:57
Живи и дай жить.. |
||||
выдает ошибку |
|
SkyPro Пользователь Сообщений: 309 |
Проверил. Не выдает ошибку. |
Виноват, моя ошибка. |
|
Слэн Пользователь Сообщений: 5192 |
если вам надо выбрать папку для дальнейшей обработки в икселе, то надо идти другим путем, а так — что просили, то и получили(только подставьте свой путь к папке) чувствую, что вам не надо было открывать в проводнике виндоус, а лучше бы открыть средствами икселя.. |
Мне нужно чтобы просто открывалась папка, но с условием что она при открытии становится активной. |
|
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#10 10.01.2014 16:16:14 Как бы это…Вас на Яндексе и Google забанили? вводим волшебное сочетание: «выбор папки VBA» и смотрим ответы. Нельзя же по каждой хотелке бежать в форум и ждать решения, когда их в интернете полно и так.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Я конечно понимаю что на Яндексе и Google есть ответы, но я не нашел по описанию подходящий к моему примеру. The_Prist , вставил ваш код в код Слэна, все работает но не отражает что лежит в нутри папки(т.е. файлы excel и т.д). |
|
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#12 10.01.2014 16:58:08 Ну вот, желание давать решение пропало…С чего Вы взяли, что форумы созданы для того, чтобы каждому исполнять его хотелки? Где тут помощь? Где Ваши попытки решить свою задачу? Вы в курсе, что подразумевает под собой помощь? На этом форуме по меньшей мере Вам никто ничего не должен. И то, что Вы в этом ничего не понимаете не является ни плюсом, ни причиной для поблажек. Форумы предназначены для помощи в освоении материала, а не для решения задач каждому, кто не в состоянии сделать это самостоятельно. Конкретно Ваша задача не сложна сама по себе, но подобное отношение к форуму(он создан, чтобы сделать за меня!) никак не располагает к тому, чтобы давать решение. Тем не менее, надеясь на исправление:
И у меня после открытия показывет все содержимое выбранной папки. Что там у Вас получается не знаю. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
С чего вы взяли что я не искал, искал и долго, пробовал разные варианты. |
|
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Меня лично Вы ничем не обидели. Но многие участники форума, как и я, вполне могут просто не захотеть отвечать человеку, который считает, что форум создан для решения его задач. С чего взял, что Вы не искали: если бы искали — нашли бы хоть какой-то код и уведомили бы нас о том, какой код пробовали и что в нем не устраивает. Кодов подобных навалом в сети. Ничего даже близкого к этому ни в одном Вашем сообщении я не увидел. Конечно, это не значит, что Вы не искали. Но впечатление складывается именно такое. Если не прав — приношу извинения. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Слэн Пользователь Сообщений: 5192 |
#15 11.01.2014 11:27:30 понимаете, вы в своем вопросе уж очень сузили проблему — те указали и результат и способ, которым надо его достигнуть, но не указали цель вообще всегго этого. если бы написали, что мол мне нужно выбрать файл из папки и что-то там с ним сделать, то вариантов бы было гораздо больше.. ну и модератор прав — следов/примеров вашей деятельности не наблюдается.. из них тоже можно было бы вычислить контекст.. Живи и дай жить.. |
Уже прогресс !
Вставил в процедуру, пока, код от petr-sev. Открывает, однако, общую папку с Книгой и папкой с документами Word. Эта общая папка не активна. Макрос должен открывать только папку с документами. Необходимо, очевидно, указать путь.
Добавлено через 1 час 18 минут
Указав путь выходим на нужную папку с документами
Visual Basic | ||
|
Однако папка с документами свёрнута или не активна, её ярлык видно на панели уведомлений. Для выхода на файлы в папке ещё необходимо нажать ярлык папки на панели уведомлений.
Такой вопрос — какую ещё добавить команду, чтобы папка с документами появлялась активной, тоесть, чтобы были видны непосредственно ярлыки внутренних файлов Word в папке ?
Here is some more cool knowledge to go with this:
I had a situation where I needed to be able to find folders based on a bit of criteria in the record and then open the folder(s) that were found. While doing work on finding a solution I created a small database that asks for a search starting folder gives a place for 4 pieces of criteria and then allows the user to do criteria matching that opens the 4 (or more) possible folders that match the entered criteria.
Here is the whole code on the form:
Option Compare Database
Option Explicit
Private Sub cmdChooseFolder_Click()
Dim inputFileDialog As FileDialog
Dim folderChosenPath As Variant
If MsgBox("Clear List?", vbYesNo, "Clear List") = vbYes Then DoCmd.RunSQL "DELETE * FROM tblFileList"
Me.sfrmFolderList.Requery
Set inputFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With inputFileDialog
.Title = "Select Folder to Start with"
.AllowMultiSelect = False
If .Show = False Then Exit Sub
folderChosenPath = .SelectedItems(1)
End With
Me.txtStartPath = folderChosenPath
Call subListFolders(Me.txtStartPath, 1)
End Sub
Private Sub cmdFindFolderPiece_Click()
Dim strCriteria As String
Dim varCriteria As Variant
Dim varIndex As Variant
Dim intIndex As Integer
varCriteria = Array(Nz(Me.txtSerial, "Null"), Nz(Me.txtCustomerOrder, "Null"), Nz(Me.txtAXProject, "Null"), Nz(Me.txtWorkOrder, "Null"))
intIndex = 0
For Each varIndex In varCriteria
strCriteria = varCriteria(intIndex)
If strCriteria <> "Null" Then
Call fnFindFoldersWithCriteria(TrailingSlash(Me.txtStartPath), strCriteria, 1)
End If
intIndex = intIndex + 1
Next varIndex
Set varIndex = Nothing
Set varCriteria = Nothing
strCriteria = ""
End Sub
Private Function fnFindFoldersWithCriteria(ByVal strStartPath As String, ByVal strCriteria As String, intCounter As Integer)
Dim fso As New FileSystemObject
Dim fldrStartFolder As Folder
Dim subfldrInStart As Folder
Dim subfldrInSubFolder As Folder
Dim subfldrInSubSubFolder As String
Dim strActionLog As String
Set fldrStartFolder = fso.GetFolder(strStartPath)
' Debug.Print "Criteria: " & Replace(strCriteria, " ", "", 1, , vbTextCompare) & " and Folder Name is " & Replace(fldrStartFolder.Name, " ", "", 1, , vbTextCompare) & " and Path is: " & fldrStartFolder.Path
If fnCompareCriteriaWithFolderName(fldrStartFolder.Name, strCriteria) Then
' Debug.Print "Found and Opening: " & fldrStartFolder.Name & "Because of: " & strCriteria
Shell "EXPLORER.EXE" & " " & Chr(34) & fldrStartFolder.Path & Chr(34), vbNormalFocus
Else
For Each subfldrInStart In fldrStartFolder.SubFolders
intCounter = intCounter + 1
Debug.Print "Criteria: " & Replace(strCriteria, " ", "", 1, , vbTextCompare) & " and Folder Name is " & Replace(subfldrInStart.Name, " ", "", 1, , vbTextCompare) & " and Path is: " & fldrStartFolder.Path
If fnCompareCriteriaWithFolderName(subfldrInStart.Name, strCriteria) Then
' Debug.Print "Found and Opening: " & subfldrInStart.Name & "Because of: " & strCriteria
Shell "EXPLORER.EXE" & " " & Chr(34) & subfldrInStart.Path & Chr(34), vbNormalFocus
Else
Call fnFindFoldersWithCriteria(subfldrInStart, strCriteria, intCounter)
End If
Me.txtProcessed = intCounter
Me.txtProcessed.Requery
Next
End If
Set fldrStartFolder = Nothing
Set subfldrInStart = Nothing
Set subfldrInSubFolder = Nothing
Set fso = Nothing
End Function
Private Function fnCompareCriteriaWithFolderName(strFolderName As String, strCriteria As String) As Boolean
fnCompareCriteriaWithFolderName = False
fnCompareCriteriaWithFolderName = InStr(1, Replace(strFolderName, " ", "", 1, , vbTextCompare), Replace(strCriteria, " ", "", 1, , vbTextCompare), vbTextCompare) > 0
End Function
Private Sub subListFolders(ByVal strFolders As String, intCounter As Integer)
Dim dbs As Database
Dim fso As New FileSystemObject
Dim fldFolders As Folder
Dim fldr As Folder
Dim subfldr As Folder
Dim sfldFolders As String
Dim strSQL As String
Set fldFolders = fso.GetFolder(TrailingSlash(strFolders))
Set dbs = CurrentDb
strSQL = "INSERT INTO tblFileList (FilePath, FileName, FolderSize) VALUES (" & Chr(34) & fldFolders.Path & Chr(34) & ", " & Chr(34) & fldFolders.Name & Chr(34) & ", '" & fldFolders.Size & "')"
dbs.Execute strSQL
For Each fldr In fldFolders.SubFolders
intCounter = intCounter + 1
strSQL = "INSERT INTO tblFileList (FilePath, FileName, FolderSize) VALUES (" & Chr(34) & fldr.Path & Chr(34) & ", " & Chr(34) & fldr.Name & Chr(34) & ", '" & fldr.Size & "')"
dbs.Execute strSQL
For Each subfldr In fldr.SubFolders
intCounter = intCounter + 1
sfldFolders = subfldr.Path
Call subListFolders(sfldFolders, intCounter)
Me.sfrmFolderList.Requery
Next
Me.txtListed = intCounter
Me.txtListed.Requery
Next
Set fldFolders = Nothing
Set fldr = Nothing
Set subfldr = Nothing
Set dbs = Nothing
End Sub
Private Function TrailingSlash(varIn As Variant) As String
If Len(varIn) > 0& Then
If Right(varIn, 1&) = "" Then
TrailingSlash = varIn
Else
TrailingSlash = varIn & ""
End If
End If
End Function
The form has a subform based on the table, the form has 4 text boxes for the criteria, 2 buttons leading to the click procedures and 1 other text box to store the string for the start folder. There are 2 text boxes that are used to show the number of folders listed and the number processed when searching them for the criteria.
If I had the Rep I would post a picture… :/
I have some other things I wanted to add to this code but haven’t had the chance yet. I want to have a way to store the ones that worked in another table or get the user to mark them as good to store.
I can not claim full credit for all the code, I cobbled some of it together from stuff I found all around, even in other posts on stackoverflow.
I really like the idea of posting questions here and then answering them yourself because as the linked article says, it makes it easy to find the answer for later reference.
When I finish the other parts I want to add I will post the code for that too.
Открыть папку макросом |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |