Ошибка скрипта VBA: «Вспомогательный элемент или функция не определены»

#vba #excel

#vba #excel

Вопрос:

Я написал следующий код, который должен открыть указанный каталог Windows, а затем один за другим обработать все файлы Excel (.xls) в этом месте. Чтобы быть более конкретным, код откроет файл Excel, возьмет имя, указанное на листе, и поместит это имя / значение в ячейку A1 этого листа, а затем сохранит и закроет файл. Затем он перейдет к следующему файлу Excel в каталоге.

Проблема, с которой я сталкиваюсь, заключается в том, что при выполнении кода я получаю следующую ошибку компиляции: «Sub или функция не определены». Я просто не могу понять, что вызывает эту ошибку.

Пожалуйста, ознакомьтесь с приведенным ниже кодом:

 Sub UseSheetName()
    selectedfolder = GetFolder("c:")
    Call updateAllWorkbooks(selectedfolder)
End Sub

Function GetFolder(strPath As String) As String
    Dim fldr As FileDialog
    Dim sItem As String
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Select a Folder"
        .AllowMultiSelect = False
        .InitialFileName = strPath

        If .Show <> -1 Then GoTo NextCode
            sItem = .SelectedItems(1)
    End With

NextCode:
    GetFolder = sItem
    Set fldr = Nothing
End Function

Function updateAllWorkbooks(workDir)
    Dim fso, f, fc, fl
    Dim newName As String, appStr As String, SubDir As String

    On Error GoTo updateAllWorkbooks_Error

    SubDir = workDir amp; "" amp; "ConvertedFiles"
    If Not fExists(SubDir) Then
        MkDir SubDir
    End If

    Application.ScreenUpdating = False

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFolder(workDir)
    Set fc = f.Files

    For Each fl In fc
        If Right(fl, 4) = ".xls" Then
            Application.DisplayAlerts = False
            Workbooks.Open Filename:=fl
            ActiveSheet.[a1] = ActiveSheet.Name
            ActiveWorkbook.Save
            ActiveWorkbook.Close
            Application.DisplayAlerts = True
        End If
    Next

    Application.ScreenUpdating = True

    On Error GoTo 0
    Exit Function

updateAllWorkbooks_Error:
    MsgBox "Error " amp; Err.Number amp; " (" amp; Err.Description amp; ") in procedure updateAllWorkbooks of Module Module2"
End Function
  

Комментарии:

1. При компиляции с такой ошибкой подсвечивается код-нарушитель. Итак, глядя на ваш экран, вы должны дать вам ответ. И в любом случае, вы должны указать в своем вопросе, где происходит ошибка.

2. Он выделяет его в редакторе. fExists — это не команда.

3. Usethe FileSystemObject возвращает True, если указанная папка существует; False, если она не существует. object.FolderExists(folderspec)

4. здравствуйте, прошло много времени с тех пор, как я просматривал код vb / vba. одна вещь, которая МОЖЕТ помочь, — добавить option explicit в верхней части модуля кода. это означает, что любые переменные, которые не определены (и / или функции, которые не существуют), записываются в редакторе

Ответ №1:

Если это весь ваш код, то у вас нет функции, определенной как fExists . Таким образом, в строке произойдет сбой If Not fExists(SubDir) Then , поскольку функция fExists не определена.

Комментарии:

1. Привет, спасибо всем за быстрый ответ. Как указано, функция FExists отсутствовала. Я обновил приведенный выше код, включив в него функцию follwing, и теперь он работает нормально. Еще раз большое спасибо за вашу помощь. С уважением,

2. пользователь378.. — вы должны дать этому ответу оценку плюс отметить его как правильный ответ для будущих посетителей

3. Джим, ты прав. Поэтому в мой исходный код были добавлены следующие строки, чтобы он работал. Как указано, была добавлена функция fExist. Функция fExists(новое имя в виде строки) как логическое значение dim тестер как целое число при возобновлении ошибки Следующий тестер = GetAttr(новое имя) Выберите регистр err.Числовой регистр = 0 fExists = True Регистр Else fExists = False Конечный выбор при ошибке GoTo 0 Конечная функция

4. Нет смысла указывать Error <anything> в качестве последнего оператора в функции. Он сбрасывается на настройку родительской функции в End Sub / Function.

5. Поскольку данный ответ решил ваш первоначальный вопрос, пожалуйста, проголосуйте и отметьте как ответ.