【问题标题】:VBA Excel: modify dynamic named range codeVBA Excel:修改动态命名范围代码
【发布时间】:2023-04-08 21:31:02
【问题描述】:

新手问题:我有模块,originally made by 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"))

【问题讨论】:

  • 返回到哪里? ...在单元格中,在对话框中,...?
  • 到vba代码中的一个变量,我会在描述中添加一个说明。

标签: excel vba


【解决方案1】:

您应该注意的第一件事是 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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-05
      • 2017-10-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多