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

目標: 呼び出す と、VBA コードの変数にCreateNamedRange(.range("A1"))戻ります。.range("A2:A5")

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

2 に答える 2

2

最初に注意すべきことは、Subs は値を返さmyRange = CreateNamedRange(.range("A1"))ないため、意味をなさないことです (Sub では意味があります。この回答の関数では意味があります)。

以下の関数は、入力範囲と同じ列で、次の行から始まり、空白のセルが見つかるまで下のすべての行を含む範囲を返します。この範囲は「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 に答える