2017-01-25 4 views
0

У меня есть макрос, который открывает пользовательскую форму, чтобы фиксировать дату начала и окончания. После нажатия кнопки «ОК» в пользовательской форме открывается диалоговое окно файла, чтобы открыть книгу Excel.Не удается закрыть книгу после запуска sub с userform

Сразу после запуска нижнего элемента я не могу закрыть книгу, которая открывается с помощью «X» в правом верхнем углу. Я также не могу сохранить книгу, щелкнув значок сохранения.

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

Кроме того, я заменяю пользовательскую форму двумя полями ввода, чтобы фиксировать каждую из двух дат, я могу закрыть книгу, которая открывается без проблем.

Возможно, есть что-то смешное с кодом пользователя?

Это все, что находится в пользовательской форме.

Private Sub Ok_button_Click() 
call module1.forecast 
unload userform1 
end Sub 

И это основной подпункт.

Sub forecast() 
dim start_SFY as long 
dim end_SFY as long 
dim filesToOpen as object 
dim wb as workbook 

Application.ScreenUpdating= False 

start_SFY = userform1.textbox1.value 
end_SFY = userform1.textbox2.value 

set filesToOpen = application.fileDialog(msoFileDialogOpen) 
filesToOpen.show 
set wb = application.workbooks.open(filesToOpen.selecteditems(1),false) 

Application.ScreenUpdating= True 
End Sub 

Вот к югу показывая UserForm1

Sub run_userform() 
userform1.show 
End Sub 

Кроме того, здесь есть версия Excel:

Excel 2013 64-разрядный (15.04753.1003) Часть Microsoft Office 365 ProPlus

Может кто-то может попытаться воспроизвести проблему, которая у меня есть? Мне интересно, если это проблема, связанная с версией Excel моего работодателя или чем-то еще?

Такие вещи никогда не случались со мной раньше.

Кроме того, я могу закрыть программу с помощью VBA. Это просто при попытке щелкнуть «X», который он не будет закрывать.

Update:

Я был в состоянии получить код, без изменений, чтобы нормально работать дома на Excel 2016. Я собираюсь получить сослуживец, чтобы проверить на их системе сегодня.

Когда я был дома, я не нажимал кнопку, чтобы называть ее на листе. Я вызвал его из редактора VBA. После некоторого тестирования этим утром кажется, что кнопка является проблемой. Если я вызову sub из редактора VBA, я могу закрыть открытую книгу. Однако, если я использую кнопку команды (элемент управления формой, а не ActiveX, поскольку я получаю сообщение об ошибке «Невозможно нарисовать объект» всякий раз, когда я пытаюсь добавить какой-либо объект ActiveX на рабочий лист), открытая книга не будет закрыта.

Я думаю, что я нашел эту проблему

Этого вопрос, кажется, с «кнопкой управления формой команды». ActiveX был отключен в Центре доверия. Когда я включил его и создал командную кнопку, мне удалось закрыть открытую книгу. Затем я снова попробовал кнопку формы команды и не смог закрыть открытую книгу.Я также успешно смог закрыть открытую книгу, когда я запустил sub из вспомогательного списка на вкладке разработчика, и когда я поместил sub в ленту Excel и запустил ее оттуда.

Любая идея относительно того, почему кнопка командной кнопки управления вызовет эту проблему?

+0

показать макрос вызова UserForm1 – user3598756

+0

Кажется для меня был подобный вопрос, на который я ответил не так давно ... позвольте мне проверить мою историю. –

+1

, но ответа не было (хотя было несколько попыток, один из которых может быть вам полезен): http://stackoverflow.com/questions/41244457/unable-to-close-opened-excel-workbook/41287563 # 41287563 –

ответ

0

Корень проблемы заключается в изменении использования нескольких интерфейсов excel в 2013 году. Microsoft решает проблему в Решениях по вопросам SDI раздела page.

Рабочая книга не может быть закрыто нажатием на кнопку Закрыть красный «X», когда что книга программно открыть с помощью модальной формы пользователя. Для работы вокруг этого вопроса, предполагается, что вы добавляете следующий код в процедуру обработки события Layout формы пользователя, а затем откройте пользовательский форму как безрежимные

Private Sub UserForm_Layout() 
    Static fSetModal As Boolean 
    If fSetModal = False Then 
     fSetModal = True 
     Me.Hide 
     Me.Show 1 
    End If 
End Sub 

Другой вариант, чтобы открыть окно рабочей книги, активировать любое другое окно , а затем снова активировать окно рабочей книги. Теперь вам должно быть , чтобы закрыть книгу, используя кнопку «Закрыть».

Так что это два варианта, которые они представляют, и один из них я придумал.

Вариант 1) Вы можете переключить свое диалоговое окно на немодальное, используя свой код, или установив для свойства ShowModel значение false в вашей пользовательской форме.

Вариант 2) Как вы обнаружили, ручное переключение между книгами после открытия через модульную пользовательскую форму ресинхронизирует все. Нехорошее решение для пользователей моего кода, и я не рекомендую полагаться на него.

Вариант 3) Стоит упомянуть, если вы не открываете файл через пользовательскую форму, тогда проблем нет. Так что, если последнее, что нужно пользователю, это открыть файл, вы можете легко сохранить путь к файлу в строке, выгрузите неудобную пользовательскую форму и переместите вызов workbooks.open после закрытия. Вот пример того, что я имею в виду

Public EDIT_FILE_DIRECTORY As String 

Public Sub Main() 

    fileOpenerForm.Show 

    If EDIT_FILE_DIRECTORY <> "" Then 
     Call Workbooks.Open(EDIT_FILE_DIRECTORY) 
    End If 

End Sub 

И в UserForm что-то вдоль этих линий, где имя файла создается на основе параметров UserForm и выбор ListBox:

Private Sub OpenSelectedWorkbooks_Button_Click() 

    Dim workbookName As String 

    workbookName = selectionList.Item(Me.FileSelection_ListBox.ListIndex + 1) 

    EDIT_FILE_DIRECTORY = ROOT_DIR & GetSelectedSubfolder & "\" & workbookName 

    Unload Me 

End Sub 
Смежные вопросы