Как правильно управлять памятью и случайными ошибками в VBA для Excel? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь развернуть программу в Excel VBA, которая позволяет мне отправлять людям различные типы писем в соответствии с их характеристиками (копирует и вставляет текст из документов Word).

Мой файл работает, но в определенный момент он выдает ошибки, и я вижу, что в долгосрочной перспективе открываются многие приложения Word, поэтому мне приходится закрывать их с помощью диспетчера задач. Я пытался использовать функцию Object.Quit, установить для объекта значение Nothing, но оно не работает.

Я думаю, что случайные ошибки программы имеют root плохое использование памяти моего компьютера. Я понятия не имею, как использовать память в компьютере, потому что мой опыт не имеет ничего общего с программированием, извините, если это глупый вопрос.

Здесь я поставлю свой код:

Sub CustomizedMail()

    Dim wd As Object, editor As Object
    Dim outlookApp As Outlook.Application
    Dim mymail As Outlook.MailItem
    Dim doc As Object
    Dim generalDirectory As String
    Dim document As String
    Dim ActiveRow As Integer
    Dim mailType As String

    Break = Chr(13) + Chr(10)


    'Selects address of letters to Clients
    generalDirectory = "C:\Users\Rodrigo\OneDrive - InBody Co., Ltd\Ventas Rod\Forecast\Ppts informativas x área\Para enviar\"
    'Selects document to be sent according to ppt type value in worksheet
    ActiveRow = ActiveCell.Row
    mailType = ActiveCell.Worksheet.Range("O" & ActiveRow).Value


    'Check mailType
    If mailType = "" Then

         MsgBox "Selecciona un tipo de mail"

         Exit Sub

    End If

    'Opens word document and copies its information
    document = generalDirectory & mailType & ".docx"
    Set wd = CreateObject("Word.Application")
    Set doc = wd.documents.Open(document)
    'wd.Visible = True
    doc.Content.Copy
    doc.Close
    'Set wd = Nothing



    'Opens Outlook and paste

    Set outlookApp = New Outlook.Application 'CreateObject("Outlook.Application") 'New Outlook.Application
    Set mymail = outlookApp.CreateItem(olMailItem)
        With mymail
            On Error GoTo 1
              .To = ActiveCell.Worksheet.Range("N" & ActiveRow)
              If mailType = "Presentación" Then
                  .Subject = "Bioimpedanciómetros profesionales InBody"
              Else
                  .Subject = "Bioimpedanciómetros para " & mailType
              End If
              '.BodyFormat = olFormatRichText
              Set editor = .GetInspector.WordEditor
              editor.Content.Paste
              'editor.Quit
              Set editor = Nothing
              .Display
        End With
        'Append corresponding file
        sourceFile = generalDirectory & "INBODY - " & mailType & ".pdf"
        mymail.Attachments.Add sourceFile

        ActiveCell.Worksheet.Range("T" & ActiveRow).Value = "Yes"
        ActiveCell.Worksheet.Range("V" & ActiveRow).Value = Date
        'MsgBox ThisWorkbook.FullName
        'MsgBox ThisWorkbook.Path
     Exit Sub
1:          MsgBox "Excel se puso pendejo, intenta de nuevo"
End Sub

1 Ответ

0 голосов
/ 25 марта 2020

Вы можете решить многие свои проблемы, повторно используя ваши объекты. Попробуйте что-то вроде этого:

Sub SendALotOfMails()
    Dim wd as Object
    Dim outlookApp as Object

    Set wd = CreateObject("Word.Application")
    Set outlookApp = New Outlook.Application

    ' Reusing word and outlook objects
    CustomizedMail wd, outlookApp
End Sub

Sub CustomizedMail(wd As Object, outlookApp as Object)
    ...
End Sub

Это, очевидно, только часть решения.

...