msoFileDialogFilePicker не отображается

#vba #ms-access

Вопрос:

У меня возникли проблемы с попыткой отобразить средство выбора файлов с помощью свойства FileDialog в MS Access 2016. Я пробовал как раннюю, так и позднюю привязку, но средство выбора файлов никогда не отображается. Никаких ошибок не обнаружено, и сообщения не отображаются. Когда я пытаюсь отладить его построчно, то .показать не запускает форму. Я также пробовал If .show=-1 вместо .show этого, но это тоже не работает. Я попытался удалить ссылку библиотеки на библиотеку объектов Microsoft Office 16.0, и даже при использовании поздней привязки окно по-прежнему не отображается. Есть какие-нибудь идеи относительно того, что происходит не так и как это исправить? Я добавляю как ранние, так и поздние примеры привязки ниже.

 Public Sub FP_EarlyBinding()  Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker)  With fd   .AllowMultiSelect = True  .Show   For Each vrtSelectedItem In .SelectedItems  Debug.Print vrtSelectedItem  Next vrtSelectedItem   End With End Sub   Public Sub FP_LateBinding()  Const msoFileDialogFilePicker As Long = 3 Dim fd As Object  Set fd = Application.FileDialog(msoFileDialogFilePicker)  With fd   .AllowMultiSelect = True  .Show   For Each vrtSelectedItem In .SelectedItems  Debug.Print vrtSelectedItem  Next vrtSelectedItem   End With End Sub  

—————РЕДАКТИРОВАТЬ————————-
Согласно комментариям, мне было дано указание не делать этого в модуле класса. С тех пор я отредактировал код, как показано ниже. Это по-прежнему не позволяет отображать форму.

Это в стандартном модуле:

 Public Function filePicker() As Variant Dim fd As FileDialog Dim sFiles$ Dim vrtSelectedItem As Variant  Set fd = Application.FileDialog(msoFileDialogFilePicker)  With fd  .AllowMultiSelect = True  .Show  For Each vrtSelectedItem In .SelectedItems  sFiles = sFiles amp; vrtSelectedItem amp; ","  Next vrtSelectedItem '-----------loops again to attach other files End With  filePicker = sFiles End Function  

Я вызываю эту процедуру из модуля класса:

 Public Sub Test() Dim vFileList As Variant, vFile As Variant  vFileList = Split(filePicker(), ",") For Each vFile In vFileList  Attachments.Add vFile Next vFile End Sub  

————-ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ———————
Оказывается, проблема здесь заключалась в установке Access…Я зашел в каталог установки и нашел MSACCESS.EXE, щелкнул правой кнопкой мыши и восстановил.

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

1. Протестировал ваш код, и обе процедуры работают.

Ответ №1:

То, что у вас есть, выглядит почти хорошо.

Я рекомендую вам ВСЕГДА, но ВСЕГДА ВСЕГДА ВСЕГДА ставить опцию явно в начале ваших модулей кода.

например, это:

 Option Compare Database Option Explicit  

С учетом вышесказанного ваш код не компилируется. Я имею в виду, что после того, как вы введете свой код, я предполагаю, что вы сделаете в меню кода отладку-gt;компиляцию. Я буду делать это 100 раз в обычный день (после редактирования кода). так что сделайте это привычкой.

Кроме того, чтобы установить значение по умолчанию для НОВЫХ модулей кода (настройка не влияет на существующие), установите этот параметр в редакторе кода VBA: инструменты-gt;Параметры

введите описание изображения здесь

Итак, ваш фрагмент кода выглядит нормально, но, если опция выше явна, вам нужно объявить все переменные (и бонус в том, что компиляция приведет к неправильному написанию или пропущенным именам переменных).

Итак, ваш код, подобный этому, должен работать нормально:

 Public Sub FP_LateBinding()   Const msoFileDialogFilePicker As Long = 3  Dim fd As Object    Set fd = Application.FileDialog(msoFileDialogFilePicker)  With fd    .AllowMultiSelect = True  .Show  Dim vrtSelectedItem As Variant    For Each vrtSelectedItem In .SelectedItems  Debug.Print vrtSelectedItem  Next vrtSelectedItem    End With End Sub  

