2012-06-14 56 views
7

我已经叫了一个名为范围的“X”,这是1000行,我想这个动态减少100如何使用VBA重新定义命名范围?

我试图Range("X").Resize(100,1).Resize(-900,0)但也似乎改变命名范围的大小,当我在检查通过从范围下拉菜单中选择范围来优化。我究竟做错了什么?

+3

适合我。 'range(“a1:a1000”)。resize(100,1).address' returns'$ A $ 1:$ A $ 100' –

回答

18

假设您有一个名为“myRange”的命名范围。如果你这样做:

Dim r As Range 
Set r = Range("myRange") 
Debug.Print r.Resize(10, 1).Address 

你在说什么是︰我有这个范围r。将其设置为匹配myRange作为其初始状态。然后将r调整为别的东西。你所做的是你已经调整了r,而不是myRange

要调整命名范围,你需要做的是这样的:

Dim wb As Workbook 
Dim nr As Name 

Set wb = ActiveWorkbook 
Set nr = wb.Names.Item("myRange") 

' give an absolute reference: 
nr.RefersTo = "=Sheet1!$C$1:$C$9" 

' or, resize relative to old reference: 
With nr 
    .RefersTo = .RefersToRange.Resize(100, 1) 
End With 
1

谢谢您的贡献。基于你的帮助,我可以把这段代码放在一起来调整一个范围的大小,并将数组中的n行记录到它。

Sub PostArrayLinesToRange(ByVal rngName As String, ByRef arr As Variant, ByVal r As Long) 
    Dim wb As Workbook 
    Dim rng As Range 
    Dim nr As Name   'Variable to change named range size definition 

    Set wb = ThisWorkbook 
    Set rng = Range(rngName) 

    rng.Clear 
    Set nr = wb.Names.item(rngName) 
    With nr 
     .RefersTo = .RefersToRange.Resize(r, UBound(arr, 2)) 
    End With 
    Set rng = Range(rngName) 
    rng = arr 
    Erase arr 
    Set nr = Nothing 
    Set rng = Nothing 
    Set wb = Nothing 
End Sub