JayyMehta Ответов: 3

Невозможно открыть файл с помощью FSO


Я пытаюсь открыть файл с помощью FileSystemObject, но когда я пытаюсь запустить его, система ничего не делает. Не показывает мне отладку, нет ошибки во время выполнения, не компилируется... Она просто остается такой, какая есть. Я также проверил "MS Scripting Runtime" в ссылках.

Что я уже пробовал:

Sub fsoobject()
Dim fso As New FileSystemObject, f As Folder, sf As Folder, myFile As File
Set f = fso.GetFolder("C:\Users\jpmehta\Desktop")

For Each sf In f.SubFolders
    For Each mySubFolder In myFolder.SubFolders
        For Each myFile In mySubFolder.Files
            If myFile.Name Like "Done" Then
                MsgBox myFile.Name
                Exit For
            End If
        Next

        MsgBox "Else"
    Next
Next

End Sub

F-ES Sitecore

Если вы запускаете это в Excel, то это, вероятно, проблема безопасности. Чтобы создать FSO (или любой COM-объект) в среде сценариев, он должен быть настроен как безопасный для этого в реестре. Поскольку ФСО является опасным компонентом, он не помечен как безопасный.

CHill60

Если он не компилируется, то какие ошибки вы получаете? Сначала обратитесь к ним.
Когда вы запустите его, то обнаружите, что вы не объявили ни mySubFolder, ни myFolder. Переменная myFolder не инициализирована (я подозреваю, что она должна была быть sf).
Вы не получите никаких выходных данных, если на вашем рабочем столе нет никаких подпапок, и только тогда, если эти подпапки имеют свои собственные подпапки.
Если вы пытаетесь рекурсивно искать свою папку f, то вам следует использовать рекурсивную процедуру - у Google есть много примеров

3 Ответов

Рейтинг:
8

JayyMehta

Sub fsoobject()
Dim fso As New FileSystemObject, f As Folder, sf As Folder, myFile As File
Set f = fso.GetFolder("C:\Users\jpmehta\Desktop")

'For Each sf In f.SubFolders
'    For Each mySubFolder In sf.SubFolders
'        For Each myFile In mySubFolder.Files
'            If myFile.Name Like "Done" Then
'                MsgBox myFile.Name
'                Exit For
'            End If
'        Next
'
'        MsgBox "Else"
'    Next
'Next

    Dim File
    For Each File In f.Files
        If File.Name = "Done.PNG" Then
            Call Shell("Explorer.exe """ & File.Path & """", vbNormalFocus)
            Exit For
        End If
    Next

End Sub



Sub fsoobject()
Дим ФСО как New filesystemobject, с, F, как папку, СФ как папку, файл myfile как файл
Набор Ф = ФСО.GetFolder("C:\Users\jpmehta\Desktop")

'Для каждого sf в f.подпапках
- Для каждой папки mysub в подпапках sf.
- Для каждого myFile в mySubFolder.Файлы
- Если мой файл.Тогда Имя Вроде "Готово"
'С помощью MsgBox файл myfile.Название
'Выход Для
- Конец, Если
- Следующий
'
"MsgBox "Еще"
- Следующий
- Следующий

Тусклый Файл
Для каждого файла в f.Files
Если Файл.Тогда Name = "Done.PNG"
Вызовите оболочку("Explorer.exe """ & файл.Path & """", vbNormalFocus)
Выход Для
Конец, Если
Следующий

Конец Подводной Лодки
Ну, я немного поискал и нашел это ключевое слово "Shell", чтобы открыть файл. После применения этого кода он теперь успешно выполняется...


CHill60

Если вы пытались открыть файл, то вы должны были дать понять, что это был тот бит, который был проблемой с кодом, который у вас был. Вы даже не пытались открыть файлы в вашем фрагменте кода!
Чем больше ясности вы используете в своем вопросе тем лучше будут предложены решения

JayyMehta

Мне жаль, что вы не поняли, но я уже упоминал в вопросе, что "я пытаюсь открыть файл..."

Рейтинг:
2

phil.o

Возможно, вам придется написать

For Each mySubFolder In sf.SubFolders

вместо.
(Правка: вот почему мне не нравятся языки, которые не навязывают объявление переменных)


Рейтинг:
0

CHill60

В дополнение к решению phil.o, вот рабочее решение, которое будет сканировать все подпапки начальной папки и перечислять все файлы. Он не делает именно то, что вам нужно, но он демонстрирует, как рекурсивно вызывать функцию.

Option Explicit
Sub fsoobject()
    Dim fso As New FileSystemObject, f As folder
    Set f = fso.GetFolder("C:\Temp")
    Debug.Print "Start..."
    recurs f
    Debug.Print "...End"
End Sub
Sub recurs(folder As folder)
    Dim subFolder As folder
    For Each subFolder In folder.SubFolders
        recurs subFolder
    Next
    Dim myFile As File
    For Each myFile In folder.Files
        Debug.Print folder.Name & " " & myFile.Name
    Next
End Sub
Обратите внимание на использование Option Explicit - Я вам очень советую это сделать всегда включите эту строку в свой код VBA. Вы можете установить его в качестве параметра по умолчанию в VBE.

Согласно моему комментарию, если ваш код не компилируется, то вы должны решить эти проблемы первый Вот почему я не люблю языки, которые интерпретируются (например, VBA), поскольку вы действительно можете выполнить неисправный код и знать о проблеме только тогда, когда она выходит из строя .

Наконец, научитесь использовать точки останова и пошагово выполнять код с помощью отладчика - тогда было бы совершенно ясно, в чем заключаются проблемы.


F-ES Sitecore

VBA не интерпретируется, VBScript есть, но VBA нет :)

CHill60

VBA только "компилируется" в P-код, а затем "интерпретируется". Это не так далеко, как машинный код или исполняемый файл. Я хотел сказать, что вы можете иметь вопиющие синтаксические ошибки в коде, но все же "запускать" приложение. Ошибки выделяются только тогда, когда вы нажимаете на конкретную функцию или подфункцию, содержащую ошибку(ы), - при условии, что ваше тестирование достаточно надежно, чтобы охватить все пути кода. Это по сравнению с более классическими "компилируемыми" языками, где вы не можете приступить к "запуску" своего кода, пока "компиляция" не будет завершена и успешна.

F-ES Sitecore

Это все равно что сказать, что .net только "компилируется" в CLR, а это "интерпретируется". Технически VBA является компилируемым языком точно так же, как и собственно VB. Причина, по которой вы можете ошибаться с переменными типами и т. д., Как и с интерпретируемым языком, заключается в том, что он поддерживает позднюю привязку и "вариантные" типы, но все же является компилируемым языком.