Теперь также неясно, как вы тестируете/запускаете вышесказанное. Но мы предполагаем, что вы создадите новый модуль кода (НЕ модуль класса).

Затем вы наберете/вставите выше. Сохраните его

выполните отладку-gt;компиляция из меню редактора VBA — нормально ли она компилируется? (и если другие ошибки в других местах — исправьте их в первую очередь).

Теперь, чтобы запустить его, поместите курсор в любом месте внутри этой заглушки кода, нажмите f5.

Или вы можете ввести имя вышеупомянутого подраздела в окне отладки следующим образом:

 FP_LateBinding  

Так что ваш опубликованный код — выглядит действительно красиво! — все хорошо. Попробуйте использовать описанный выше вариант объяснения. И, конечно, теперь в вашем примере добавьте объявление для vrtSelectedItem

Править: ============================================================

Теперь, конечно, если это модуль класса, то, как и код в форме/отчете, вы не можете просто нажать клавишу f5 в модуле кода и не можете ПРОСТО ввести имя суб.

На самом деле, если вы поместите курсор в код и нажмете F5, то получите следующее:

введите описание изображения здесь

Таким образом, дело не в том, что код или файл не отображаются, вы получаете вышеуказанное — большая проблема с различиями.

А если это модуль класса, а не обычный модуль кода?

Затем, чтобы протестировать или использовать код, вы должны записать тестовый код в ОБЫЧНЫЙ модуль кода. Вы не можете использовать редактор debug/VBA для ПРОСТОГО запуска класса.

Это не отличается от создания любого другого объекта.

Итак, если мы создадим новый модуль класса, вставим приведенный выше код, скажем, мы сохраним модуль кода класса как myclassstest ?

Затем вам нужно написать код в другом стандартном модуле кода, таком как этот:

 Sub Test1()    Dim clsTest As New MyClassTest      clsTest.FP_LateBinding        End Sub  

Таким образом, вы не можете запустить код класса (даже код в модуле forms code behind) или любой другой модуль пользовательского класса, вам нужно СНАЧАЛА создать экземпляр.

Теперь это «possbile», который вы использовали VBA, VB5, VB6. И фактически использовал «ранние» версии Access (до access 2000 — 21 год назад).

по умолчанию вы обнаружите, что использовать код модуля класса call можно без предварительного создания экземпляра модуля класса. Эта возможность была и остается для обеспечения совместимости с VBA до 2000 года, в которой модули кода класса не требовали удаления в качестве нового экземпляра. Этот так называемый «базовый» экземпляр класса, таким образом, был possbile.

получается, что если вы импортировали код в течение последних 20 лет из предыдущих версий доступа? Эта настройка флага — и опция ВСЕ ЕЩЕ существует в Access 2019 — более 20 лет спустя!!!!

Я сомневаюсь, что вы/импортировали код из таких старых версий Access, но на самом деле все еще можно настроить модуль класса ТАК, чтобы НЕ требовалось создание экземпляра класса в коде. Однако я не рекомендую этого делать, несмотря на то, что это все еще возможно.

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

1. Я протестировал обе процедуры без явных опций, и они работают просто отлично. Диалоговое окно открывается в обоих случаях. Объявление переменной (или ее отсутствие) не является причиной проблемы, и ответ не решает ее.

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

3. Спасибо, Альберт. Я могу подтвердить, что даже с опцией явной и объявлением vtrSelectedItem окно по-прежнему не отображается.

4. Как уже отмечалось, возможно, вы случайно создали модуль класса, а не обычный модуль кода? Если отладка-компиляция в порядке, а код по-прежнему не работает? Особенно последний пример привязки? Затем выйдите из access и в разделе панель управления, программа и компоненты найдите установку office, щелкните правой кнопкой мыши и выберите восстановить. Также проверьте инструменты-gt;ссылки в редакторе VBA — удалите все «отсутствующие ссылки».

5. Альберт — я пропустил вашу рекомендацию о восстановлении доступа-оказывается, в этом и была проблема. Спасибо, что указали на это!