우아한 해결책인지 확실하지 않지만 간단한 해결책입니다. 아래
코드 범위 이름 셀에 있다고 가정 A1, A2, A3 등의 시트 2와리스트가 빈 셀에 의해 종료된다. 또한 B, C 등의 열에는 아무 것도 없다고 가정합니다. 실제 상황에 맞게 코드를 조정해야합니다.
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에 의해 정렬 한 후, 테이블은 당신이 찾는 순서에있을 것입니다 :
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
결과는 다섯 열 테이블입니다.
FWIW을 대신'의은 VarType (.Cells (RowCrnt는, 1) .Value) <> vbEmpty''가 더 안전 할 수도 있지만'True'' 있지만,''하는가. –
좋은 지적. 필자는 작성자가 실행할 코드의 안전성에 대해 걱정하지 않는 경향이 있습니다. 아마도 나는 항상 안전을 고려하기 시작했을 때입니다. –
관심이 없으면 Crnt는 무엇을 의미합니까? – Reafidy