عرض قيمة خاصية المستندات المخصصة في خلية ورقة عمل Excel 2007
-
13-09-2019 - |
سؤال
لقد قمت بإنشاء برنامج يقوم بإنشاء وملء خاصية مستندات مخصصة في ملف مصنف Excel 2007. ومع ذلك، لم أتمكن من إظهار قيمة هذه الخاصية في خلية ورقة عمل. في Word 2007، يمكنك فقط تحديد "إدراج -> أجزاء سريعة -> الحقل ..." واستخدم حقل DocProperty لإظهار قيمة الحقل المخصص في مستند. ومع ذلك، لم أجد وظيفة مماثلة في Excel 2007.
هل يعرف أي شخص كيفية عرض قيمة خاصية المستندات المخصصة في خلية ورقة عمل Excel؟ أفضل حل مشابه لحل Word 2007 المذكور أعلاه. أنا بدلا من عدم استخدام رمز ماكرو / مخصص لهذا.
المحلول
لسوء الحظ، أعتقد أنك بحاجة إلى استخدام وظيفة محددة للمستخدم. أضف وحدة نمطية VBA جديدة إلى مصنفك وإضافة هذه الوظيفة:
Function DocumentProperty(Property As String)
Application.Volatile
On Error GoTo NoDocumentPropertyDefined
DocumentProperty = ActiveWorkbook.BuiltinDocumentProperties(Property)
Exit Function
NoDocumentPropertyDefined:
DocumentProperty = CVErr(xlErrValue)
End Function
دعوة إلى Application.Volatile
يفرض على الخلية التي سيتم تحديثها في كل إعادة حساب ضمان أنها ستلتقط التغييرات في خصائص المستندات.
نصائح أخرى
سيكون ما يعادل Excel في الصيغة ولا أعتقد أنه من الممكن استخراج خاصية المستند دون رمز. لا توجد وظائف أصلية لاختيار خصائص المستندات. (يمكن أن يكون البديل لتخزين المعلومات في أسماء مصنف / أسماء ورقة العمل، والتي يمكن الوصول إليها عبر الصيغة)
في VBA، عليك إنشاء وظيفة مثل:
Public Function CustomProperty(ByVal prop As String)
CustomProperty = ActiveWorkbook.CustomDocumentProperties(prop)
End Function
ثم اتصل به في صيغة مع =CustomProperties("PropertyName")
.
هناك نقطة خفية أخرى. تبعيات الصيغة تتعلق فقط بالخلايا الأخرى؛ تعتمد هذه الصيغة على خاصية مخصصة. إذا قمت بتحديث خاصية مخصصة صيغة موجودة مسبقا تتضمن CustomProperty
لن يتم تحديثها تلقائيا. يجب إعادة تقييم الخلية يدويا أو المصنف بأكمله مجبر من خلال Recalc. ستكون أفضل فرصة لجعل الوظيفة المتقلبة، مما يعني أن الصيغة ستكون recalc'd على كل تغيير خلية - ولكن هذا لا يزال يعني أنك تحصل على تحديث فقط إذا تم تغيير خلية.
حدد الخلية التي تريد استخراجها إعادة تسمية الخلية إلى بعضها مفيدة. من "B1" إلى "project_number". افتح "خصائص مسبقة" انقر فوق علامة التبويب "مخصص". أدخل اسما للعقار الجديد. انقر فوق "رابط للمحتوى" تحديد اسم الخلية من قائمة سحب "القيمة".
أتمنى أن أغتنم Cerdit لكنني وجدت الإجابة عبر الإنترنت:http://pdmadmin.com/03/03/displaying-custom-property-values-in-excel-using-a-lamed-range/
يمكنك ربط نطاق اسمه إلى خاصية مخصصة، ولكن بعد ذلك تعكس خاصية مخصصة قيمة [الخلية الأولى في نطاق]. انها للقراءة فعالة فقط؛ يمكنك تغيير محتوى الخلية لتحديث الخاصية، ولكن ليس في الاتجاه الآخر.
أعلم أنك تريد تجنب ذلك، ولكن إذا كنت ترغب في استخدام قيمة العقار في صيغة، فسيتعين عليك ذلك إنشاء وظيفة ورقة عمل مخصصة لنفعل ذلك.
لقد واجهت نفس القضايا الأخرى. لذلك سأحاول تغطية شمولية كيف تناولت ذلك.
بادئ ذي بدء، ليس لديك خيار آخر من كتابة الوظيفة التي تهدف إلى الحصول على كل ما تضعه في خاصية مخصصة أو مدمجة وجعل خلية "المشكلة" للإشارة إليها بهذه الطريقة:
=yourPropertyGettingFunctionName(PropertyName)
اسم الملكية يجري سلسلة تشير إلى اسم الممتلكات المخصصة / المدمجة التي تريد عرضها في الخلية.
يمكن كتابة الوظيفة (كما اقترح سابقا) على النحو التالي:
Public Function StdProp(ByVal sPropName As String) As String
Application.Volatile
StdProp = ActiveWorkbook.BuiltinDocumentProperties(sPropName).Value
End Function
للحصول على خاصية مدمجة، أو باسم:
Public Function UsrProp(ByVal sPropName As String) As String
Application.Volatile
On Error GoTo UndefinedProp
UsrProp = ActiveWorkbook.CustomDocumentProperties(sPropName)
GoTo Exit
UndefinedProp:
UsrProp = "n/a"
Exit:
End Function
كما ذكرنا بالفعل، بما في ذلك التطبيق. سوف يسمح بتحديث محتويات خلية شبه تلقائية.
ومع ذلك، فإن هذا يطرح مشكلة من تلقاء نفسه: كلما قمت بفتح ملف Excel الخاص بك، ستحديث جميع الخلايا باستخدام مثل هذه العلاقة، بحلول الوقت الذي تخرج فيه الملف، سيطلب منك Excel إذنك لتحديثه، بغض النظر إذا قمت بإدخال أي تغيير عليه أم لا، لأن Excel نفسها فعلت.
في مجموعة التطوير الخاصة بي، نستخدم Subversion كأنظمة تحكم الإصدار. في حال كنت قد تضغط عن غير قصد على "التحديث" عند الخروج، ستلاحظ SVN ذلك وفي المرة القادمة التي ترغب في ارتكاب تغييراتك، سيتم تضمين ملف Excel في الحزمة.
لذلك قررت استخدام كل شيء في متناول اليد للقيام بكل ما أحتاج إليه وتجنبه، في نفس الوقت، تأثير التحديث الذاتي هذا لم أكن أرغب في ذلك.
وهذا يعني استخدام نطاقات المسماة مع وظيفة الوصول إلى العقارات. بالنظر إلى حقيقة أنني لا أتوقع أن تتوقع الملفات القديمة توفير احتياجاتي الجديدة، فقد كتبت هذه الوظيفة:
Private Function RangeAssign(sRange As String, sValue As String) As Integer
Dim rDest As Range
If RangeCheck(sRange) Then
Set rDest = Range(sRange)
Else
Set rDest = Application.InputBox(sMsg + vbCrLf + vbCrLf + _
"Please, select a cell to get" + vbCrLf + _
"the name " + sRange + " assigned", sCopyRight, Type:=8)
rDest.Name = sRange
End If
rDest.Cells(1, 1).NumberFormat = "@"
rDest.Cells(1, 1).Value = sValue
RangeAssign = True
End Function
يسمح باختيار مناسب من الخلية الوجهة. عند تعيين القيم إلى خاصية (دعونا نقول "المؤلف"، والتي تحدث أن تكون مدمجة واحدة)، أقوم أيضا بتحديث القيمة المخزنة في النطاق المسمى، ويمكنك الكتابة في خلية:
=Author
إذا كنت قد حريص نطاق مجموعة اسمه "المؤلف" وملأ خلية "A1" الخاصة بها بقيمة "المؤلف" المدمج "المؤلف"، والتي أحتاج إلى تحديث لأغراض تتبع الخارجية الخاصة بنا.
كل هذا لم يحدث بين عشية وضحاها. آمل أن يكون الأمر كذلك.
لقد استخدمت هذا لاستخراج خصائص SharePoint (بناء على إجابة مارتن):
Public Function DocumentProperty(Property As String)
Application.Volatile
On Error GoTo NoDocumentPropertyDefined
DocumentProperty = ActiveWorkbook.ContentTypeProperties(Property).Value
Exit Function
NoDocumentPropertyDefined:
DocumentProperty = CVErr(xlErrValue)
End Function