Bonjour,
Je souhaite à partir de Word accéder à un classeur Excel chargé en mémoire.
Je n'ai pas de problème s'il existe une seule instance d'Excel, la séquence
suivante fonctionne bien :
set Xl=GetObject(,Excel.Application)
set Wk = Xl.Workbooks("MonClasseur.xls")
Mais en présence de plusieurs instances d'Excel, ça se corse.
Comment procéder en présence de plusieurs instances d'Excel ?
A défaut peut-on imposer une seule instance d'Excel ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Youky
Voici un exemple on gère les erreurs au fur et à mesure pour n'ouvrir qu'une seul instance d' XLS idem pour le fichier (si deja ouvert) Les fichiers doivent être dans le même répertoire Youky
Sub myxls() Dim Appxls As Object Dim fichier As String suivant="nomdufichier.xls" 'à modifier selon On Error Resume Next Set Appxls = GetObject(, "Excel.Application") If Err <> 0 Then _ Set Appxls = CreateObject("Excel.Application") Appxls.Visible = True On Error GoTo 0 fichier = ThisWorkbook.Path & "" & suivant On Error Resume Next AppWrd.Windows(suivant).Activate If Err <> 0 Then AppWrd.Workbooks.Open (fichier) On Error GoTo 0 AppActivate AppWrd With AppWrd .WindowState = xlMaximized End With Set AppWrd = Nothing End Sub "GérardJean" a écrit dans le message de news:
Bonjour, Je souhaite à partir de Word accéder à un classeur Excel chargé en mémoire. Je n'ai pas de problème s'il existe une seule instance d'Excel, la séquence suivante fonctionne bien : set Xl=GetObject(,Excel.Application) set Wk = Xl.Workbooks("MonClasseur.xls") Mais en présence de plusieurs instances d'Excel, ça se corse.
Comment procéder en présence de plusieurs instances d'Excel ? A défaut peut-on imposer une seule instance d'Excel ?
Merci pour vos réponses
Voici un exemple
on gère les erreurs au fur et à mesure
pour n'ouvrir qu'une seul instance d' XLS
idem pour le fichier (si deja ouvert)
Les fichiers doivent être dans le même répertoire
Youky
Sub myxls()
Dim Appxls As Object
Dim fichier As String
suivant="nomdufichier.xls" 'à modifier selon
On Error Resume Next
Set Appxls = GetObject(, "Excel.Application")
If Err <> 0 Then _
Set Appxls = CreateObject("Excel.Application")
Appxls.Visible = True
On Error GoTo 0
fichier = ThisWorkbook.Path & "" & suivant
On Error Resume Next
AppWrd.Windows(suivant).Activate
If Err <> 0 Then AppWrd.Workbooks.Open (fichier)
On Error GoTo 0
AppActivate AppWrd
With AppWrd
.WindowState = xlMaximized
End With
Set AppWrd = Nothing
End Sub
"GérardJean" <GrardJean@discussions.microsoft.com> a écrit dans le message
de news: B97049ED-9AAC-4A8F-8E26-65BF6410D0CE@microsoft.com...
Bonjour,
Je souhaite à partir de Word accéder à un classeur Excel chargé en
mémoire.
Je n'ai pas de problème s'il existe une seule instance d'Excel, la
séquence
suivante fonctionne bien :
set Xl=GetObject(,Excel.Application)
set Wk = Xl.Workbooks("MonClasseur.xls")
Mais en présence de plusieurs instances d'Excel, ça se corse.
Comment procéder en présence de plusieurs instances d'Excel ?
A défaut peut-on imposer une seule instance d'Excel ?
Voici un exemple on gère les erreurs au fur et à mesure pour n'ouvrir qu'une seul instance d' XLS idem pour le fichier (si deja ouvert) Les fichiers doivent être dans le même répertoire Youky
Sub myxls() Dim Appxls As Object Dim fichier As String suivant="nomdufichier.xls" 'à modifier selon On Error Resume Next Set Appxls = GetObject(, "Excel.Application") If Err <> 0 Then _ Set Appxls = CreateObject("Excel.Application") Appxls.Visible = True On Error GoTo 0 fichier = ThisWorkbook.Path & "" & suivant On Error Resume Next AppWrd.Windows(suivant).Activate If Err <> 0 Then AppWrd.Workbooks.Open (fichier) On Error GoTo 0 AppActivate AppWrd With AppWrd .WindowState = xlMaximized End With Set AppWrd = Nothing End Sub "GérardJean" a écrit dans le message de news:
Bonjour, Je souhaite à partir de Word accéder à un classeur Excel chargé en mémoire. Je n'ai pas de problème s'il existe une seule instance d'Excel, la séquence suivante fonctionne bien : set Xl=GetObject(,Excel.Application) set Wk = Xl.Workbooks("MonClasseur.xls") Mais en présence de plusieurs instances d'Excel, ça se corse.
Comment procéder en présence de plusieurs instances d'Excel ? A défaut peut-on imposer une seule instance d'Excel ?
Merci pour vos réponses
PMO
Bonjour,
Comment procéder en présence de plusieurs instances d'Excel ?
Voici un code qui vous indiquera le nombre d'instances d'Excel. Vous pourrez, le cas échéant, avertir l'utilisateur par MsgBox et lui indiquer ce qu'il doit faire.
Copiez le code ci-dessous dans un module WORD. Ouvrez une ou plusieurs instances d'Excel et faites tourner la macro "NbInstanceXL".
'************************* Public Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) Public Declare Function EnumWindows& Lib "user32" _ (ByVal lpEnumFunc As Long, ByVal lParam As Long)
Public NomsChaine$ '_______________________________________ Public Sub NbInstanceXL() Dim TblHwnd As Variant Dim TblFenetre As Variant Dim reponse& Dim i& Dim cpt% NomsChaine$ = "" reponse& = EnumWindows(AddressOf EnumWindowsProc, 0) TblFenetre = Split(NomsChaine$, vbCrLf) For i& = 1 To UBound(TblFenetre) If Left(TblFenetre(i&), 17) = "Microsoft Excel -" Then cpt% = cpt% + 1 Next i MsgBox "Il y a " & cpt% & " instance(s) d'Excel" End Sub '_______________________________________ '///Fonction de callback /// Public Function EnumWindowsProc&(ByVal Handle As Long, ByVal Param As Long) Dim Ch$ Dim Tempo& Dim reponse& Ch$ = Space(1024) Tempo& = Len(Ch$) reponse& = GetWindowText(Handle, Ch$, Tempo&) Ch$ = Trim(Replace(Ch$, Chr$(0), "")) If Ch$ <> "" Then NomsChaine$ = NomsChaine$ & Ch$ & vbCrLf EnumWindowsProc = 1 End Function '*************************
Cordialement.
PMO Patrick Morange
Bonjour,
Comment procéder en présence de plusieurs instances d'Excel ?
Voici un code qui vous indiquera le nombre d'instances d'Excel.
Vous pourrez, le cas échéant, avertir l'utilisateur par MsgBox et
lui indiquer ce qu'il doit faire.
Copiez le code ci-dessous dans un module WORD.
Ouvrez une ou plusieurs instances d'Excel et faites tourner la
macro "NbInstanceXL".
'*************************
Public Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long)
Public Declare Function EnumWindows& Lib "user32" _
(ByVal lpEnumFunc As Long, ByVal lParam As Long)
Public NomsChaine$
'_______________________________________
Public Sub NbInstanceXL()
Dim TblHwnd As Variant
Dim TblFenetre As Variant
Dim reponse&
Dim i&
Dim cpt%
NomsChaine$ = ""
reponse& = EnumWindows(AddressOf EnumWindowsProc, 0)
TblFenetre = Split(NomsChaine$, vbCrLf)
For i& = 1 To UBound(TblFenetre)
If Left(TblFenetre(i&), 17) = "Microsoft Excel -" Then cpt% = cpt% + 1
Next i
MsgBox "Il y a " & cpt% & " instance(s) d'Excel"
End Sub
'_______________________________________
'///Fonction de callback ///
Public Function EnumWindowsProc&(ByVal Handle As Long, ByVal Param As Long)
Dim Ch$
Dim Tempo&
Dim reponse&
Ch$ = Space(1024)
Tempo& = Len(Ch$)
reponse& = GetWindowText(Handle, Ch$, Tempo&)
Ch$ = Trim(Replace(Ch$, Chr$(0), ""))
If Ch$ <> "" Then NomsChaine$ = NomsChaine$ & Ch$ & vbCrLf
EnumWindowsProc = 1
End Function
'*************************
Comment procéder en présence de plusieurs instances d'Excel ?
Voici un code qui vous indiquera le nombre d'instances d'Excel. Vous pourrez, le cas échéant, avertir l'utilisateur par MsgBox et lui indiquer ce qu'il doit faire.
Copiez le code ci-dessous dans un module WORD. Ouvrez une ou plusieurs instances d'Excel et faites tourner la macro "NbInstanceXL".
'************************* Public Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) Public Declare Function EnumWindows& Lib "user32" _ (ByVal lpEnumFunc As Long, ByVal lParam As Long)
Public NomsChaine$ '_______________________________________ Public Sub NbInstanceXL() Dim TblHwnd As Variant Dim TblFenetre As Variant Dim reponse& Dim i& Dim cpt% NomsChaine$ = "" reponse& = EnumWindows(AddressOf EnumWindowsProc, 0) TblFenetre = Split(NomsChaine$, vbCrLf) For i& = 1 To UBound(TblFenetre) If Left(TblFenetre(i&), 17) = "Microsoft Excel -" Then cpt% = cpt% + 1 Next i MsgBox "Il y a " & cpt% & " instance(s) d'Excel" End Sub '_______________________________________ '///Fonction de callback /// Public Function EnumWindowsProc&(ByVal Handle As Long, ByVal Param As Long) Dim Ch$ Dim Tempo& Dim reponse& Ch$ = Space(1024) Tempo& = Len(Ch$) reponse& = GetWindowText(Handle, Ch$, Tempo&) Ch$ = Trim(Replace(Ch$, Chr$(0), "")) If Ch$ <> "" Then NomsChaine$ = NomsChaine$ & Ch$ & vbCrLf EnumWindowsProc = 1 End Function '*************************