2012-06-14 59 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