VBProject.VBComponents (wsTarget.CodeName) .Name = ошибка кода КАЖДЫЙ ДРУГОЙ раз. Почему? - PullRequest
2 голосов
/ 16 марта 2020

У меня есть маленькое приложение, содержащее около 20 подпрограмм, которое работает отлично ... Каждый раз.

В подпрограмме ImportData происходит сбой, когда я впервые добавляю кодовое имя во вновь созданный лист. в следующей строке: ThisWorkbook.VBProject.VBComponents(wsTarget.CodeName).Name = "Customers"

Код ниже содержит три подпрограммы, которые могут воссоздать проблему. Важное примечание: я могу запускать подпрограмму ImportData столько раз подряд без каких-либо проблем, но если я вызову подпрограмму «Syn c ()» два раза подряд, она потерпит неудачу со второй попытки, но с третьей попытки будет работать нормально и так далее (может быть, ему не нравятся нечетные числа ..)

Любые идеи относительно того, почему это происходит, будут высоко оценены.

FYT: я запускаю этот код в Excel для Ма c

Public LastRow As Long
Private wks As Worksheet

Sub Sync()
     Call ImportData
     Call SyncBoth
End Sub

Public Sub ImportData()
'++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+++++ 1. ImportData will allow user to select file to import data from
'+++++ 2. Copy both the Customers and Vendors data to their respective sheets
'++++++++++++++++++++++++++++++++++++++++++++++++++++++
     Dim wsSource As Worksheet
     Dim wsTarget As Worksheet
     Dim LastRow As Long
     Dim MaxDate As Date
     Dim ShCount As Integer
     Dim SourceFile As String
          SourceFile = "/Users/phild/Documents/RTPro/Customer and Vendor Raw Sync.xlsm"
     Dim SourceWb As Workbook
          Set SourceWb = Workbooks.Open(SourceFile)
     Dim TargetWb As Workbook
          Set TargetWb = ThisWorkbook
     Dim sheet As Worksheet

     For ShCount = 1 To 2
          Select Case ShCount
          Case 1
               Set wsSource = SourceWb.Worksheets("Sheet1")                 'Set Worksheet to copy data from
               ThisWorkbook.Sheets("Customers").Delete                           'Delete old Customer worksheet in this worksheet

               Set sheet = ThisWorkbook.Sheets.Add                                'Create New Customer woeksheet in this woekbook
               sheet.Name = "Customers"                                              'Name new Customer worksheet
               Set wsTarget = ThisWorkbook.Worksheets("Customers")         'Set Customers ws as the target ws
               Debug.Assert ThisWorkbook.VBProject.Name <> vbNullString              '<--Force the VBE to exist. Don't pollute the Immediate window
               ThisWorkbook.VBProject.VBComponents(wsTarget.CodeName).Name = "Customers"       'Give Customers a Code name
                              'THE LINE OF CODE ABOVE RESULTS IN A Runtime error '32813"
                              ' Method 'Name' of object '+VBComponent' failed
                              ' EVERY OTHER TIME I RUN THE SUB Sync()

        Case 2
               Set wsSource = SourceWb.Worksheets("Sheet3")                'Set Worksheet to copy data from
               ThisWorkbook.Sheets("Vendors").Delete                            'Delete old Vendors worksheet in this worksheet

               Set sheet = ThisWorkbook.Sheets.Add                               'Create New Vendor worksheet in this woekbook
               sheet.Name = "Vendors"                                                'Name new Vendor worksheet
               Set wsTarget = ThisWorkbook.Worksheets("Vendors")           'Set Customers ws as the target ws
               Debug.Assert ThisWorkbook.VBProject.Name <> vbNullString          '<--Force the VBE to exist. Don't pollute the Immediate window  '
               ThisWorkbook.VBProject.VBComponents(wsTarget.CodeName).Name = "Vendors"     'Give Vendors a Code name
        End Select

        Call CleanTarget(wsTarget)

          LastRow = Find_LastRow(wsSource)
          wsSource.Range("A1:Z" & LastRow).Copy Destination:=wsTarget.Range("A1")

          Next ShCount

     SourceWb.Close
End Sub

Sub SyncBoth()
     Dim ShCount As Integer

     For ShCount = 1 To 2
          Select Case ShCount
               Case 1
                    Set wks = Customers                 'Work in sheet("Customers")
                    LastRow = Find_LastRow(wks)      'Last row of "Customers"

               Case 2
                    Set wks = Vendors                     'Work in sheet("Vendors")
                    LastRow = Find_LastRow(wks)       'Last row of "Vendors"
          End Select

          Debug.Print wks.Name

     Next ShCount

     'Normally I have about 10 subs here that are called sequentially. But this is enough the cause the errorw

End Sub```


1 Ответ

5 голосов
/ 16 марта 2020

Вы модифицируете проект VBA хоста во время выполнения - идентификатор кодового имени для Sheet1 является глобальным объектом области проекта во время компиляции: даже если он нигде не используется, есть законный шанс изменить его требует перекомпиляции проекта.

Таким образом, код работает нормально до тех пор, пока он не отстрелит себя, переименовав глобальный объект; следующий запуск теперь работает нормально, потому что теперь скомпилированный код соответствует фактическому VBComponent в проекте.

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

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