Excel VBA에서 워크 시트 이름이지만 통합 문서 이름을 포함한 범위 주소를 어떻게 얻습니까?

StackOverflow https://stackoverflow.com/questions/131121

  •  02-07-2019
  •  | 
  •  

문제

범위 객체가 있다면 예를 들어 셀을 지칭한다고 가정 해 봅시다. A1 워크 시트에 Book1. 그래서 나는 그 부름을 알고 있습니다 Address() 간단한 로컬 참조를 얻을 수 있습니다. $A$1. 나는 그것이 또한라고 불릴 수 있다는 것을 알고 있습니다 Address(External:=True) 통합 문서 이름 및 워크 시트 이름을 포함한 참조를 얻으려면 : [Book1]Sheet1!$A$1.

내가 원하는 것은 책 이름이 아닌 시트 이름을 포함한 주소를 얻는 것입니다. 나는 정말로 전화하고 싶지 않습니다 Address(External:=True) 문자열 기능으로 통합 문서 이름을 직접 제거하십시오. 내가 얻기 위해 범위에서 할 수있는 전화가 있습니까? Sheet1!$A$1?

도움이 되었습니까?

해결책

내가 생각할 수있는 유일한 방법은 다음과 같이 워크 시트 이름을 셀 참조와 연결하는 것입니다.

Dim cell As Range
Dim cellAddress As String
Set cell = ThisWorkbook.Worksheets(1).Cells(1, 1)
cellAddress = cell.Parent.Name & "!" & cell.Address(External:=False)

편집하다:

마지막 줄을 수정하십시오.

cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False) 

시트 이름에 공백이나 다른 재미있는 캐릭터가 있더라도 작동하기를 원한다면.

다른 팁

Split(cell.address(External:=True), "]")(1)

벤이 옳다. 나는 또한 이것을 할 수있는 방법을 생각할 수 없습니다. Ben이 권장하는 방법 또는 통합 문서 이름을 제거하는 방법을 제안합니다.

Dim cell As Range
Dim address As String
Set cell = Worksheets(1).Cells.Range("A1")
address = cell.address(External:=True)
address = Right(address, Len(address) - InStr(1, address, "]"))

그만큼 Address() 워크 시트 기능은 정확히 수행합니다. 이를 통해 사용할 수 없습니다 Application.WorksheetFunction, 나는 그것을 사용하는 솔루션을 생각해 냈습니다 Evaluate() 방법.

이 솔루션은 Excel이 시트 이름의 공백 및 기타 재미있는 캐릭터를 처리 할 수있게 해주므로 이전 답변보다 좋은 이점입니다.

예시:

Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
    rng.Worksheet.Name & """)")

정확히 "sheet1! $ $ 1"을 반환합니다. Range 이름이 지정된 객체 rng Sheet1 워크 시트에서 A1 셀을 참조하십시오.

이 솔루션은 전체 범위의 주소가 아닌 범위의 첫 번째 셀의 주소 만 반환합니다 ( "Sheet1! $ 1"vs "Sheet1! $ A $ 1 : $ B $ 2"). 그래서 나는 그것을 사용자 정의 함수로 사용합니다.

Public Function AddressEx(rng As Range) As String

    Dim strTmp As String

    strTmp = Evaluate("ADDRESS(" & rng.Row & "," & _
        rng.Column & ",1,1,""" & rng.Worksheet.Name & """)")

    If (rng.Count > 1) Then

        strTmp = strTmp & ":" & rng.Cells(rng.Count) _
            .Address(RowAbsolute:=True, ColumnAbsolute:=True)

    End If

    AddressEx = strTmp

End Function

주소 () 워크 시트 기능의 전체 문서는 사무실 웹 사이트에서 확인할 수 있습니다. https://support.office.com/en-us/article/address-function-d0c26c0d-3991-446b-8de4-ab46431d4f89

나는 다음이 내가 만든 사용자 정의 기능에서 나에게 효과가 있다는 것을 알았습니다. 셀 범위 참조 및 워크 시트 이름을 문자열로 연결 한 다음 평가 명령문에 사용했습니다 (SumProduct에 대한 평가를 사용하고있었습니다).

예를 들어:

Function SumRange(RangeName as range)   

Dim strCellRef, strSheetName, strRngName As String

strCellRef = RangeName.Address                 
strSheetName = RangeName.Worksheet.Name & "!" 
strRngName = strSheetName & strCellRef        

그런 다음 나머지 코드에서 strrngname을 참조하십시오.

여러 영역이있는 범위를 처리하는 코드를 작성해야 할 수도 있습니다.

Public Function GetAddressWithSheetname(Range As Range, Optional blnBuildAddressForNamedRangeValue As Boolean = False) As String

    Const Seperator As String = ","

    Dim WorksheetName As String
    Dim TheAddress As String
    Dim Areas As Areas
    Dim Area As Range

    WorksheetName = "'" & Range.Worksheet.Name & "'"

    For Each Area In Range.Areas
'           ='Sheet 1'!$H$8:$H$15,'Sheet 1'!$C$12:$J$12
        TheAddress = TheAddress & WorksheetName & "!" & Area.Address(External:=False) & Seperator

    Next Area

    GetAddressWithSheetname = Left(TheAddress, Len(TheAddress) - Len(Seperator))

    If blnBuildAddressForNamedRangeValue Then
        GetAddressWithSheetname = "=" & GetAddressWithSheetname
    End If

End Function

.address (,, true) (외부 주소 표시, 전체 주소 표시) :-)

워크 시트 이름을 반환하지 않겠습니까?주소 = cell.worksheet.name그런 다음 이렇게 주소를 다시 연결할 수 있습니다.주소 = cell.worksheet.name & "!" & cell.address

Dim rg As Range
Set rg = Range("A1:E10")
Dim i As Integer
For i = 1 To rg.Rows.Count

    For j = 1 To rg.Columns.Count
    rg.Cells(i, j).Value = rg.Cells(i, j).Address(False, False)

    Next
Next

혼란스러운 나에게는 범위가 있습니다

.address (false, false ,, true)

형식을주는 것 같습니다! b4 : k9

기준이 아닌 경우 .. STR FUNCTONS를 피하십시오.

아마도 1 밀리 초만 걸릴 것입니다.

약 0.3 microsec

Raadd = Mid (Raadd, Instr (Raadd, "]) +1)

또는

'약 1.7 microSec

raadd = split (radd, "]) (1)

2009-04-21 편집

Micah가 지적했듯이 이것은 당신이 그 이름을 지었을 때만 작동합니다.
특별한 범위 (따라서 누구나 이름이 있습니까?) 예, 죄송합니다!

/편집하다

파티에 조금 늦었지만, 다른 사람이 Google 검색에서 이것을 잡는 경우 (방금 한 것처럼) 다음을 시도 할 수도 있습니다.

Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name

이것은 "= sheet1! $ 1"과 같은 전체 주소를 반환해야합니다.

동일한 부호를 원하지 않는다고 가정하면 교체 기능으로 제거 할 수 있습니다.

address = Replace(address, "=", "")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top