كيف يمكنني الحصول على عنوان النطاق بما في ذلك اسم ورقة العمل، ولكن ليس اسم المصنف، في Excel VBA؟
سؤال
إذا كان لدي كائن نطاق - على سبيل المثال، لنفترض أنه يشير إلى خلية 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, "=", "")