Код VBA выполняется на одном компьютере, но не на другом

#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 @Toddleson

3. Ошибка «ошибка, определяемая приложением или объектом» обычно появляется, когда объект упоминается в коде, но не найден или не существует. Можете ли вы определить, какой объект вызывает ошибку? Это должно быть либо 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