【问题标题】:Dynamic ranges VBA动态范围 VBA
【发布时间】:2021-10-02 15:46:58
【问题描述】:

我有两个工作簿“源”和“目标”。我想浏览每张目标工作簿并找到所有命名范围。如果范围名称与工作表的名称相同(来自其他工作簿:Source),那么我会将数据从 Source 复制到 Target。

  • 假设在 Source 我有一个 工作表 ("Test1") 而在 Target 我有一个 命名范围 (" Test1") 在随机表中。我想匹配这些并将数据从工作表“Test1”复制到范围“Test1”。

但我不知道如何引用动态范围/数组。我想使用数组,因为它更快。请问有什么想法吗?谢谢是提前。这是我迄今为止尝试过的:

Public Sub test()    
Dim wb1 As Workbook, wb2 As Workbook
    
Set wb1 = Workbooks("Source.xlsx")
Set wb2 = Workbooks("Target.xlsx")

For Each ws2 In wb2.Worksheets
    For Each nm In wb2.Names
        For Each ws1 In wb1.Worksheets
          If ws1.Name = nm.Name Then
          'Here is the problem, I don't know how to define this dynamic array properly:
          'It should be arrTrgt3 = ws2.Range("A1:D5") but I want to use named range, and I don't 
          'know this name yet.
            arrTrgt3 = nm.RefersToRange.Address            
               ws2.Range("A1").Resize(UBound(arrTrgt3), UBound(arrTrgt3, 2)) = arrTrgt3
          End If
        Next
     Next
Next
End Sub

【问题讨论】:

    标签: arrays excel vba dynamic named-ranges


    【解决方案1】:

    在您的代码中,nm 是集合 Workbook.Names 中的 name object

    nm.RefersToRange 是它所连接的 Range 对象。

    nm.RefersToRange.Value 是该范围内所有单元格值的二维数组。

    arrTrgt3 = nm.RefersToRange.Address 更改为arrTrgt3 = nm.RefersToRange.Value,现在arrTrgt3 是一个二维数组,其中包含来自命名范围的单元格值。

    注意:如果命名范围是单个单元格,则 Range.Value 的返回值是单个变量而不是数组。这将导致 Ubound() 函数出错。您可能需要添加 if/else 以避免该错误。

    【讨论】:

    • 实际上,我想将复制的值粘贴到该命名范围中。所以应该是命名范围而不是 Range("A1") (例如可以从 B5 开始)。你知道我该怎么做吗?在此先感谢:)
    • 我不确定我是否理解其中的区别,但请尝试ws2.Range(nm.RefersToRange.Address).Resize(UBound(arrTrgt3), UBound(arrTrgt3, 2)) = arrTrgt3。这会将命名范围的值从其工作表中放入 ws2 工作表中,新工作表中的位置与旧工作表中的位置相同。
    • 我要求这个是因为我在同一张纸上有多个命名范围,它们的位置可能不同。可能对你来说仍然没有多大意义。谢谢你,你帮了我很多!
    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多