2011-06-03 260 views
4

我想在Excel中使用VBA定义命名范围。基本上,我有一个可变的列号。然后循环运行以确定该特定列中的第一个空单元格。 现在我想定义从该特定列的第2行到具有该列中的数据的最后一个单元格(第一个空单元格-1)的命名范围。Excel:命名范围与VBA

例如,指定了第5列,其中包含3个值。如果我是正确的,那么我的范围就是(2,5)(4,5)。 我只是想知道如何使用整数而不是(E2:E4)来指定这个范围。 完全可能吗?

我发现这个代码来定义一个名为范围:

'Change the range of cells (A1:B15) to be the range of cells you want to define 
    Set Rng1 = Sheets("Sheet1").Range("A1:B15") 
    ActiveWorkbook.Names.Add Name:="MyRange", RefersTo:=Rng1 

任何人都可以轻推我到正确的方向只指定使用整数这个范围?

回答

6

当您定位E2:E4的范围时,您需要指定单元格位置。下面的函数可能对您有用,并将它传递给列号5,它会retunn地址,以便5 = E 27 = AA

ColLetter = ColNo2ColRef(colNo) 
Set Rng1 = Sheets("Sheet1").Range(ColLetter & "2:" & ColLetter & "4") 
ActiveWorkbook.Names.Add Name:="MyRange", RefersTo:=Rng1 

Function ColNo2ColRef(ColNo As Long) As String 
    ColNo2ColRef = Split(Cells(1, ColNo).Address, "$")(1) 
End Function 

希望这有助于

编辑:或者:

Set rng = Range(Cells(2, 5), Cells(4, 5)) 'E2:E4 
ActiveWorkbook.Names.Add Name:="MyRange", RefersTo:=Rng 
+0

像魅力一样工作,感谢您的解释:) – Jort 2011-06-05 11:17:11

4

或可替代

Sub test() 
Set rng1 = Cells(2, 2) 'B2 

Set rng2 = rng1.Resize(3, 1) 'B2:B4 
'or 
Set rng2 = Range(rng1, Cells(4, 2)) 'B2:B4 

End Sub 

或直接做,不用循环使用

With Sheet1 
    col = 5 'variable col 
    Set rng1 = .Range(.Cells(2, col), .Cells(.Rows.Count, col).End(xlUp)) 
    End With 

这是一样的

with sheet1 
    Set rng1 = .Range(.Range("E2"), .Range("E" & .Rows.Count).End(xlUp)) 
    end with 

编辑:如果您正在设置命名范围以动态地改变,那么你就不需要VBA。直接在Excel中命名的范围内输入它,并让它自动在E2和任何最后一项之间自动调整(假定没有空白)。 =$E$2:INDEX($E$2:$E$5000,COUNTA($E$2:$E$5000))(如果需要更多行,请扩展5000)