Appel de fichier source macro excel

Résolu
Bonjour !

Voila je travaille sur un remplissage automatique de formulaire par les informations d'un autre formulaire. Le formulaire source est un Ordre de Mission et je cherche à récupérer les informations servant à établir l’État de Frais de Mission.

Avec mes quelques connaissances j'ai crée un bouton ActiveX pour faire le rapprochement des deux ayant comme code ce qui suit :

Private Sub cm1_Click()
'Rapprochement entre données de l'ordre de mission et de l'état de frais de mission

'valeurs fixes
Application.ActiveSheet.Range("D8").Value = "=OMtest!$C$9"
Application.ActiveSheet.Range("L8").Value = "=OMtest!$G$9"
Application.ActiveSheet.Range("A11").Value = "=OMtest!$B$12"
Application.ActiveSheet.Range("D13").Value = "=OMtest!$C$15"
Application.ActiveSheet.Range("L13").Value = "=OMtest!$F$15"
Application.ActiveSheet.Range("D15").Value = "=OMtest!$C$18"
Application.ActiveSheet.Range("L15").Value = "=OMtest!$F$18"
Application.ActiveSheet.Range("I70").Value = "=OMtest!$C$29"

'valeurs modifiées
Application.ActiveSheet.Range("L3").Value = "=OMtest!$C$6"
If Application.ActiveSheet.Range("L3").Value = "Présidence Direction" Then
Application.ActiveSheet.Range("L3").Value = "PDS"
ElseIf Application.ActiveSheet.Range("L3").Value = "Relations extérieures et formation continue" Then
Application.ActiveSheet.Range("L3").Value = "DRE"
ElseIf Application.ActiveSheet.Range("L3").Value = "Etudes" Then
Application.ActiveSheet.Range("L3").Value = "DE"
ElseIf Application.ActiveSheet.Range("L3").Value = "Technique" Then
Application.ActiveSheet.Range("L3").Value = "PDS"
Else: Application.ActiveSheet.Range("L3").Value = ""
End If

Application.ActiveSheet.Range("N3").Value = "=OMtest!$F$6"
If Application.ActiveSheet.Range("N3").Value = "Atelier Ludwigsburg Paris" Then
Application.ActiveSheet.Range("N3").Value = "FACAD"
ElseIf Application.ActiveSheet.Range("N3").Value = "Financier" Then
Application.ActiveSheet.Range("N3").Value = "FINAN"
ElseIf Application.ActiveSheet.Range("N3").Value = "Relations extérieures" Then
Application.ActiveSheet.Range("N3").Value = "FAEXT"
ElseIf Application.ActiveSheet.Range("N3").Value = "Echanges" Then
Application.ActiveSheet.Range("N3").Value = "FECHA"
ElseIf Application.ActiveSheet.Range("N3").Value = "Festivals" Then
Application.ActiveSheet.Range("N3").Value = "FFEST"
ElseIf Application.ActiveSheet.Range("N3").Value = "Formation Continue" Then
Application.ActiveSheet.Range("N3").Value = "FCONT"
ElseIf Application.ActiveSheet.Range("N3").Value = "1ère Année" Then
Application.ActiveSheet.Range("N3").Value = "F1A"
ElseIf Application.ActiveSheet.Range("N3").Value = "2ème Année" Then
Application.ActiveSheet.Range("N3").Value = "F2A"
ElseIf Application.ActiveSheet.Range("N3").Value = "3ème Année" Then
Application.ActiveSheet.Range("N3").Value = "F3A"
ElseIf Application.ActiveSheet.Range("N3").Value = "4ème Année" Then
Application.ActiveSheet.Range("N3").Value = "F4A"
ElseIf Application.ActiveSheet.Range("N3").Value = "Commun années" Then
Application.ActiveSheet.Range("N3").Value = "FCOA"
ElseIf Application.ActiveSheet.Range("N3").Value = "Distribution Exploitation" Then
Application.ActiveSheet.Range("N3").Value = "FDIST"
ElseIf Application.ActiveSheet.Range("N3").Value = "Recherche" Then
Application.ActiveSheet.Range("N3").Value = "FRECH"
ElseIf Application.ActiveSheet.Range("N3").Value = "Résidence" Then
Application.ActiveSheet.Range("N3").Value = "FRSD"
ElseIf Application.ActiveSheet.Range("N3").Value = "Série TV" Then
Application.ActiveSheet.Range("N3").Value = "FTV"
ElseIf Application.ActiveSheet.Range("N3").Value = "Technique" Then
Application.ActiveSheet.Range("N3").Value = "FINAN"
Else: Application.ActiveSheet.Range("N3").Value = ""
End If

