بديل ل أكتيفيدوكومنت للإشارة إلى وثيقة جديدة من قالب
سؤال
أنا باستخدام قالب كلمة مع نموذج المستخدم.يفتح المستخدم القالب لبدء مستند جديد ، ويدخل البيانات في النموذج.ثم يتم إدراج البيانات في الإشارات المرجعية في المستند.أنا باستخدام الفرعية التالية لإدراج البيانات في الإشارات المرجعية.المتغيرات التي تم تمريرها إلى الفرعية هي اسم الإشارة المرجعية لإدراج النص في ، والنص لإدراج.
Public Sub UpdateBookmark(BookmarkToUpdate As String, ByVal TextToUse As String)
Dim BMRange As Range
Set BMRange = ActiveDocument.Bookmarks(BookmarkToUpdate).Range
BMRange.Text = TextToUse
ActiveDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub
هذا يعمل بشكل جيد إلا أنه في بعض الحالات يقوم المستخدمون بالجدولة إلى مستندات ورد أخرى قبل إكمال النموذج.عند القيام بذلك ، يتم ترك التركيز على المستند الآخر الذي استخدموه ، وبالتالي فإن مرجعي إلى أكتيفيدوكومنت يعني أن البرنامج النصي يبحث عن الإشارات المرجعية في المستند الآخر بدلا من مستند القالب الجديد.
هل هناك بديل لاستخدام أكتيفيدوكومنت للبحث عن الإشارات المرجعية في المستند الجديد الذي تم إنشاؤه من القالب?أو بدلا من ذلك هل هناك طريقة لإخبار البرنامج النصي الخاص بي بتغيير التركيز (تنشيط) المستند الجديد الذي يتم تنفيذه منه?
شكرا جزيلا على أي اقتراحات - لقد قضيت وقتا طويلا غوغلينغ وتجريب ولكن لا يمكن العثور تماما على الحل الذي يعمل لهذه المشكلة محددة (أو ربما أنا فقط لا أفهم ما يكفي عن نموذج كائن كلمة لمعرفة ذلك على بلدي).
المحلول
هناك عدة طرق يمكنك من خلالها التعامل معها ، وأبسطها هو تحديد نطاق متغير عالمي / عام وتعيينه في وقت مبكر من العملية (على سبيل المثال ، مباشرة قبل فتح نموذج المستخدم ، أو أثناء _Initialize
أو _Activate
إجراءات الحدث).
Set myDocument = ActiveDocument
'Or alternatively,
' = Documents.Add(...) etc.
ملاحظة أن المتغير العام Public myDocument as Document
يجب كن في وحدة كود عادية وليس وحدة فئة أو نموذج مستخدم.
ثم في إجراءات النموذج الخاص بك ، استبدال سيملي ActiveDocument
مع المتغير:
Public Sub UpdateBookmark(BookmarkToUpdate As String, ByVal TextToUse As String)
Dim BMRange As Range
Set BMRange = myDocument.Bookmarks(BookmarkToUpdate).Range
BMRange.Text = TextToUse
myDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub
بدلا من ذلك يمكنك نطاق متغير أكثر ضيقا ولكن بعد ذلك سوف تحتاج إلى تمريرها إلى الإجراءات حيث هناك حاجة إليها ، مثل:
Call UpdateBookmark(myDocument, BookmarkToUpdate, TextToUse)
وتعديل الإجراء:
Public Sub UpdateBookmark(myDocument as Document, BookmarkToUpdate As String, ByVal TextToUse As String)
Dim BMRange As Range
Set BMRange = myDocument.Bookmarks(BookmarkToUpdate).Range
BMRange.Text = TextToUse
myDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub
قراءة متعمقة:
على الرغم من أن هذا يستخدم أمثلة من إكسيل ، تنطبق نفس المبادئ العامة لتجنب الاعتماد على اختيار و تفعيل الأشياء ، عندما يمكنك الرجوع إليها بشكل أكثر كفاءة مباشرة.
كيفية تجنب استخدام حدد في وحدات الماكرو إكسيل فبا
(الكلمة ليست مجال خبرتي ومن تجربتي المحدودة ، من الصعب تجنب استخدام Selection
كائن في كلمة)