#excel #vba
Вопрос:
Я написал некоторый код для запуска при открытии книги, и он безупречно работает на моем персональном компьютере. Однако после отправки файла на мой ноутбук я получаю сообщение «ошибка, определяемая приложением или объектом». Я искренне не понимаю, почему это произошло и как я могу это решить.
Private Sub Workbook_Open() 'loads the combobox when book opened MenuGenerator.miscComboBox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuMiscellaneous").RefersToRange) MenuGenerator.soupCombobox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuSoups").RefersToRange) MenuGenerator.saladComboBox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuSalads").RefersToRange) MenuGenerator.meatComboBox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuMeat").RefersToRange) MenuGenerator.fishComboBox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuFish").RefersToRange) MenuGenerator.starchComboBox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuStarch").RefersToRange) MenuGenerator.veggieComboBox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuVegetable").RefersToRange) MenuGenerator.dessertComboBox.List = Application.WorksheetFunction.Transpose(ThisWorkbook.Names("MenuDessert").RefersToRange) End Sub
Код настроен на загрузку именованных диапазонов, которые я создал, в комбинации.
Комментарии:
1. Когда файл был отправлен, включал ли он форму модуля/
MenuGenerator
пользователя ?2. Извините за неясность. MenuGenerator-это имя листа, которое было включено при отправке файла. Я также дважды проверил, были ли все еще определены именованные диапазоны, каковыми они и были. Затем я попытался переписать его как
Worksheets("MenuGenerator").etc
@Toddleson3. Ошибка «ошибка, определяемая приложением или объектом» обычно появляется, когда объект упоминается в коде, но не найден или не существует. Можете ли вы определить, какой объект вызывает ошибку? Это должно быть либо
MenuGenerator
одно из полей со списком , либо одно из имен. Простым тестом было бы сделать что-то вродеDebug.Print (myObject Is Nothing)
4. Вот в чем странность. Кажется, что все они существуют. и Область Именованных диапазонов устанавливается для всей книги. Может быть, я найду способ переписать его таким образом, чтобы он работал @Toddleson
5. попробуйте скопировать код в блокнот, удалить код, закрыть и сохранить книгу (без кода [.xlsx]), снова открыть книгу и вставить код обратно и сохранить повторно (.xlsm). У меня уже были поврежденные модули кода, и экспорт и импорт их обратно не помогают. вы должны полностью воссоздать (или скопировать обратно из блокнота)
Ответ №1:
Добавьте в код окно диагностического сообщения.
Option Explicit Sub Workbook_Open() Dim wb As Workbook, ws As Worksheet, i As Integer Dim fn, arObj, arMenu, rng As Range, obj Dim msg As String Set fn = Application.WorksheetFunction Set wb = ThisWorkbook Set ws = wb.Sheets("MenuGenerator") arObj = Array("misc", "soup", "salad", "meat", "fish", "starch", "veggie", "dessert") arMenu = Array("Miscellaneous", "Soups", "Salads", "Meat", _ "Fish", "Starch", "Vegetable", "Dessert") On Error Resume Next For i = 0 To UBound(arObj) Set rng = Nothing Set obj = Nothing msg = "" Set rng = wb.Names("Menu" amp; arMenu(i)).RefersToRange If rng Is Nothing Then msg = msg amp; vbLf amp; "Error with name range 'Menu" amp; arMenu(i) amp; "'" End If Set obj = ws.OLEObjects(arObj(i) amp; "ComboBox") If obj Is Nothing Then msg = msg amp; vbLf amp; "Error with '" amp; arObj(i) amp; "ComboBox" amp; "'" End If If msg = "" Then obj.Object.List = fn.Transpose(rng) Else MsgBox msg, vbExclamation End If Next On Error GoTo 0 End Sub