1

新手问题:我有模块, 最初由 Roger Govier 制作

它使用输入单元格header并为位于header. 创建的命名范围将被标记为标题单元格的值。

Private Sub CreateNamedRange(header As range)
   Dim wb As Workbook
   Dim WS As Worksheet
   Dim rStartCell As range
   Dim rData As range
   Dim rCol As range
   Dim lCol As Long
   Dim sSheet As String
   Dim Rowno As Long

   ' get table location
   Set rStartCell = header

   Set WS = rStartCell.Worksheet
   Set wb = WS.Parent
   sSheet = "'" & WS.Name & "'"
   With rStartCell
      Rowno = .row
      Set rData = .CurrentRegion
   End With
   Set rData = WS.range(rStartCell, WS.Cells(Rowno, rStartCell.Column))

    Set rCol = rData.Columns
    lCol = rCol.Column
    wb.Names.Add Name:=Replace(rCol.Cells(1).Value, " ", "_"), _
    RefersToR1C1:="=" & sSheet & "!" & rCol.Cells(2).Address(ReferenceStyle:=xlR1C1) & ":INDEX(C"        & lCol & ",LOOKUP(2,1/(C" & lCol & "<>""""),ROW(C" & lCol & ")))"

End Sub

我想修改此代码,以便它不创建命名范围,而是仅返回返回的范围是命名范围的范围。

示例:我们在 中有一个标头,在 中有A1数据A2:A5

现在:如果我们调用CreateNamedRange(.range("A1")),它会为A2:A5.

目标:如果我们调用 CreateNamedRange(.range("A1"))它返回.range("A2:A5")VBA代码中的一个变量:

dim myRange As Range
set myRange = CreateNamedRange(.range("A1"))
4

2 回答 2

2

您应该注意的第一件事是 Subs 不返回任何值,因此myRange = CreateNamedRange(.range("A1"))没有任何意义(对于您的 Sub;对于此答案中的 Function 确实有意义)。

下面的函数返回一个范围,与输入范围在同一列中,从下一行开始,包括下面的所有行,直到找到一个空白单元格。该范围称为“anyName”(因此您可以通过 访问它Range("anyName"))。

Private Function CreateNamedRange(header As Range) As Range

   Dim curRow As Long: curRow = header.Row + 1
   Set tempRange = header.Worksheet.Cells(curRow, header.Column)
   Do While (Not IsEmpty(tempRange))
     curRow = curRow + 1
     Set tempRange = header.Worksheet.Cells(curRow, header.Column)
   Loop

   Set CreateNamedRange = header.Worksheet.Range(header.Worksheet.Cells(header.Row + 1, header.Column), header.Worksheet.Cells(curRow, header.Column))

   CreateNamedRange.Name = "anyName"

End Function
于 2013-07-11T14:23:05.457 回答
1

如果您已经激活了起始单元格,则可以使用

Set myRange = Range(ActiveCell.Address, ActiveCell.Offset.End(xlDown).Address)

为活动单元格下方的所有条目设置范围。如果您没有激活它,您可以使用带有偏移量的 rstartCell 引用

Set myRange = Range(rStartCell.Offset(1), rStartCell.Offset(1).Offset.End(xlDown).Address)

然后你可以在下一行添加命名范围

于 2013-07-11T14:01:01.500 回答