سؤال

أواجه مشكلة مع بعض رموز دمج البريد التي من المفترض أن تنتج رسائل داخل تطبيقنا.أدرك أن هذا الرمز صعب بعض الشيء في الوقت الحالي، ولكننا في مرحلة "الحصول على شيء يعمل" قبل أن نقوم بترتيبه.

الآن الطريقة التي من المفترض أن يعمل بها هذا، والطريقة التي يعمل بها عندما نقوم بذلك يدويًا، هي أن لدينا ملف (متغير fileOut + ".template") وهو قالب للرسالة.نفتح هذا القالب، وندمجه، ثم نحفظه كاسم ملف في المتغير fileOut.

ومع ذلك، ما يفعله هو حفظ نسخة من ملف القالب إلى اسم ملف الإخراج، بدلاً من إخراج الدمج.

لقد بحثت، ويبدو أنني أضرب رأسي بجدار من الطوب.

ملف البيانات هو ملف البيانات الذي يحتوي على بيانات الدمج.

باستخدام نفس الملفات، كل شيء يعمل إذا قمت بذلك يدويًا.

Public Function processFile(ByVal datafile As String, ByVal fileOut As String) As String
    Dim ans As String = String.Empty

    errorLog = "C:\Temp\Template_error.log"

    If (File.Exists(datafile)) Then

        Try

            ' Create an instance of Word  and make it invisible.'

            wrdApp = CreateObject("Word.Application")
            wrdApp.Visible = False

            ' Add a new document.'

            wrdDoc = wrdApp.Documents.Add(fileOut & ".template")
            wrdDoc.Select()

            Dim wrdSelection As Word.Selection
            Dim wrdMailMerge As Word.MailMerge


            wrdDoc.MailMerge.OpenDataSource(datafile)

            wrdSelection = wrdApp.Selection()
            wrdMailMerge = wrdDoc.MailMerge()
            With wrdMailMerge
                .Execute()
            End With

            wrdDoc.SaveAs(fileOut)

            wrdApp.Quit(False)

            ' Release References.'
            wrdSelection = Nothing
            wrdMailMerge = Nothing
            wrdDoc = Nothing
            wrdApp = Nothing


            ans = "Merged OK"

            Call writeToLogFile(errorLog, "This worked, written to  " & fileOut)

        Catch ex As Exception
            ans = "error : exception thrown " & ex.ToString
            Call writeToLogFile(errorLog, ans)
        End Try

    Else
        ans = "error ; unable to open Date File : " & datafile
        If (logErrors) Then
            Call writeToLogFile(errorLog, "The specified source csv file does not exist. Unable " & _
               "to process it. Filename provided: " & datafile)
        End If
    End If

    Return ans

End Function
هل كانت مفيدة؟

المحلول

لقد وجدت الحل.عندما تقوم بدمج مستند، فإنه يقوم بإنشاء مستند جديد يتضمن نتائج الدمج.يوضح جزء التعليمات البرمجية أدناه.

wrdDoc = wrdApp.Documents.Add(TemplateFileName)
wrdDoc.Select()
Dim wrdSelection As Word.Selection
Dim wrdMailMerge As Word.MailMerge


wrdDoc.MailMerge.OpenDataSource(DataFileName)

wrdSelection = wrdApp.Selection()
wrdMailMerge = wrdDoc.MailMerge()
With wrdMailMerge
    .Execute()
End With

' This is the wrong thing to do. It just re-saves the template file you opened. '
'wrdDoc.SaveAs(OutputFileName) '

' The resulting merged document is actually stored '
' in the MailMerge object, so you have to save that '
wrdMailMerge.Application.ActiveDocument.SaveAs(OutputFileName)

wrdApp.Quit(False)

نصائح أخرى

أعتقد أن المشكلة تكمن في هذا السطر:

wrdDoc.MailMerge.OpenDataSource(templateName)

لذا اسم القالب يشبه "C:\My Template.doc"، أليس كذلك؟

يبدو أنك تقوم بتوفير مسار الملف لمستند Word نفسه بدلاً من مصدر البيانات (ملف Excel أو CSV، أو Access Table، وما إلى ذلك) المرتبط بالمستند ".template".

يحاول:

data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)

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

هذا ما فعلته في المرة الأخيرة ولم أتمكن من اكتشافه أثناء كتابة وحدات الماكرو الخاصة بي :)

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