كيف يمكنني الحصول على عنوان النطاق بما في ذلك اسم ورقة العمل، ولكن ليس اسم المصنف، في 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!$A$1"، مع Range الكائن المسمى rng إحالة الخلية A1 في ورقة العمل 1.

يقوم هذا الحل بإرجاع عنوان الخلية الأولى فقط من النطاق، وليس عنوان النطاق بأكمله ("الورقة1!$A$1" مقابل "الورقة1!$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

الوثائق الكاملة لوظيفة ورقة عمل Address() متاحة على موقع Office على الويب: 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

.

لماذا لا تقوم فقط بإرجاع اسم ورقة العمل باستخدامالعنوان = 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

لخلط القديم لي مجموعة

العنوان (خطأ، خطأ، صحيح)

يبدو أنه يعطي في تنسيق TheSheet!B4:K9

إذا لم يكن لماذا المعايير ..تجنب وظائف Str

من المحتمل أن يستغرق الأمر أقل من ميلي ثانية واحدة فقط، وسيستخدم 153 إلكترونًا مستخدمًا بالفعل

حوالي 0.3 ميكرو ثانية

RaAdd=mid(RaAdd,instr(raadd,"]") +1)

أو

"حوالي 1.7 ميكرو ثانية."

RaAdd = انقسام (راد، "]")(1)

[عدل بتاريخ 21-04-2009]

كما أشار ميخا، هذا لا يعمل إلا عندما تقوم بتسمية ذلك
نطاق معين (وبالتالي. اسم أي شخص؟) نعم، عفوًا!

[/يحرر]

أعلم أن الحفلة متأخرة بعض الشيء، ولكن في حالة اكتشاف أي شخص آخر لهذا الأمر في بحث Google (كما فعلت للتو)، يمكنك أيضًا تجربة ما يلي:

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

من المفترض أن يؤدي ذلك إلى إرجاع العنوان الكامل، مثل "=Sheet1!$A$1".

بافتراض أنك لا تريد علامة المساواة، يمكنك إزالتها باستخدام وظيفة الاستبدال:

address = Replace(address, "=", "")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top