首页 文章

参考VBA中的动态命名范围

提问于
浏览
3

我在介绍VBA中的动态名称范围时遇到了麻烦 .
我的范围被定义为

=OFFSET(Sheet!$B$2,0,0,COUNTA(Sheet!$B:$B)-1,1)

我的代码应该在一个范围内搜索另一个范围内的所有条目,意图是添加任何缺失的条目 . 到目前为止我有

Sub UpdateSummary()
    Dim Cell As Range
    Dim rngF As Range
    Set rngF = Nothing

    ' Step through each cell in data range
    For Each Cell In Worksheets("Aspect").Range("A_Date")
        ' search Summary range for current cell value
        Set rngF = Worksheets("Summary").Range("Sum_Date").Find(Cell.Value) // Does not work
        If rngF Is Nothing Then
            ' Add date to Summary
        End If
        Set rngF = Nothing
    Next Cell
    End Sub

For循环似乎工作正常 . 但是,使用.Find方法给我一个错误消息 .

Application-defined or object-defined error

如果我用特定范围($ B $ 2:$ B $ 5000)替换命名范围,它确实有效,所以它似乎取决于命名范围的传递方式 .
任何想法,将不胜感激 .

谢谢 .

3 回答

  • -2

    我已经尝试了几天,最终我想出了以下内容 . 它可能不是最有效的,但它确实对我有用!

    The named range of "OhDear" was set up in the normal way
    
    Dim vItem As Variant
    Set vItem = Names("OhDear")
    Debug.Print vItem.Name
    

    值得一试你不觉得!如果不是使用变体,而是使用以下内容:Dim Nm as Name:设置Nm = Names(“OhDear”),这不起作用 . 使用'Nm'的任何变化都失败了!

  • 3

    该错误几乎肯定是因为Excel无法找到引用名为Summary的工作表上的范围的命名范围Sum_Date . 最常见的原因是

    • Sum_Date指的是摘要以外的工作表 . 检查Sum_Date的RefersTo属性,确保没有拼写错误 .

    • 没有命名范围Sum_Date,也就是说,它在VBA代码中拼写错误 . 检查名称管理器中命名范围的拼写 .

    • Sum_Date的RefersTo公式中存在错误 . 听起来你已经证实情况并非如此 .

  • 0

    我有一个类似的,如果不是相同的问题,这是我如何解决它:

    我首先意识到我用来创建命名范围的方法,使用名称管理器,我的命名范围有一个工作簿范围 . 这很重要,因为它不属于工作表,因此不会在那里找到 .

    因此,工作表(“摘要”) . 范围(“Sum_Date”)对我不起作用 .

    由于我的范围属于工作簿,我能找到的方法是使用ActiveWorkbook.Names(“Sum_Date”)

    对我来说,我用它来删除我在许多地方使用的命名范围的公式 . 最大的优点是命名范围只更新一次,而不是为调用范围的每个单元位置调用公式 . 巨大的时间延迟差异!

    Public last_Selection As String
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    'excel data change detection
    
    If Range(last_Selection).Column = 2 Then
        'Disable events, so this only executes once
        Application.EnableEvents = False
    
        'This can be done with a complex formula in a cell, 
        'but this is easily understood
        Range("B1").End(xlDown).Select
        ActiveWorkbook.Names("last_Entry").Value = ActiveCell.Row
    
        'Re-enable so this routine will execute on the next change
        Application.EnableEvents = True
    End If
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        'constantly store the last cell to know which one was previously edited
        last_Selection = Target.Address
    End Sub
    

相关问题