Excel 类型不匹配错误VBA:数组引用工作簿中的命名范围 范围

Excel 类型不匹配错误VBA:数组引用工作簿中的命名范围 范围,excel,vba,type-mismatch,Excel,Vba,Type Mismatch,下面的代码试图将工作簿上的所有表对象、图表对象和范围名称作为数组抓取,然后代码在表上创建一个数据验证列,然后这些数组就可以被引用——因此,稍后我可以使用此表自动生成PowerPoint演示文稿 问题 用于抓取表格和图表的代码非常有效--在为命名范围开发代码部分时,会出现类型不匹配错误(请参阅下面的整个代码块/变量): 'if we have named ranges' If ThisWorkbook.Names.Count > 0 Then 'grab

下面的代码试图将工作簿上的所有表对象、图表对象和范围名称作为数组抓取,然后代码在表上创建一个数据验证列,然后这些数组就可以被引用——因此,稍后我可以使用此表自动生成PowerPoint演示文稿

问题 用于抓取表格和图表的代码非常有效--在为命名范围开发代码部分时,会出现类型不匹配错误(请参阅下面的整个代码块/变量)

 'if we have named ranges'
    If ThisWorkbook.Names.Count > 0 Then
    
        'grab each range
        **For Each ExcRng In ThisWorkbook.Names**  **'PROBLEM OCCURS HERE'**
        
            'update count
            ObjectArrayIndex = ObjectArrayIndex + 1
            ReDim Preserve ObjectArray(ObjectArrayIndex)
            
                'add the named range to array
                ObjectArray(ObjectArrayIndex) = ExcRng.Name & "-" & xlSheet.Name & "-" & TypeName(ExcRng)
代码 注意
我在VBA方面绝对不是很有经验,请在您的回答中尽可能详细地说明此工作簿中每个ExcRng的
。Names
正在该集合中迭代
此工作簿。Names
。因此,
ExcRng
应为
Name
类型


要留在sure站点,每当对[y]中的每个[x]使用
进行迭代时,请将
[x]
声明为
变体。这将确保它工作正常,但它会带走intellisense,而且会有点“重”。

请不要让我们计算出哪些行错误。@Vityata用于此工作簿中的每个ExcRng。名称--我在itTry
Dim ExcRng As Variant
旁边写了,而不是
Dim ExcRng As Range
很酷!尝试在一个单独的问题中重写代码,使用尽可能少的行来复制错误。实际上,不使用20+,只尝试验证和分配
ObjectArray
。代码应该能够编译。祝你好运<代码>连接(ObjectArray,“,”
不会将前导或尾随的
添加到连接的字符串中。您需要添加这些名称是名称对象的集合。(编辑以更正)酷!这让命名范围通过了块,这很好。现在奇怪的是,它在我的代码中导致了一个应用程序定义的/对象定义的错误,我觉得很奇怪…如果微软的错误消息可以更详细的话lol
Sub GetTablesAndChartToExportTable()

    Dim xlBook As Workbook
    Dim xlSheet As Worksheet
    Dim xlTable As ListObject
    Dim xlTableColumn As ListColumn
    Dim xlChartObject As ChartObject
    Dim xlTableObject As ListObject
    
    Dim ObjectArray() As String
    Dim ObjectIndexArray As Integer
    
    Dim ExcRng As Range
    
    'set the book
    Set xlBook = ThisWorkbook
    
    'loop through each worksheet
    For Each xlSheet In xlBook.Worksheets
    
        'if we have charts
        If xlSheet.ChartObjects.Count > 0 Then
        
            'grab each chart name
            For Each xlChartObject In xlSheet.ChartObjects
            
                'update count
                ObjectArrayIndex = ObjectArrayIndex + 1
                ReDim Preserve ObjectArray(ObjectArrayIndex)
                
                    'add the chart object to array
                    ObjectArray(ObjectArrayIndex) = xlChartObject.Name & "-" & xlSheet.Name & "-" & TypeName(xlChartObject)
                
                
            Next
        End If
        
        'if we have tables
        If xlSheet.ListObjects.Count > 0 Then
        
            'grab each table name
            For Each xlTableObject In xlSheet.ListObjects
            
                'update count
                ObjectArrayIndex = ObjectArrayIndex + 1
                ReDim Preserve ObjectArray(ObjectArrayIndex)
                
                    'add the table object to array
                    ObjectArray(ObjectArrayIndex) = xlTableObject.Name & "-" & xlSheet.Name & "-" & TypeName(xlTableObject)
                
                
            
            Next
        End If
        
        'if we have named ranges'
        If ThisWorkbook.Names.Count > 0 Then
        
            'grab each range
            For Each ExcRng In ThisWorkbook.Names
            
                'update count
                ObjectArrayIndex = ObjectArrayIndex + 1
                ReDim Preserve ObjectArray(ObjectArrayIndex)
                
                    'add the named range to array
                    ObjectArray(ObjectArrayIndex) = ExcRng.Name & "-" & xlSheet.Name & "-" & TypeName(ExcRng)
                    
        
        Next
      End If
    Next
    
    'grab sheet
    Set xlSheet = xlBook.Worksheets("Export")
        
        'grab table from sheet
        Set xlTable = xlSheet.ListObjects("ExportToPowerPoint")
        
            'grab object column from table
            Set xlTableColumn = xlTable.ListColumns("Object")
            
                'set the validation dropdown
                With xlTableColumn.DataBodyRange.Validation
                
                    'delete old
                    .Delete
                    
                    'add new data
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(ObjectArray, ",")
                    
                    'make sure it's a dropdown
                    .InCellDropdown = True
                    
                End With
            
    End Sub