Application.ActiveSheet.Range("I54").Value = "=OMtest!$C$23"
If Application.ActiveSheet.Range("I54").Value = "Indemnité forfaitaire de repas" Or Application.ActiveSheet.Range("I54").Value = "Facturé directement à La Fémis (2)" Then
Application.ActiveSheet.Range("I54").Value = "La FEMIS"
Else: Application.ActiveSheet.Range("I54").Value = ""
End If

Application.ActiveSheet.Range("I61").Value = "=OMtest!$F$23"
If Application.ActiveSheet.Range("I61").Value = "Indemnité forfaitaire de nuitée" Or Application.ActiveSheet.Range("I61").Value = "Facturé directement à La Fémis (2)" Then
Application.ActiveSheet.Range("I61").Value = "La FEMIS"
Else: Application.ActiveSheet.Range("I61").Value = ""
End If

Application.ActiveSheet.Range("I74").Value = "=OMtest!$F$29"
If Application.ActiveSheet.Range("I74").Value = "Facturé directement à La Fémis" Then
Application.ActiveSheet.Range("I74").Value = "La FEMIS"
Else: Application.ActiveSheet.Range("I74").Value = ""
End If

End Sub

Actuellement j'obtiens bien le résultat que je veux.
Par contre, je dois sélectionner le fichier source dans la fenêtre d'ouverture de fichier pour chaque ligne de code.
Le fichier source étant toujours le même pour chaque ligne, j'aimerais un moyen de ne le sélectionner qu'une seule fois au début et qu'il serve de référence pour toutes les lignes suivantes !

Merci d'avance de votre aide.

