VBProject.VBComponents(wsTarget.CodeName).Name = 代码每次都失败。为什么?

Phi*_*nks 2 excel vba

我有一个包含大约 20 个 subs 的小应用程序,它运行完美......每隔一段时间。

它在子 ImportData 中失败,这是我第一次向新创建的工作表添加代码名称。在以下行: ThisWorkbook.VBProject.VBComponents(wsTarget.CodeName).Name = "Customers"

下面的代码包含三个可以重新创建问题的子程序。重要说明:我可以连续多次运行子 ImportData 没有任何问题,但如果我连续两次调用子“Sync()”,它会在第二次尝试时失败,但在第三次尝试时工作正常,依此类推(也许它不喜欢奇数..)

关于为什么会发生这种情况的任何想法将不胜感激。

FYT:我在 Excel for Mac 中运行此代码

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```


Run Code Online (Sandbox Code Playgroud)

Mat*_*don 5

您正在运行时修改宿主 VBA 项目 - 的代码名称标识符Sheet1是一个编译时、项目全局范围的对象:即使它没有在任何地方使用,也有可能需要重新编译项目来更改它。

所以代码运行良好,直到它通过重命名全局对象来射击自己的脚;下一次运行现在运行良好,因为现在编译的代码与VBComponent项目中的实际匹配。

考虑在单独的 VBA 项目中使用宏,它会提示启用宏的工作簿重命名组件:因为该 VBA 项目不是编译和运行的 VBA 代码,所以它应该“正常工作”。