Проблема с несоответствием типов при вызове пути из реестра - PullRequest
0 голосов
/ 08 октября 2019

Я нахожусь в режиме ползучести, но этот действует. Моя существующая пользовательская форма должна выбрать путь к папке для сохранения, если нет, то функция вывода отключена. Обратите внимание, что вся выбранная папка и функции вывода работают на 100%. Проблема с ползучестью состоит в том, что я настроил систему для сохранения папки, которую пользователь последний раз использовал в реестре, и я могу вспомнить ее как строку из реестра, но когда я пытаюсь установить строку пути (строка:Установите WorkFolder) в качестве возвращаемого строкового значения папки в качестве объекта (?), Он вылетает как ошибка, необходимая для объекта 424.

Я искал, как получить данные из реестра и выйти из него, и пока все в порядке,он просто пытается заставить Set WorkFolder принять то, что извлекается из реестра, что вызывает у меня горе. Текстовое поле отключено и обновляется после завершения выбора допустимого диалогового окна файла, чтобы пользователь знал, какой путь используется .... Я хочу заполнить его значением возврата из реестра (что работает), а затем просто установить WorkFolder назначение строки пути, удаляющее «ничто», препятствующее функциональности вывода, так как путь требуется для правильной работы.

При отладке и наведении курсора на sResult у меня есть правильная строка во всплывающей подсказке, мне просто нужно подключить еев Set WorkFolder и затем двигаться дальше. Будет пользовательский «переключатель», который позволит им вспомнить настройку или использовать диалоговое окно для выбора, но сейчас я ломаю часть sResult до того, как появится диалоговое окно, поэтому я знаю, что если оно продолжится, диалоговое окно появитсякаждый раз ...... это та часть, которая работала все время. Я исправлю это позже, установив флажок «вспоминать» или «не вспоминать»… пока я сосредоточен только на том, чтобы заполнить его, как указано выше.

Есть мысли о том, что я делаю неправильно?

Private Sub BtnSelectFolder_Click()

    ' ===== FOLDER SELECTION BY USER (MANDATORY) =====

Dim fd As FileDialog
Dim result As Long, errNum As Long


'-------------------------------
'Trouble section


Dim oWSH As Object
Dim sResult
Dim KeyId, Rootkey

Rootkey = "HKCU"
KeyId = "Software\VB and VBA Program Settings\MyApplication\WorkbookPath\SaveFolder"

If oWSH Is Nothing Then
        Set oWSH = CreateObject("WScript.Shell")
    End If

    sResult = oWSH.RegRead(Rootkey & "\" & KeyId)

    Set WorkFolder = sResult '<<<<<<<<< Why won't this work? Error 424 Object required, but path is pulled from Registry successfully

'Trouble section
'-------------------------------
'All works below


    Set fd = Application.FileDialog(msoFileDialogFolderPicker)

    With fd
        .AllowMultiSelect = False
        .ButtonName = "Select"
        .Title = "Choose Output Folder"
        If InStr(UCase(.InitialFileName), "SYSTEM32") Then
            .InitialFileName = Environ("USERPROFILE") & "\Documents"
        End If
        result = .Show
    End With

    ' Drop if box cancelled
    If result = 0 Then Exit Sub

    ' Made it here; try updating the linked folder, with error handling
    On Error Resume Next
        Set WorkFolder = fs.GetFolder(fd.SelectedItems(1))
    errNum = Err.Number: Err.Clear: On Error GoTo 0

    If errNum <> 0 Then
        MsgBox "Invalid folder selection", _
                vbOKOnly + vbCritical, _
                "Error"
        Exit Sub
    End If

    ' Update display textbox
    TxBxFolder.Value = WorkFolder.Path

    'Save path to registry
    SaveSetting "MyApplication", "WorkbookPath", "SaveFolder", WorkFolder.Path

    ' Update the Export button
    setExportEnabled

    Call CheckExportIsEnabled

End Sub

1 Ответ

1 голос
/ 08 октября 2019

Если WorkFolder объявлено (где-то?) Как String, тогда String не является объектом в VBA - вы не можете Set его.

Set WorkFolder = sResult

Я сомневаюсь WScript.Shell возвращает Object Вы можете Set. Если это String, то вам нужно простое Let задание здесь:

WorkFolder = sResult '<~ implicit: Let WorkFolder = sResult

Другая история здесь:

Set WorkFolder = fs.GetFolder(fd.SelectedItems(1))

Где, если бы у меня былопредположить, что я думаю, что fs - это Scripting.FileSystemObject (где это объявлено и назначено, и почему его не видно, где оно используется?), чей GetFolder метод возвращает , возвращает Scrpiting.Folder ссылка на объект.

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

Одна переменная, одна цель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...