8 réponses

  1. Bonjour Wizaar, bonjour le forum,

    Pour éviter toute confusion, je passe par des variables pour nommer classeur source / classeur destination, onglet source et onglet destination.
    Comme dans ton code je ne vois aucune ligne correspondant à l'activation d'un classeur ou d'un onglet, je vais avoir du mal a te proposer un code adapté à ton cas. Mais disons que :

    - le classeur destination contient la macro
    - l'onglet destination soit nommé Feuil1
    - le classeur source soit nommé Classeur Source.xlsx
    - l'onglet source soit nommé OMTest
    (tu adapteras à ton cas...)

    Ça donnerait un code du type :

    Private Sub cm1_Click()
    Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
    Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Dim CS As Workbook 'déclare la variable CS (Classeur Source)
    Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
    
    Set CD = ThisWorkbook 'définit le classeur destination CD
    Set OD = CD.Worksheets("Feuil1") 'définit l'onglet destination (à adapter à ton cas)
    Set CS = Workbooks("Classeur Source.xlsx") 'définit le classeur source CS (nom à adapter à ton cas) - Il faut impérativement que se classeur soit ouvert !
    Set OS = CS.Worksheets("OMTest") 'définit l'onglet source OS
    
    OD.Range("D8").Value = OS.Range("C9").Value 'plus besoin de sélectionner ni le classeur ni l'onglet, il sont spécifiés dans le code
    'autres lignes à adapter...
    
    End Sub

    0
    1. Merci pour la réponse rapide !

      Ce que tu me proposes ressemble à ce que j'ai essayé de faire en premier lieu en me basant sur des infos que j'ai trouvé sur les différents forums.

      Malheureusement ça ne me convient pas.
      Dans ce que tu proposes, le classeur source est défini il me semble.
      Or, dans mon cas, le classeur source est différent pour chaque utilisation.
      A un Etat de Frais de Mission correspond un Ordre de Mission unique.

      Dans la version actuelle de mon code, l'activation du bouton de commande ouvre une fenêtre pour sélectionner le fichier source, ce qui est parfait, j'aimerais seulement pouvoir ne le sélectionner qu'une seule fois et non pour chaque ligne de code.

      Donc le code que tu me propose me conviendrais si et seulement si il serait possible de sélectionner le Classeur Source (ou CS dans ton code) manuellement à l'initialisation de la macro.

      Existe-t'il une commande pour remplacer la ligne :
      Set CS = Workbooks("Classeur Source.xlsx")
      ou le choix serait donné à l'utilisateur de sélectionner le classeur source parmi tous les ordres de mission existants ?

      Merci d'avance !
      0
  2. Re,

    Dans la version actuelle de mon code, l'activation du bouton de commande ouvre une fenêtre pour sélectionner le fichier source, ce qui est parfait, j'aimerais seulement pouvoir ne le sélectionner qu'une seule fois et non pour chaque ligne de code.

    Pourquoi tu ne fournis pas le code intégral ? Si tu as déjà un code d'ouverture de classeur, juste après l'ouverture, il suffit de définir le classeur source avec la ligne de code :

    Set CS = ActiveWorkbook

    Puis tu reprends toutes tes lignes...

    Sinon, pour rajouter le code d'ouverture, il me faudrait au moins le chemin d'accès complet du dossier où se trouvent tous les fichiers source...
    0
    1. Re !

      J'ai bien posté l'intégralité de mon code...
      Je ne sais pas pourquoi ça marche, mais ça marche ^^
      J'imagine qu'excel reconnait automatiquement un chemin incomplet sur la première commande ou quelque chose comme ça.

      Du coup je suis un peu perdu...

      Le chemin d'accès au dossier contenant les classeurs source ressemble à
      C:\Users\Username\Desktop\User\Documents test

      J'attends que ça fonctionne pour le passer sur le serveur commun mais j'imagine qu'il suffira de changer le chemin ensuite par la nouvelle localisation du fichier.
      0
    2. @WizaarBonjour Wizaar, bonjour le forum,

      Si les fichiers source se trouvent dans le même dossier que le fichier destination on n'a pas besoin du chemin d'accès...
      0
    3. @ThauThemeC'est seulement le cas pour les versions test. Les versions finales seront bien dans des dossiers différents sur un serveur commun.
      0
    4. @WizaarRe,

      Le code avec la boîte de dialogue Ouvrir qui permet de sélectionner le fichier source :

      Private Sub cm1_Click()
      Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
      Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
      Dim FD As FileDialog 'déclare la variable FD (FileDialog)
      Dim CA As String 'déclare la varaible CA (Chemin d'accès)
      Dim CS As Workbook 'déclare la variable CS (Classeur Source)
      Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
      
      Set CD = ThisWorkbook 'définit le classeur destination CD
      Set OD = CD.Worksheets("Feuil1") 'définit l'onglet destination (à adapter à ton cas)
      CA = CD.Path 'définit le chemin d'accès CA du classeur destination
      Set FD = Application.FileDialog(msoFileDialogOpen) 'définit la variable FD (Fichier Ouvrir)
      With FD 'prend en compte la variable FD
          .InitialFileName = CA & "\*.xlsx" 'définit le chemin d'accès et les fichiers ciblés par défaut
          .AllowMultiSelect = False 'ne permet la sélection que d'un seul fichier
          If .Show = 0 Then Exit Sub 'si bouton "Annuler", sort de la procédure
      End With 'fin de la prise en compte de la varaible FD
      Set FD = Nothing 'vide la variable de la mémoire
      Set CS = ActiveWorkbook 'définit le classeur source CS
      Set OS = CS.Worksheets("OMTest") 'définit l'onglet source OS
      
      OD.Range("D8").Value = OS.Range("C9").Value 'plus besoin de sélectionner ni le classeur ni l'onglet, il sont spécifiés dans le code
      'autres lignes à adapter...
      End Sub
      0
    5. @ThauThemeOk j'essaie de mettre ça en place cet après-midi.

      Merci bien !
      0
  3. Re-bonjour !

    Pas eu le temps de tester hier.

    Je viens de faire l'essai ce matin !

    Quand j'active la macro, après m'avoir demandé de sélectionner le classeur source, elle plante.

    Le message d'erreur :

    Erreur d’exécution "9" :

    L'indice n'appartient pas à la sélection.

    Et apparemment c'est cette ligne qui coince :
    Set OS = CS.Worksheets("OMtest") 'définit l'onglet source OS

    Pourtant l'onglet en question est correctement nommé...
    J'ai essayé avec la dénomination CS.Worksheets(1) puisque c'est le premier onglet en partant de la gauche et que j'ai lu quelque part qu'on pouvait l'appeler aussi de cette manière.
    Quand je lance la macro avec ce changement, elle ne plante plus, mais je n'ai aucun résultat...

    Des idées ?
    0
    1. Re,

      Oui, si tu es sûr que l'onglet est toujours le premier ton changement est correct. Mais malheureusement, sans les fichiers (le destination et au moins un source), je ne pourrai pas t'aider plus que ça...
      0
      1. L'onglet source est bien toujours le premier, pourtant les informations ne sont pas récupérées. Pourtant avec ma première version "à l'arrache" ça fonctionnait ce qui me laisse perplexe...

        Le classeur destination : https://ufile.io/ec8b4

        Le classeur source : https://ufile.io/c6e41
        0
    2. Re,

      Je ne pourrai regarder ça que plus tard dans la soirée...
      0
      1. Pas de problème déjà que tu m'aides je vais pas te presser en plus ;)
        0
    3. Bonsoir,

      Il y avait en effet une erreur dans mon code qui n'ouvrait pas le classeur source. C'est corrigé, regarde si ça convient. Tu m'as envoyé un fichier source vierge et évidemment la macro récupère des valeurs vides. Pense a pré remplir le fichier source pour récupérer ses données dans la fichier destination...
      Le code corrigé :
      Private Sub cm1_Click()
      'Rapprochement entre données de l'ordre de mission et de l'état de frais de mission
      
      Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
      Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
      Dim FD As FileDialog 'déclare la variable FD (FileDialog)
      Dim CA As String 'déclare la varaible CA (Chemin d'accès)
      Dim CS As Workbook 'déclare la variable CS (Classeur Source)
      Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
      
      Set CD = ThisWorkbook 'définit le classeur destination CD
      Set OD = CD.Worksheets("MISSION") 'définit l'onglet destination
      CA = CD.Path 'définit le chemin d'accès CA du classeur destination
      Set FD = Application.FileDialog(msoFileDialogOpen) 'définit la variable FD (Fichier Ouvrir)
      
      With FD 'prend en compte la variable FD
          .InitialFileName = CA & "\*.xlsx" 'définit le chemin d'accès et les fichiers ciblés par défaut
          .AllowMultiSelect = False 'ne permet la sélection que d'un seul fichier
          If .Show = 0 Then Exit Sub Else .Execute 'si bouton "Annuler", sort de la procédure, sinon ouvre le fichier
      End With 'fin de la prise en compte de la variable FD
      
      Set FD = Nothing 'vide la variable de la mémoire
      Set CS = ActiveWorkbook 'définit le classeur source CS
      Set OS = CS.Worksheets("OMtest") 'définit l'onglet source OS
      
      'valeurs fixes
          OD.Range("D8").Value = OS.Range("C9").Value
          OD.Range("L8").Value = OS.Range("G9").Value
          OD.Range("A11").Value = OS.Range("B12").Value
          OD.Range("D13").Value = OS.Range("C15").Value
          OD.Range("L13").Value = OS.Range("F15").Value
          OD.Range("D15").Value = OS.Range("C18").Value
          OD.Range("L15").Value = OS.Range("F18").Value
          OD.Range("I70").Value = OS.Range("C29").Value
          
      'valeurs modifiées
          OD.Range("L3").Value = OS.Range("C6").Value
              If OD.Range("L3").Value = "Présidence Direction" Then
                  OD.Range("L3").Value = "PDS"
              ElseIf OD.Range("L3").Value = "Relations extérieures et formation continue" Then
                  OD.Range("L3").Value = "DRE"
              ElseIf OD.Range("L3").Value = "Etudes" Then
                  OD.Range("L3").Value = "DE"
              ElseIf OD.Range("L3").Value = "Technique" Then
                  OD.Range("L3").Value = "PDS"
              Else: OD.Range("L3").Value = ""
              End If
              
      
          OD.Range("N3").Value = OS.Range("F6").Value
              If OD.Range("N3").Value = "Atelier Ludwigsburg Paris" Then
                  OD.Range("N3").Value = "FACAD"
              ElseIf OD.Range("N3").Value = "Financier" Then
                  OD.Range("N3").Value = "FINAN"
              ElseIf OD.Range("N3").Value = "Relations extérieures" Then
                  OD.Range("N3").Value = "FAEXT"
              ElseIf OD.Range("N3").Value = "Echanges" Then
                  OD.Range("N3").Value = "FECHA"
              ElseIf OD.Range("N3").Value = "Festivals" Then
                  OD.Range("N3").Value = "FFEST"
              ElseIf OD.Range("N3").Value = "Formation Continue" Then
                  OD.Range("N3").Value = "FCONT"
              ElseIf OD.Range("N3").Value = "1ère Année" Then
                  OD.Range("N3").Value = "F1A"
              ElseIf OD.Range("N3").Value = "2ème Année" Then
                  OD.Range("N3").Value = "F2A"
              ElseIf OD.Range("N3").Value = "3ème Année" Then
                  OD.Range("N3").Value = "F3A"
              ElseIf OD.Range("N3").Value = "4ème Année" Then
                  OD.Range("N3").Value = "F4A"
              ElseIf OD.Range("N3").Value = "Commun années" Then
                  OD.Range("N3").Value = "FCOA"
              ElseIf OD.Range("N3").Value = "Distribution Exploitation" Then
                  OD.Range("N3").Value = "FDIST"
              ElseIf OD.Range("N3").Value = "Recherche" Then
                  OD.Range("N3").Value = "FRECH"
              ElseIf OD.Range("N3").Value = "Résidence" Then
                  OD.Range("N3").Value = "FRSD"
              ElseIf OD.Range("N3").Value = "Série TV" Then
                  OD.Range("N3").Value = "FTV"
              ElseIf OD.Range("N3").Value = "Technique" Then
                  OD.Range("N3").Value = "FINAN"
              Else: OD.Range("N3").Value = ""
              End If
      
          OD.Range("I54").Value = OS.Range("C23").Value
              If OD.Range("I54").Value = "Indemnité forfaitaire de repas" Or OD.Range("I54").Value = "Facturé directement à La Fémis (2)" Then
                  OD.Range("I54").Value = "La FEMIS"
              Else: OD.Range("I54").Value = ""
              End If
              
          OD.Range("I61").Value = OS.Range("F23").Value
              If OD.Range("I61").Value = "Indemnité forfaitaire de nuitée" Or OD.Range("I61").Value = "Facturé directement à La Fémis (2)" Then
                  OD.Range("I61").Value = "La FEMIS"
              Else: OD.Range("I61").Value = ""
              End If
              
          OD.Range("I74").Value = OS.Range("F29").Value
              If OD.Range("I74").Value = "Facturé directement à La Fémis" Then
                  OD.Range("I74").Value = "La FEMIS"
              Else: OD.Range("I74").Value = ""
              End If
              
      End Sub
      

      0
      1. Salut !

        J'ai mis en place le changement ce matin et tout a l'air de rouler !

        Merci beaucoup pour ton aide, c'est une fonction que je réutiliserais ^^

        Je clôture le sujet.

        Encore merci !
        0