Ошибка при циклическом просмотре слайд-шоу изображений из фотографий в папке - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь создать слайд-шоу изображений, изменяя свойство элемента управления изображением .picture, просматривая все изображения в предопределенной папке

C: \ Images

Код, который я использую:

    Public pixpaths As Collection
    Public pix_path As String
    Public pixnum As Integer
    Public fs As YtoFileSearch
    Public k As Integer

    Public Sub Image_set()
    Set pixpaths = New Collection
    pix_path = "C:\Images"
    Set fs = New YtoFileSearch
    With fs
      .NewSearch
      .LookIn = pix_path
      .fileName = "*.jpg"
      If fs.Execute() > 0 Then
        For k = 1 To .FoundFiles.Count
          pixpaths.Add Item:=.FoundFiles(k)
        Next k
      Else
        MsgBox "No files found!"
        DoCmd.OpenForm "Fr_Sketchpad"    ' If no images found in folder the set image from another form 'Sketchpad' image control
        Forms!Fr_Sketchpad.Visible = False
        Forms!Fr_Main!imgPixHolder.Picture = "" 'Forms!Fr_Sketchpad!Img_Std.Picture   Was getting another error here so commented this
        pixnum = 0
        Exit Sub
      End If
    End With
    'load first pix
    Forms!Fr_Main.imgPixHolder.Picture = pixpaths(1)
    pixnum = 1
    End Sub

    Public Sub Image_loop()
          If pixnum = pixpaths.Count Then
          pixnum = 1
        ElseIf pixnum = 0 Then
            Exit Sub
        Else
          pixnum = pixnum + 1
          Forms!Fr_Main!imgPixHolder.Picture = pixpaths(pixnum)
        End If
    End Sub

    Private Sub Form_Open(Cancel As Integer)
     Call Image_set
    End Sub

    Private Sub Form_Timer()
     Call Image_loop
    End Sub

Image_Set (), Image_loop () и переменные находятся в одном модуле и вызываются в событиях Form_open и Form_timer. Код работает нормально для одного цикла цикла, но для следующегоцикл цикла показывает ошибку:

Ошибка 91 объектная переменная или с переменной блока не установлено

on

If pixnum = pixpaths.Count Then

В режиме отладки, когдаЯ проверяю значение для pixnum это 0

[Обновление] Модуль класса YtoFileSearch

    Option Compare Database
Option Explicit

' How this is not another proof that doing VBA is a bad idea?
' Nevertheless, we'll try to make the scripts relying on Application.FileSearch works again.

' The interface of this YtoFileSearch class aims to stick to the original
' Application.FileSearch class interface.
' Cf is https://msdn.microsoft.com/en-us/library/office/aa219847(v=office.11).aspx

' For now it do not handle recursive search and only search for files.
' More precisely the following filters are not implemented:
' * SearchSubFolders
' * MatchTextExactly
' * FileType
' If that's something you need, please create an issue so we have a look at it.

' Our class attributes.
Private pDirectoryPath As String
Private pFileNameFilter As String
Private pFoundFiles As Collection

' Set the directory in which we will search.
Public Property Let LookIn(directoryPath As String)
    pDirectoryPath = directoryPath
End Property

' Allow to filter by file name.
Public Property Let fileName(fileName As String)
    pFileNameFilter = fileName
End Property

'Property to get all the found files.
Public Property Get FoundFiles() As Collection
    Set FoundFiles = pFoundFiles
End Property

' Reset the FileSearch object for a new search.
Public Sub NewSearch()
    'Reset the found files object.
    Set pFoundFiles = New Collection
    ' and the search criterions.
    pDirectoryPath = ""
    pFileNameFilter = ""
End Sub

' Launch the search and return the number of occurrences.
Public Function Execute() As Long
    'Lance la recherche
    doSearch

    Execute = pFoundFiles.Count
End Function

' Do the nasty work here.
Private Sub doSearch()
    Dim directoryPath As String
    Dim currentFile As String
    Dim filter As String

    directoryPath = pDirectoryPath
    If InStr(Len(pDirectoryPath), pDirectoryPath, "\") = 0 Then
        directoryPath = directoryPath & "\"
    End If

    ' If no directory is specified, abort the search.
    If Len(directoryPath) = 0 Then
        Exit Sub
    End If

    ' Check that directoryPath is a valid directory path.
    ' http://stackoverflow.com/questions/15480389/excel-vba-check-if-directory-exists-error
    If Dir(directoryPath, vbDirectory) = "" Then
        Debug.Print "Directory " & directoryPath & " does not exists"
        Exit Sub
    Else
        If (GetAttr(directoryPath) And vbDirectory) <> vbDirectory Then
            Debug.Print directoryPath & " is not a directory"
            Exit Sub
        End If
    End If

    ' We rely on the Dir() function for the search.
    ' cf https://msdn.microsoft.com/fr-fr/library/dk008ty4(v=vs.90).aspx

    ' Create the filter used with the Dir() function.
    filter = directoryPath

    If Len(pFileNameFilter) > 0 Then
        ' Add the file name filter.
        filter = filter & "*" & pFileNameFilter & "*"
    End If

    ' Start to search.
    currentFile = Dir(filter)
    Do While currentFile <> ""
        ' Use bitwise comparison to make sure currentFile is not a directory.
        If (GetAttr(directoryPath & currentFile) And vbDirectory) <> vbDirectory Then
            ' Add the entry to the list of found files.
            pFoundFiles.Add directoryPath & currentFile
        End If
        ' Get next entry.
        currentFile = Dir()
    Loop
End Sub

Пожалуйста, посоветуйте, как решить!

1 Ответ

0 голосов
/ 17 мая 2018

Я должен ответить на ваш вопрос с комментариями, который вы задали мне здесь. Это может не решить вашу проблему, но может помочь вам найти ее, особенно если ошибка связана с тем, что вы задали pixpaths = nothing в другой функции, как предложено @dbmitch.

Вы должны ссылаться на файл «Файлы» в Image_Set так же, как и в pixpath, коллекция заполняется подпрограммой doSearch из функции .Execute, поэтому следующий код должен работать так же. Кроме того, если вы не используете свои аргументы в другом модуле, возможно, вы захотите сделать их закрытыми, как я сделал здесь.

Private pix_path As String
Private pixnum As Integer
Private fs As YtoFileSearch

Public Sub Image_set()
    pix_path = "C:\Images"
    Set fs = New YtoFileSearch

    With fs
        .NewSearch
        .LookIn = pix_path
        .fileName = "*.jpg"

        If fs.Execute() > 0 Then
            'load first pix
            Forms!Fr_Main.imgPixHolder.Picture = .FoundFiles(1)
            pixnum = 1
        Else
            MsgBox "No files found!"
            DoCmd.OpenForm "Fr_Sketchpad"    ' If no images found in folder the set image from another form 'Sketchpad' image control
            Forms!Fr_Sketchpad.Visible = False
            Forms!Fr_Main!imgPixHolder.Picture = "" 
            'Forms!Fr_Sketchpad!Img_Std.Picture   Was getting another error here so commented this
            pixnum = 0
        End If
    End With
End Sub

Public Sub Image_loop()
    With fs
        If pixnum = .FoundFiles.Count Then
            pixnum = 1
        ElseIf pixnum <> 0 Then
            pixnum = pixnum + 1
            Forms!Fr_Main!imgPixHolder.Picture = .FoundFiles(pixnum)
        End If
    End With
End Sub
...