Appel de fichier source macro excel

Résolu
Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
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. ThauTheme Messages postés 1564 Statut Membre 160
     
    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. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
       
      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. ThauTheme Messages postés 1564 Statut Membre 160
     
    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. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
       
      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
      1. ThauTheme Messages postés 1564 Statut Membre 160 > Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonjour 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
      2. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   > ThauTheme Messages postés 1564 Statut Membre
         
        C'est seulement le cas pour les versions test. Les versions finales seront bien dans des dossiers différents sur un serveur commun.
        0
      3. ThauTheme Messages postés 1564 Statut Membre 160 > Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
         
        Re,

        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
      4. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   > ThauTheme Messages postés 1564 Statut Membre
         
        Ok j'essaie de mettre ça en place cet après-midi.

        Merci bien !
        0
  3. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
     
    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
  4. ThauTheme Messages postés 1564 Statut Membre 160
     
    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. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ThauTheme Messages postés 1564 Statut Membre 160
     
    Re,

    Je ne pourrai regarder ça que plus tard dans la soirée...
    0
    1. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
       
      Pas de problème déjà que tu m'aides je vais pas te presser en plus ;)
      0
  7. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
  8. Wizaar Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
     
    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