Type VBA missmatch

J'ai écrit un code VBA dont j'étais content. Il a parcouru une list sur une feuille de calcul, a changé en une autre et a configuré une variable (et a donc changé certains charts), puis a ouvert le mot, copié dans les charts à divers signets et enregistré le document comme nom de variable.

Cela a fonctionné comme un charme et j'étais un garçon heureux (j'ai sauvé une bonne semaine et un peu de travail pour quelqu'un). Je ne l'ai pas touché car – ou les feuilles de travail pour cette question – l'ont ouvert aujourd'hui et ça me donne une sorte de missmatch sur le premier lot. J'adorerais vraiment certains conseils car il m'a laissé me gratter la tête.

Public X As Integer Public Y As Ssortingng Sub Macro2() 'Set up variables that are required Y = "" LoopCounter = 2 Do Until Y = "STOP" 'Grab the value from a list Sheets("CPD data 13-14").Select Range("A" & LoopCounter).Select Y = Range("A" & LoopCounter).Value 'Change the chart values Sheets("Pretty Display (2)").Select Range("A1").Value = Y 'Open word template Set wordapp = CreateObject("word.Application") wordapp.documents.Open "LOCATION" wordapp.Visible = True wordapp.Activate wordapp.ActiveDocument.Bookmarks("InstitutionName").Range = Y wordapp.ActiveDocument.Bookmarks("Graph1").Range = ActiveSheet.ChartObjects("Chart 3") 'Close document Myssortingng = Replace(Y, " ", "") wordapp.ActiveDocument.SaveAs Filename:="LOCATION" & Myssortingng & ".docx" wordapp.Quit Set wordapp = Nothing 'Increase count and loop LoopCounter = LoopCounter + 1 Loop 

L'erreur frappe la ligne suivante:

  wordapp.ActiveDocument.Bookmarks("Graph1").Range = ActiveSheet.ChartObjects("Chart 3") 

MODIFIER

Comme je l'ai suggéré, j'ai mis à jour mon code pour ne pas utiliser select afin qu'il se lise maintenant:

 Set ws = Sheets("CPD data 13-14") Set pd = Sheets("Pretty Display (2)") 'Set up variables that are required Y = "" LoopCounter = 2 Do Until Y = "STOP" 'Grab the value from a list Y = ws.Range("A" & LoopCounter).Value 'Change the chart values pd.Range("A1").Value = Y 'Open word template Set wordapp = CreateObject("word.Application") wordapp.documents.Open "LOCATION" wordapp.Visible = True wordapp.Activate wordapp.ActiveDocument.Bookmarks("InstitutionName").Range = Y wordapp.ActiveDocument.Bookmarks("Graph1").Range = pd.ChartObjects("Chart 3") 'Close document Myssortingng = Replace(Y, " ", "") wordapp.ActiveDocument.SaveAs Filename:="LOCATION" & Myssortingng & ".docx" wordapp.Quit Set wordapp = Nothing 'Increase count and loop LoopCounter = LoopCounter + 1 Loop 

J'ai toujours la même erreur d'exécution au même point.

essaye ça

 Option Explicit Public X As Integer Public Y As Ssortingng Sub Macro2() Dim wordApp As Object Dim LoopCounter As Integer Dim Myssortingng As Ssortingng Dim ws As Worksheet, pd As Worksheet Set ws = Sheets("CPD data 13-14") Set pd = Sheets("Pretty Display (2)") 'Set up variables that are required Y = "" LoopCounter = 2 ' open one Word session for all the documents to be processed Set wordApp = CreateObject("word.Application") Do Until Y = "STOP" 'Grab the value from a list Y = ws.Range("A" & LoopCounter).Value With pd .Range("A1").Value = Y 'Change the chart values .ChartObjects("Chart 3").Copy ' Copy the chart End With 'act on Word application With wordApp 'open word template .documents.Open "LOCATION" .Visible = True ' paste into bookmarks, "save as" document and close it With .ActiveDocument .Bookmarks("InstitutionName").Range = Y .Bookmarks("Graph1").Range.PasteSpecial Myssortingng = Replace(Y, " ", "") .SaveAs Filename:="LOCATION" & Myssortingng & ".docx" .Close End With End With 'Increase count and loop LoopCounter = LoopCounter + 1 Loop 'Close Word wordApp.Quit Set wordApp = Nothing End Sub 

Je ne pouvais pas avoir un mot "Range" object défini directement sur un object Excel "Chart"

J'ai donc dû copyr le graphique et utiliser la méthode "PasteSpecial" de l'object "Range" de Word

De plus, j'ai travaillé avec une seule session de Word, ce qui aurait entraîné un travail plus rapide

Enfin, j'ai également fait des "comes" pour rendre le code plus lisible / maintenable

tout comme une suggestion: j'utiliserais toujours l'énoncé "Option Explicit". Cela vous obligera à faire un travail supplémentaire pour déclarer explicitement toutes les variables que vous utilisez, mais cela donnera beaucoup plus de contrôle sur votre travail et entraînera less de problèmes de débauchage, ce qui permettra de gagner du time à la fin

Mon conseil consiste à définir l'indicateur Explicit et à essayer de décomstackr le code. Toutes les variables que vous n'avez pas dimensionnées créeront une erreur. C'est un bon moment pour dimensionner la variable et saisir datatables de manière appropriée.

Si cela ne pose pas d'erreur, ce qu'il devrait faire puisque vous avez au less une variable LoopCounter qui n'est pas dimensionnée et pourrait donc causer des erreurs de type de données, essayez de modifier Public X As Integer en Public X As Long afin d'éviter des valeurs au-delà la limite du type de données Integer.

.Activate est parfois nécessaire même en utilisant. .Select expérience. La sélection d'une feuille de calcul devrait en faire la feuille de travail active, mais ce n'est pas toujours le cas.