Bonjour Bruno,
Génial d'appeler la macro en lui passant des arguments ! Je n'y avais pas pensé ... :(
Pour ce qui est de l'erreur, je l'ai provoquée chez moi : elle se produit lorsque la feuille Excel est déjà ouverte par Excel lui-même ou par une autre application.
En fait, 3 situations existent et mes codes sont différents.
- La feuille Excel n'est pas ouverte
- La feuille Excel est déjà ouverte par mon programme
- La feuille Excel est déjà ouverte par Excel lui-même (ou par une autre application, peut-être, à vérifier)
Je te remets ici mes codes correspondant à ces situations (La macro UneMacro ne fait qu'afficher, par une MsgBox, la chaine qui lui est passée, elle n'a bien évidemment rien à voir avec l'erreur que tu as rencontrée).
La feuille Excel n'est pas ouverte
La feuille Excel est déjà ouverte par mon programmeCode:
1
2
3
4
5
6
7
8 Private Sub BExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BExcel.Click XLSAPP = New Excel.Application XLSAPP.Visible = True XLSAPP.Workbooks.Open("D:\Tmp\ProbExcel\Test.xls") 'ouvir le fichier XLS ' ............. XLSAPP.Run("UneMacro", "Coucou") ' appel de la macro en lui passant les arguments .... ' ............. End Sub
La feuille Excel est déjà ouverte par Excel lui-mêmeCode:
1
2
3
4
5
6
7
8
9
10 Private Sub BFeuilleDejaAccedee_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BFeuilleDejaAccedee.Click If Not XLSAPP Is Nothing Then If XLSAPP.ActiveWorkbook.Name = "Test.xls" Then XLSAPP.Visible = True ' ............. XLSAPP.Run("UneMacro", "Coucou") ' appel de la macro en lui passant les arguments .... ' ............. End If End If End Sub
En respectant ces différents cas, il n'y a pas d'erreur.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Private Sub BFeuilleOuverte_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BFeuilleOuverte.Click Dim ExcelInstances As Process() = Process.GetProcessesByName("EXCEL") If ExcelInstances.Count = 0 Then Exit Sub End If XLSAPP = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") If Not XLSAPP Is Nothing Then If XLSAPP.ActiveWorkbook.Name = "Test.xls" Then XLSAPP.Visible = True ' ............. XLSAPP.Run("UneMacro", "Coucou") ' appel de la macro en lui passant les arguments .... ' ............. End If End If End Sub
J'espère que ceci te permettra de passer une bonne soirée ...