Как обновить словарь? - PullRequest
0 голосов
/ 19 января 2020

Я должен перебрать свою папку и добавить имена файлов в словарь, а затем использовать существующий словарь (например, 60 файлов) в качестве справочного материала для следующего запуска макроса.

Если моя папка не ' Не должно быть никаких изменений, поэтому 60 имен файлов соответствуют словарю, а затем ничего не делают.

Если в папку внесены изменения, например, в папку добавлено три новых файла, то обновите словарь, добавив новый затем имена файлов «сделать что-то», но только для трех новых файлов, а не для 60 существующих файлов, если только один из 60 существующих файлов не был удален.

Код, несмотря на добавление файлов в папку, не обновляется словарь, и, несмотря на то, что он имеет такое же количество файлов, он все равно «делает что-то».

Я никогда не использовал словарь ранее ни на одной платформе и не знаю об этом.

Код Предоставлено JvdV Excel Vba избежать повторного извлечения данных

Public Dict As Object

Sub Test()

Dim oFSO As Object, oFolder As Object

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder("C:\Users\Desktop\asi")
If Dict Is Nothing Then
    Set Dict = CreateObject("Scripting.Dictionary")
End If

For Each oFile In oFolder.Files
    If Dict.Exists(oFSO.GetBaseName(oFile)) Then
        'Skip file
    Else
        'Don't skip file and do something....
        'Add to dictionary for next iteration
        Dict.Add oFSO.GetBaseName(oFile), 1
    End If
Next oFile

Range("A1").Resize(UBound(Dict.Keys)).Value = Application.Transpose(Dict.Keys)

End Sub

1 Ответ

1 голос
/ 19 января 2020

Кажется, отсутствует последний файл. Я протестировал и изменил эту строку, и она включала все файлы:

Range("A1").Resize(UBound(Dict.Keys) + 1).Value = Application.Transpose(Dict.Keys)

Я также добавил несколько строк отладки, чтобы увидеть, какие решения он принимает. Вы также можете добавить их, если хотите.

If Dict.Exists(oFSO.GetBaseName(oFile)) Then
    'Skip file
    Debug.Print "E: " & oFSO.GetBaseName(oFile) ' <--- added this
Else
    'Don't skip file and do something....
    'Add to dictionary for next iteration
    Dict.Add oFSO.GetBaseName(oFile), 1
    Debug.Print "A: " & oFSO.GetBaseName(oFile) ' <--- added this
End If

Обновление:

Если вы пытаетесь просто получить бесплатную sh копию того, что файлы все еще там, за исключением тех, которые были удалены, тогда вам не нужно использовать строку словаря Public. Вам просто нужно это вместо:

Sub Test_3()

Dim oFSO As Object, oFolder As Object, oFile As Object

Dim dictNew As Object
Set dictNew = CreateObject("Scripting.Dictionary")

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder("C:\Users\Desktop\asi")

For Each oFile In oFolder.Files
    If dictNew.Exists(oFSO.GetBaseName(oFile)) Then
        'Skip file
        Debug.Print "E: " & oFSO.GetBaseName(oFile)
    Else
        'Don't skip file and do something....
        'Add to dictionary for next iteration
        Debug.Print "A: " & oFSO.GetBaseName(oFile)
        dictNew.Add oFSO.GetBaseName(oFile), 1
    End If
Next oFile

' clear column A
Range("A:A").Clear

' display only the new files
If UBound(dictNew.Keys) > -1 Then
    Range("A1").Resize(UBound(dictNew.Keys) + 1).Value = Application.Transpose(dictNew.Keys)
Else
    MsgBox "No new files found"
End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...