VBA: сбор и отображение сообщений об ошибках в пользовательской форме? - PullRequest
0 голосов
/ 01 мая 2019

Я написал некоторый код в VBA, который получает данные из других рабочих книг, а затем обновляет несколько «мастер-файлов», через которые мой код зацикливается.Прямо сейчас я делаю резервную копию перед обновлением данных и в конце цикла сохраняю обновленный файл.Код работает, и я не уверен, насколько он уместен даже к вопросу:

Sub YearlyReport()

Dim FilePath As String
Dim VWArray As Variant
Dim wbVWAggr As Workbook
Dim VWNumber As Variant

FilePath = "C:\VBA\YearlyReport\"
VWArray = Array(21, 25, 35, 45, 46, 49, 51, 52, 53, 54, 101)

Application.ScreenUpdating = False
    For Each VWNumber In VWArray
        Set wbVWAggr = Application.Workbooks.Open(FilePath & "Report" & VWNumber & ".xlsx")
        wbVWAggr.SaveAs FilePath & "Report" & VWNumber & "_old" & Format(Now(), "dd-mm-yyyy hh-mm-ss") & ".xlsx"

        'Data gets copy pasted from other workbooks

        Application.DisplayAlerts = False 'Overwrite old file
        wbVWAggr.SaveAs FilePath & "Report" & VWNumber & ".xlsx"
        Application.DisplayAlerts = True
    Next VWNumber

Application.ScreenUpdating = True   
End Sub

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

Sub ErrorCollection()
    Dim ErrorCount As Long
    Dim ErrorArray() As String
    Dim FilePath As String
    Dim VWNumber As Variant
    Dim VWArray As Variant
    Dim ErrorMessage As String
    Dim Item As Variant

    FilePath = "C:\VBA\YearlyReport\"
    VWArray = Array(21, 25, 35, 45, 46, 49, 51, 52, 53, 54, 101)

    For Each VWNumber In VWArray
        If Dir$(FilePath & "Report" & VWNumber & ".xlsx") = "" Then
            ErrorMessage = "Report" & VWNumber & " cannot be found."
            ReDim Preserve ErrorArray(ErrorCount)
            ErrorArray(ErrorCount) = ErrorMessage
            ErrorCount = ErrorCount + 1
        End If
    Next VWNumber

    If ErrorCount > 0 Then
        MsgBox Join(ErrorArray, vbCrLf)
    End If
End Sub

В идеале пользователь может также скрыть всплывающее сообщение, чтобы посмотреть на файлы, что означает использование UserForm - но в таком случае, как я могу показать сообщения об ошибках, как в MsgBox?Я попробовал поискать в Google, но я только сталкивался с вопросами, как заполнить массив из пользовательской формы.

...