Я не уверен, что это элегантное решение, но это простое решение.
В приведенном ниже коде предполагается, что имена диапазонов находятся в ячейках A1, A2, A3 и т. Д. Sheet2 и чтосписок заканчивается пустой ячейкой.Предполагается также, что в столбцах B, C и т. Д. Ничего не нужно. Вам придется корректировать код для реальной ситуации.
Sub GetNameDetails()
Dim Inx As Integer
Dim NameCrnt As String
Dim Pos As Integer
Dim RangeCrnt As String
Dim RowCrnt As Integer
RowCrnt = 1
With Sheets("Sheet2")
Do While True
' This loop is repeated for every cell in column A until it
' encounters a blank cell
NameCrnt = .Cells(RowCrnt, 1).Value
If NameCrnt = "" Then Exit Do
For Inx = 1 To Names.Count
' This matches the names in Sheet 2 with the named ranges.
' Names that cannot be found in the Names collection are ignored.
If Names(Inx).Name = NameCrnt Then
RangeCrnt = Names(Inx).RefersTo ' Extract full address of range
RangeCrnt = Mid(RangeCrnt, 2) ' Discard =
RangeCrnt = Replace(RangeCrnt, "$", "") ' Remove $s
Pos = InStr(RangeCrnt, "!")
' Save sheet name
.Cells(RowCrnt, 2).Value = Mid(RangeCrnt, 1, Pos - 1)
RangeCrnt = Mid(RangeCrnt, Pos + 1) ' Discard sheet name
.Cells(RowCrnt, 3).Value = RangeCrnt ' Save full address of range
Pos = InStr(RangeCrnt, ":")
If Pos <> 0 Then
RangeCrnt = Mid(RangeCrnt, 1, Pos - 1) ' Discard end of range if any
End If
.Cells(RowCrnt, 4).Value = .Range(RangeCrnt).Row
.Cells(RowCrnt, 5).Value = .Range(RangeCrnt).Column
Exit For
End If
Next
RowCrnt = RowCrnt + 1
Loop
End With
End Sub
В результате получается таблица из пяти столбцов:
Col 1 = Range name (unchanged)
Col 2 = Sheet name
Col 3 = Range
Col 4 = Top row of range
Col 5 = Left column of range
После сортировки по столбцам 4 и 5 таблица будет в указанной вами последовательности.