2017-05-14 1 views
0

Bon MatinVBA MailMerge à partir d'Excel - Message d'erreur en attente d'une action OLE

Je suis en train de nettoyer une macro qui se comporte erraticly. Il a l'habitude de travailler - une bonne journée. Mais il génère cette erreur: "Microsoft Excel attend une autre application pour terminer une action OLE". J'ai essayé de le nettoyer (ce qui a causé toutes sortes d'autres erreurs, maintenant triées) et je suis de retour à pouvoir le traverser mais il s'arrête de nouveau à l'erreur ci-dessus. Ce que j'ai remarqué qu'il faisait un certificat et ensuite lancer l'erreur mais maintenant l'erreur se produit tout de suite quand il essaie d'ouvrir le modèle. Ceci est la ligne: Set objMMMD = objWord.Documents.Open (REDC & WTempName) objMMMD.Activate

Ma pensée originale était que le code n'a pas fermer Word proprement mais maintenant que l'erreur est si tôt, que ça ne peut pas être ça. Je n'ai pas Word ouvert. - Comme il avait l'habitude d'ouvrir Word avant ma révision, le code devrait aussi être correct.

Je ne peux pas trouver beaucoup sur l'erreur, sauf qu'il semble se produire dans des codes plus complexes en raison de timeout et comment supprimer le message. Ni l'un ni l'autre ne semble être utile ici.

Sous l'intégralité du code. Est-ce que quelqu'un a une idée pourquoi Excel ne peut pas ouvrir Word pour faire le mailmerge?

Public Sub MailMergeCert() 

Dim bCreatedWordInstance As Boolean 
Dim objWord As Word.Application 
Dim objMMMD As Word.Document 

Dim FirstName As String 
Dim LastName As String 
Dim Training As String 
Dim SeminarDate As String 
Dim HoursComp As String 
Dim Location As String 
Dim Objectives As String 
Dim Trainer As String 

Dim cDir As String 
Dim ThisFileName As String 

'Your Sheet names need to be correct in here 
Dim sh1 As Worksheet 
Set sh1 = ActiveWorkbook.Sheets("Ultrasound") 

Dim r As Long 
r = 2 

FirstName = sh1.Cells(r, 1).Value 
LastName = sh1.Cells(r, 2).Value 
Training = sh1.Cells(r, 3).Value 
SeminarDate = Format(sh1.Cells(r, 4).Value, "d mmmm YYYY") 
HoursComp = sh1.Cells(r, 5).Value 
Location = sh1.Cells(r, 6).Value 
Objectives = sh1.Cells(r, 7).Value 
Trainer = sh1.Cells(r, 8).Value 

'Setup filenames 
Const WTempName = "Certificate_Ultrasound_2017.docx" 'Template name 

'Data Source Location 
cDir = ActiveWorkbook.Path + "\" 'Change if required 
ThisFileName = ThisWorkbook.Name 

On Error Resume Next 

'Create Word instance 
bCreatedWordInstance = False 
Set objWord = CreateObject("Word.Application") 

If objWord Is Nothing Then 
    Err.Clear 
    Set objWord = CreateObject("Word.Application") 
    bCreatedWordInstance = True 
    End If 

If objWord Is Nothing Then 
    MsgBox "Could not start Word" 
    Err.Clear 
    On Error GoTo 0 
    Exit Sub 
End If 

' Let Word trap the errors 
On Error GoTo 0 

' Set to True if you want to see the Word Doc flash past during construction 
objWord.Visible = False 

'Open Word Template 
Set objMMMD = objWord.Documents.Open(cDir & WTempName) 
objMMMD.Activate 

'Merge the data 
With objMMMD 
    .MailMerge.OpenDataSource Name:=cDir & ThisFileName, _ 
     sqlstatement:="SELECT * FROM `Ultrasound$`" ' Set this as required 

lastrow = Sheets("Ultrasound").Range("A" & Rows.Count).End(xlUp).Row 


     For r = 2 To lastrow 
     If IsEmpty(Cells(r, 11).Value) = False Then GoTo nextrow 

      With objMMMD.MailMerge 'With ActiveDocument.MailMerge 
      .Destination = wdSendToNewDocument 
      .SuppressBlankLines = True 

      With .DataSource 
       .FirstRecord = r - 1 
       .LastRecord = r - 1 
       .ActiveRecord = r - 1 
      End With 
      .Execute Pause:=False 
      End With 

'Save new file PDF 
Dim UltrasoundCertPath As String 
UltrasoundCertPath = "C:\Users\305015724\Documents\ApplicationsTraining\2016\Ultrasound\" 
Dim YYMM As String 
YYMM = Format(sh1.Cells(r, 16).Value, "YYMM") 
Dim NewFileNamePDF As String 
NewFileNamePDF = YYMM & "_" & sh1.Cells(r, 3).Value & "_" & sh1.Cells(r, 7).Value '& ".pdf" 'Change File Name as req'd" 
objWord.ActiveDocument.ExportAsFixedFormat UltrasoundCertPath & NewFileNamePDF, ExportFormat:=wdExportFormatPDF 

nextrow: 
     Next r 

End With 


' Close the Mail Merge Main Document 
objMMMD.Close savechanges:=wdDoNotSaveChanges 
Set objMMMD = Nothing 
If bCreatedWordInstance Then 
objWord.Quit 
End If 

Set objWord = Nothing 
Cells(r, 11).Value = Date 

0: 
Set objWord = Nothing 

End Sub 
+0

Jetez un oeil dans le Gestionnaire des tâches et de voir combien de copies de Word sont en cours d'exécution. (Vérifiez dans "processus", pas seulement dans "applications".) Chaque fois que vous exécutez le code, vous créez une nouvelle application Word ('Set objWord = CreateObject (" Word.Application ")') et, si cela ne fonctionne pas travaillez, vous essayez à nouveau et définissez un indicateur ('bCreatedWordInstance'). Mais vous ne «quittez» l'application que si l'indicateur est défini, c'est-à-dire uniquement si la première tentative de création de la nouvelle application a échoué mais que la deuxième tentative a fonctionné. – YowE3K

+0

@ YowE3K - Je ferme Word à travers les processus donc aucun n'est ouvert. - Je dois admettre que j'ai copié la plupart du code et que je ne comprends pas vraiment ce que bCreatedWordInstance fait. J'ai aussi du mal avec les 2 bits IF. Il me semble que j'ouvre Word et puis vérifie si Word est ouvert? Mais peut-être que c'est une bonne gestion des erreurs. - Cependant, mon erreur se produit seulement quelques lignes plus tard. J'ai ouvert Word (sinon j'obtiendrais le MsgBox) et j'essaye maintenant d'ouvrir le modèle. Rien ne se passe et Excel attend en vain. - Donc, le Word qui s'arrête ne peut pas encore avoir d'impact? Christine –

+0

Je regarde mon code. Où il ouvre Word, est-ce que "bCreatedWordInstance = False" signifie qu'il vérifie si Word est déjà ouvert? Comment sait-il ce qu'est bCreatedWordInstance? Il est déclaré mais je ne peux pas voir le code (et j'ai vérifié le code original à partir duquel il a été copié) pour le déterminer. –

Répondre

0

Essayez de changer

cDir = ActiveWorkbook.Path + "\" 

Pour

cDir = ActiveWorkbook.Path & "\" 

Est-ce que faire une différence. Essayez aussi d'imprimer le cDir si c'est ce que vous attendez. Essayez la boîte de message cDir pour vérifier le chemin d'accès.

MsgBox(cDir, vbOKOnly, "Testing cDir") 
+0

Aucune différence. Comment imprimer cDir? Merci, Christine –

+0

Utilisez simplement une boîte de message. – noyanc