VBA activer un fichier Excel présent sur une autre instance

Mag13180 Messages postés 23 Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,
J'ai un soucis lorsque je travaille en réseau :
lorsque j'ai besoin d'activer un fichier Excel (déjà ouvert), cela ne fonctionne pas s'il se trouve sur une autre instance d'Excel.

Pour faire simple je procède à un export d'un logiciel de traitement spécifique à mon activité qui m'extrait sous excel une mini base de données
Dans un fichier Excel différent (fichier A) je dois manipuler cette extraction.
Le soucis c'est que cette extraction se trouve sur une autre instance d'excel (fichier B)

Connaissez vous une méthode svp ?

un bout de mon code actuel :
'ACTIVE BM ET RECHERCHE LE FICHIER DONT LE NOM COMMENCE PAR EXPORT
Dim wb

Dim oWbk As Excel.Workbook

For Each oWbk In Application.Workbooks
If oWbk.Name Like "Export*" Then Exit For
Next oWbk

If oWbk Is Nothing Then
MsgBox "vous n'avez pas procédé à l'extraction via le bureau métier (cf: guide d'utilisation/notice de l'outil) ", vbCritical
Sheets("extraction").Visible = False
Sheets("fiches_clients").Select
Sheets("fiches_clients").Protect

Unload USFWait
Exit Sub
End If

If Not oWbk Is Nothing Then oWbk.Activate
'If Not oWbk Is Nothing Then
wb = ActiveWorkbook.Name

Windows(wb).Activate

à ce stade là je récupère le nom du fichier (car différent à chaque extraction mais qui commence toujours par "export") et je l'active pour copier les infos de ce fichier dans le fichier A etc...

cela ne fonctionne que lorsque le fichier et le fichier se trouvent dans a même instance Excel

Bonne soirée
Magali

http://www.cjoint.com/c/FFrtpqkuzD6

ps: version Excel 2013 domicile et 2010 bureau

1 réponse

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Tu ne peux pas traiter un fichier s'il n'est pas dans la même session.
    Il faut qu'il soit enregistré et tu l'ouvres avec ta macro.
    eric
    0
    1. Mag13180 Messages postés 23 Statut Membre 1
       
      Bonsoir eriiic,
      Il me semble bien que tu m'as souvent donné des coups de mains sur le forum Excel-pratique à mes débuts sur Excel.....

      Je viens péniblement de parvenir à activer le fichier d'une autre instance (en piochant ici et là des infos sur le net ...)
      il me reste à l'adapter à mon "fichier A" et éventuellement à l’alléger en tout cas ça fonctionne

      dis moi ce que tu en pense

      bonne soirée
      Magali


      voici le code, désolée, c'est surement brouillon :



      Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
      Private Declare Function GetWindowTextLength Lib "user32" _
      Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
      Private Declare Function GetWindowText Lib "user32" _
      Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
      ByVal cch As Long) As Long
      Const GW_HWNDFIRST = 0
      Const GW_HWNDNEXT = 2

      Sub LoadTaskList()
      Dim CurrWnd As Long
      Dim Length As Long
      Dim TaskName As String
      Dim Parent As Long
      Dim che

      Dim w
      i = 1

      'récupère le nom du ficher sur la feuille
      Range("G21").FormulaR1C1 = "=FIND(""."",RC[-6])+3"

      Range("G21").FormulaR1C1 = "=MID(RC[-7],1,RC[-1])"


      twnd& = FindWindow("Shell_traywnd", vbNullString)


      'renomme la feuille
      On Error GoTo a
      Sheets("liste").Select
      On Error GoTo 0
      Rows("1:1000").Delete



      CurrWnd = GetWindow(twnd, GW_HWNDFIRST)
      While CurrWnd <> 0
      Length = GetWindowTextLength(CurrWnd)
      TaskName = Space$(Length + 1)
      Length = GetWindowText(CurrWnd, TaskName, Length + 1)
      TaskName = Left$(TaskName, Len(TaskName) - 1)

      'che = TaskName.Path


      If Length > 0 Then
      Cells(i, 1).Value = TaskName
      i = i + 1
      End If
      CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
      DoEvents
      Wend

      Dim list, fichier
      Sheets("liste").Select

      Range("A1").Select

      Range(Selection, Selection.End(xlDown)).Select
      list = Selection.Find(What:="exportphasestransfert*", After:=ActiveCell, LookIn:= _
      xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
      xlNext, MatchCase:=False, SearchFormat:=False).Activate
      Selection.FindNext(After:=ActiveCell).Activate



      fichier = ActiveCell.Value

      ' récupère le nom du fichier dans une variable

      Dim l1
      l1 = ActiveCell.Row

      Cells(l1, 7).Select
      ActiveCell.Formula = "=FIND(""."",a" & l1 & ")+3"
      Cells(l1, 8).Formula = "=mid(a" & l1 & ",1 ,g" & l1 & ")"
      w = Cells(l1, 8)


      AppActivate (w)


      Exit Sub

      a:

      Sheets.Add 'renvoie la liste dans une nouvelle feuille de calcul
      ActiveSheet.Name = "liste"
      Resume Next

      End Sub
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      J'en pense que si ça marche pour ce que tu as a faire c'est bien...

      PS: n'hésite pas à indenter et à utiliser la balise Code (l'icone <>)
      0