بديل ل أكتيفيدوكومنت للإشارة إلى وثيقة جديدة من قالب

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

  •  21-12-2019
  •  | 
  •  

سؤال

أنا باستخدام قالب كلمة مع نموذج المستخدم.يفتح المستخدم القالب لبدء مستند جديد ، ويدخل البيانات في النموذج.ثم يتم إدراج البيانات في الإشارات المرجعية في المستند.أنا باستخدام الفرعية التالية لإدراج البيانات في الإشارات المرجعية.المتغيرات التي تم تمريرها إلى الفرعية هي اسم الإشارة المرجعية لإدراج النص في ، والنص لإدراج.

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 كائن في كلمة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top